У меня есть выделенный сервер под управлением Cent OS с панелью Parallel PLESK. Мне нужно каждую секунду запускать PHP-скрипт для обновления моей базы данных. Это не альтернативный путь по времени, его нужно обновлять каждую секунду.
Я могу найти свой скрипт, используя URL http://www.mysite.com/phpfile.php?key=123
.
Может ли файл выполняться локально каждую секунду? Как phpfile.php
?
Обновить:
Прошло несколько месяцев с тех пор, как я добавил этот вопрос. Я закончил тем, что использовал следующий код:
#!/user/bin/php <?php $start = microtime(true); set_time_limit(60); for ($i = 0; $i < 59; ++$i) { doMyThings(); time_sleep_until($start + $i + 1); } ?>
Моя cronjob настроена каждую минуту. Я работаю над этим некоторое время в тестовой среде, и он отлично работает. Это действительно супер быстро, и я не вижу увеличения использования процессора и памяти.
Вы могли бы сделать это на PHP. Напишите одну программу, которая будет работать в течение 59 секунд, выполняя ваши проверки каждую секунду, а затем завершается. Объедините это с заданием cron, которое запускает этот процесс каждую минуту и hey presto.
Один из подходов заключается в следующем:
set_time_limit(60); for ($i = 0; $i < 59; ++$i) { doMyThings(); sleep(1); }
Единственное, что вам, вероятно, придется doMyThings()
время работы ваших doMyThings()
. Даже если это доля секунды, то более 60 итераций, которые могут свести к минимуму некоторые проблемы. Если вы используете PHP> = 5.1 (или> = 5.3 для Windows), вы можете использовать time_sleep_until()
$start = microtime(true); set_time_limit(60); for ($i = 0; $i < 59; ++$i) { doMyThings(); time_sleep_until($start + $i + 1); }
Вы думали об использовании «часов»?
watch -n 1 /path/to/phpfile.php
Просто запустите его один раз, и он продолжит движение. Таким образом, он невосприимчив к сбою PHP (не то, что это происходит, но вы никогда не знаете). Вы даже можете добавить этот inittab, чтобы сделать его полностью пуленепробиваемым.
Это простая обновленная версия второго решения nickf
позволяющая указать желаемый интервал в секундах между каждыми исполнениями во время выполнения.
$duration = 60; // Duration of the loop in seconds $sleep = 5; // Sleep beetween each execution (with stuff execution) for ($i = 0; $i < floor($duration / $sleep); ++$i) { $start = microtime(true); // Do you stuff here time_sleep_until($start + $sleep); }
Почему бы не запустить cron, чтобы сделать это, и в петле php-файла 60 раз, где короткий сон. Так я преодолел это, чтобы запустить php-скрипт 5 раз в минуту.
Чтобы настроить файл для запуска в качестве сценария, добавьте путь к вашему PHP в первой строке, такой как скрипт perl
#!/user/bin/php <?php while($i < 60) { sleep(1); //do stuff $i++; } ?>
Я заметил, что ОП отредактировал ответ, чтобы дать свое решение. Это решение не работало в моей коробке (путь к PHP неверен, а синтаксис PHP неверен)
Эта версия сработала (сохраните как whatever.sh и chmod + X whatever.sh, чтобы она могла выполняться)
#!/usr/bin/php <?php $start = microtime(true); set_time_limit(60); for ($i = 0; $i < 59; ++$i) { echo $i; time_sleep_until($start + $i + 1); } ?>