2013-02-13 2 views
1

У меня есть сайт в PHP, и пользователи могут планировать сообщение для отправки. Я могу отправить сообщение с командой, подобной этой:PHP запустить скрипт через несколько часов

php sendMsg.php 249 

где номер ID сообщения

Многие люди предложили использовать хрон рабочих мест, но так как я не хочу, чтобы запустить это в интервале хрон не вариант (только один раз - например, через 3 часа). Моя идея заключалась в следующем:

$seconds = $hours*60*60; 
exec('sleep '.$seconds.'; php sendMsg.php 249'); 

Но это не будет работать, потому что он будет блокировать PHP для дальнейшего выполнения. Каков самый простой способ достичь этого?

+0

вы уверенны, что он блокирует полный PHP? так как каждый исполнитель php cli должен привести к собственному потоку? – Dukeatcoding

+0

Почему вы кладете сон в «exec»? –

+0

КПП. какое сообщение мы говорим о – Dukeatcoding

ответ

-1

Игнорировать предложения хрон, если вы хотите, чтобы просто ждать период времени, то используйте at планировщик:

$hours = 2; 
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours); 
exec($command); 
1

Поместите расписание в базу данных. Запускайте cronjob каждую минуту или около того, проверьте базу данных, если сообщение должно быть отправлено в течение этой минуты и отправить его.

0

Есть ли причина, по которой вы не хотите использовать работу cron? Это был бы самый простой и эффективный способ отправки сообщений.

+0

это не ответ; вы должны прокомментировать вопрос ... –

+0

Я не согласен. В ответе четко указано, что задание cron будет самым простым и эффективным способом отправки сообщений. – premisoft

+0

Я имею в виду: вы просите разъяснение автору о том, почему он отказывается от использования задания cron. Использование задания cron не является новым решением для автора, потому что он прямо говорит, что не хочет его использовать, и мы не знаем, есть ли веские причины. Когда он расскажет нам свои причины, вы можете обсудить это ... –

0

Я думаю, что cronjob IST еще правильный путь

  1. Создайте таблицу, где быть отправки сообщения сохраняются с меткой времени, когда будет посылать и флаг для isSend
  2. Создать cronjob - запуск PHP Skript каждую 1 минуту, которая отправляет сообщения с временной меткой < текущего временем и isSend = ложь
1

вы сказали, что вы не хотите использовать хроны работу, потому что вы хотите, только сообщение, отправленное один раз, но это неверно понимает способ t для задания такого типа будет написано задание cron.

Рассмотрите ситуацию, когда у вас много пользователей, создающих много сообщений для отправки в различные заданные моменты времени.

Вы не хотите, чтобы на каждом из этих сообщений на вашем сервере работала PHP-программа; это было бы расточительно для ресурсов сервера, даже если бы они были всего лишь sleep() ing на время.

Вместо этого можно использовать задание cron для запуска недолгосрочной программы PHP раз в минуту (или любой другой интервал подходит вам).

Ваша программа создания сообщений не будет записана для отправки сообщения; вместо этого он будет вставлять его в базу данных вместе со временем, которое нужно отправить.

Между тем, программа cronjob PHP каждую минуту будет проверять эту базу данных, чтобы узнать, есть ли какие-либо сообщения, которые должны отправляться, но еще не отправлены. Затем он отправит эти сообщения и пометит их как «отправленные» в БД.

Это стандартный способ написать такое, поэтому неудивительно, что люди рекомендуют его вам.

Выполнение этого способа означает, что у вас никогда не будет программы, работающей на вашей системе, дольше, чем необходимо. Обе программы PHP быстро выполняют свою работу и выходят, а это означает, что их никто не ждет.

Это также делает его более надежным. Представьте, должен ли ваш сервер быть перезагружен.Если бы у вас была куча PHP-программ, работающих в течение нескольких часов, ожидая их момента, чтобы отправить свое сообщение, все они были бы потеряны. С другой стороны, если они сохранили свое сообщение в БД, задание cron найдет их и отправит их правильно после перезапуска сервера.

Смежные вопросы