2013-02-28 2 views
1

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

Сайт находится на сервере UNIX, поэтому задание cron является опцией, но я обеспокоен тем, что выполнение задания cron, похожего на него, приведет к загрузке на сервер.

+0

Могу ли я спросить, какую серверную инфраструктуру вы используете? Я полагаю, вы используете механизм таймера в чем-то другом, кроме PHP? Если вы используете что-то еще, я рекомендую вам прикрепить некоторый код к этому механизму таймера, который также выполняет скрипт отправки почты при прохождении таймера. – L0j1k

+0

Мне неизвестен какой-либо таймер, который я мог бы использовать, за исключением, может быть, javascript, запущенного на странице. Я не хотел использовать javascript, потому что я действительно боялся, что кто-то манипулирует этим и обманывает аукцион. – Budove

+1

Что вы используете, чтобы определить, кто выиграет аукцион? Как вы можете определить (с точностью), кто победит? Я бы очень осторожно использовал надежный механизм таймера на back-end (например, в JavaScript в Node.js или Perl или Python ... или * что-либо, кроме PHP). Я начинаю понимать, как работает ваш таймер, запускается и проверяет файл/базу данных, когда пользователь посещает страницу? Теперь это может показаться трудным и, возможно, ненужным, но по мере роста вашего приложения вы будете очень рады, что создали фоновый таймер в фоновом режиме, который запускает все эти механизмы. – L0j1k

ответ

2

Задача cron работает не чаще одного раза в минуту.

Независимо от того, какую нагрузку он создает на сервере, в действительности зависит от типа сценария, который вы собираетесь запустить. . Кстати, я предполагаю, что вы используете cli для запуска сценария (а не просто делать curl http://mysite.com

Если ваш скрипт занимает больше времени, чем за одну минуту (вы должны следить за этим), просто либо:

  • Увеличение интервала между запусками или,
  • Используйте lock file, чтобы удостовериться, что никакие два экземпляра вашего сценария не может работать одновременно.

    if (($fp = fopen('/tmp/mylockfile', "r+")) === false) { 
        die("Could not open lock file"); 
    } 
    if (!flock($fp, LOCK_EX | LOCK_NB)) { 
        die("Could not obtain lock"); 
    } 
    // run your code here 
    
    // release the lock and close file 
    fclose($fp); 
    

OTOH Если сценарий должен запускаться более одного раза в минуту, вам потребуется совсем другой механизм.

+1

«Вы должны сравнить это», nop! вы должны убедиться, что ваш скрипт останавливается через 59 секунд! – hek2mgl

+0

@ hek2mgl Wat? Вы понимаете, насколько это непрактично, верно? Если не шутить, конечно. –

+0

Нет, это необходимо! Я сделал это. Имею очередь. Остановка после окончания очереди или 50 секунд. Если 50 секунд достигнут -> электронная почта для администратора. ALERT! , это хорошая работа – hek2mgl

1

Использование Cron. Он позволяет вам запускать любую команду не чаще одного раза в минуту: http://clickmojo.com/code/cron-tutorial.html

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

Если вы используете что-то еще (кроме PHP) для запуска механизма таймера аукциона, я рекомендую вам прикрепить некоторый код к этому механизму таймера, который также выполняет скрипт отправки почты, когда таймер заканчивается до нуля и определяет победителя ,

+0

Я с @ L0j1k почему downvote? – hek2mgl

+1

OP сказал: * задание cron - это вариант, но я обеспокоен тем, что выполнение задания cron, похожего на загрузку, добавит нагрузку на сервер *. В случае, если вам интересно, это было не MY downvote. –

+0

Это wasn; t мой голос, но, вероятно, потому, что вы говорите «в любое время, когда вы хотите». Это неверно, максимум через 1 минуту. С аукциона это не удобно. – stUrb

0

Запустите PHP-скрипт как сценарий командной строки. Это не скажется на веб-сервере - просто загрузка на сервер, и вы можете легко запустить его через CRON.

Если добавить #!/usr/bin/php в начало сценария и изменить бит выполнения на файле с chmod +x scriptname.php вы можете напрямую выполнить скрипт без прохождения через PHP

http://php.net/manual/en/features.commandline.php

+0

Ну, с '#!/Usr/bin/php' на самом деле * делает * передают это через PHP, но напрямую к интерпретатору. – L0j1k

+0

Извините, я имел в виду запуск его через 'php scriptname.php' vs' scriptname.php' –

1

Q: Что является лучшим способ запуска PHP-скрипта в определенное время или интервал?
A: Использовать cron

В: Создает ли cronjob большую нагрузку на сервер?
A: Зависит от курса вашего сценария. Но проверка того, должен ли быть закрыт аукцион, закрыть его и отправить два письма, не должно быть сложным. Не забудьте создать какой-то файл блокировки, чтобы убедиться, что , если ваш скрипт работает дольше установленного интервала, он не запускается дважды.

Q: запуск сценария с более короткими интервалами, чем 1 минута
A: Не могу ответить на этот вопрос для вас. Извините :)

0

Несколько вещей, которые вам нужно сделать, это:

  1. магазина что-то в вашей информации аукциона с указанием уже ли вы послали эту электронную почту или еще нет (может быть логическим или дата, когда она была отправлена, которая может быть нулевой). Хотя я должен предположить, что вам нужно что-то сделать, кроме того, отправить это электронное письмо? Как отметить аукцион как закрытый, так что больше торгов может иметь место?

  2. Немного кода, который находит аукционы, на которые необходимо отправить этот адрес электронной почты: например. они закончились и еще не напомнили.

  3. Что-то повторное выполнение бит кода в 2. Вы можете использовать cron. В качестве альтернативы вы можете написать довольно простой демон для unix, который работает постоянно в цикле (подождите не менее нескольких мс или более, сделайте некоторые вещи). Последнее намного больше, но, на мой взгляд, гораздо лучше. См. http://pear.php.net/package/System_Daemon для некоторых полезных инструментов, если вы заинтересованы в этом подходе.

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

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