Запускайте PHP скрипт каждую секунду, используя CLI
У меня есть выделенный сервер под управлением Cent OS с панелью Parallel PLESK. Мне нужно каждую секунду запускать PHP script для обновления моей базы данных. Это не альтернативный способ по времени, его нужно обновлять каждую секунду.
Я могу найти свой script с помощью URL http://www.somesite.com/phpfile.php?key=123
.
Может ли файл выполняться локально каждую секунду? Как phpfile.php
?
Update:
Прошло несколько месяцев с тех пор, как я добавил этот вопрос. В результате я использовал следующий код:
#!/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 настроен каждую минуту. Я работаю над этим некоторое время в тестовой среде, и он отлично работает. Это действительно супер быстро, и я не вижу увеличения использования ЦП и памяти.
Ответы
Ответ 1
Вы могли бы сделать это на PHP. Напишите одну программу, которая будет работать в течение 59 секунд, выполняя ваши проверки каждую секунду, а затем завершается. Объедините это с заданием cron, которое запускает этот процесс каждую минуту и hey presto.
Один из подходов заключается в следующем:
set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
doMyThings();
sleep(1);
}
Единственное, на что вам, вероятно, придется следить, это время работы ваших функций 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);
}
Ответ 2
Вы думали об использовании "watch"?
watch -n 1 /path/to/phpfile.php
Просто запустите его один раз, и он продолжит движение. Таким образом, он невосприимчив к сбою PHP (не то, что это происходит, но вы никогда не знаете). Вы даже можете добавить этот inittab, чтобы сделать его полностью пуленепробиваемым.
Ответ 3
Почему бы не запустить cron для этого и в петле php файла 60 раз, когда короткий сон. Так я преодолел это, чтобы запустить php script 5 раз в минуту.
Чтобы настроить файл, который будет запущен как script, добавьте путь к вашему PHP в первой строке, например, perl script
#!/user/bin/php
<?php
while($i < 60) {
sleep(1);
//do stuff
$i++;
}
?>
Ответ 4
Это простая обновленная версия второго решения 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);
}
Ответ 5
Я заметил, что ОП отредактировал ответ, чтобы дать свое решение. Это решение не работало на моем ящике (путь к PHP неверен, а синтаксис PHP неверен)
Эта версия сработала (сохраните как any.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);
}
?>