Я создал таблицу базы данных по электронной почте. Я буду вставлять все письма, которые нужно отправить моему приложению PHP в эту таблицу.
Другой скрипт PHP будет искать все неотправленные электронные письма и отправляет их.
Я запускаю этот скрипт с помощью cronjobs. К сожалению, cronjobs может работать только максимум один раз в минуту. Поэтому в худшем случае пользователю нужно подождать одну минуту, пока его электронная почта действительно не будет отправлена.
Моя текущая идея обходного пути вызывает сценарий с дополнительным параметром сна и дублирование cronjobs.
Пример:
* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 * * * * * curl emails.php?sleep=10 >/dev/null 2>&1 * * * * * curl emails.php?sleep=20 >/dev/null 2>&1 * * * * * curl emails.php?sleep=30 >/dev/null 2>&1 * * * * * curl emails.php?sleep=40 >/dev/null 2>&1 * * * * * curl emails.php?sleep=50 >/dev/null 2>&1
В приведенном выше примере скрипт запускается каждые 10 секунд. Первая строка скрипта emails.php будет:
sleep($_REQUEST['sleep']);
Для начала я бы рекомендовал использовать версию командной строки PHP вместо использования curl для вызова сценария. Затем вы можете создать PHP-скрипт с разумной продолжительностью жизни, который не ограничивается необходимостью выдавать ответ в течение заданного периода времени.
Таким образом, вы можете просто спать / проверять электронную почту / передачу / сон и т. Д. В PHP-скрипте, а не просто использовать cron.
Кроме того, я бы позаботился о том, чтобы несколько сценариев PHP не работали в таблице базы данных одновременно, либо с помощью подхода pid-файла или базы данных (если данный файл / параметр существует / установлен, выполняется прерывание ) или путем разумного выбора времени выполнения cron и ограничения максимального времени обработки скрипта, проверяя, как долго он работает до начала «проверки на электронные письма» части цикла.
Вот простой сценарий bash, который я написал, который может использоваться с crontab для запуска чаще, чем 1 минута.
вы можете сохранить его как ~ / bin / runEvery.sh, а затем в crontab напишите что-то вроде этого, чтобы запустить otherScript.sh каждые 5 секунд:
*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh
Это сценарий:
#!/bin/bash inputPeriod=$1 runCommand=$2 RUN_TIME=60 error="no" if [ 'x'"$runCommand" != 'x' ] then if [ 'x'$inputPeriod != 'x' ] then loops=$(( $RUN_TIME / $inputPeriod )) if [ $loops -eq 0 ] then loops=1 fi for i in $(eval echo {1..$loops}) do $runCommand sleep $inputPeriod done else error="yes" fi else error="yes" fi if [ $error = "yes" ] then echo "runEvery - runs a command every X seconds for a minute" echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" fi
Это нужно сделать на уровне скрипта.
// cron.php running every 10 seconds // you need to setup this cron run every minute using `crontab` of cPanel etc <?php $expireTime = time() + 60; while (time() < $expireTime) { // my php logic here sleep(10); // sleep for 10 seconds // you may change the sleep time to change frequency }
Если вы делаете это каждые 10 секунд, cron – это не лучший инструмент для работы. Вам нужен сценарий, который работает непрерывно, как показано Ишем.
Вы можете зарегистрировать скрипт как услугу, поставив соответствующий сценарий запуска / остановки в /etc/init.d и включив его.
Или, если у вас есть только учетная запись пользователя, вы можете запустить ее на сеансе экрана. Тогда вы можете даже посмотреть выход для диагностики ошибок.