Запускать скрипт PHP каждую секунду, используя CLI

У меня есть выделенный сервер с ОС Cent с панелью Parallel PLESK. Мне нужно запускать скрипт PHP каждую секунду, чтобы обновить свою базу данных. Это не альтернативный способ по времени, его нужно обновлять каждую секунду.

Я могу найти свой скрипт, используя URL http://www.somesite.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 настроен на каждую минуту. Я запускал это в течение некоторого времени в тестовой среде, и он отлично работал. Это действительно супер быстро, и я не вижу увеличения ни процессора, ни использования памяти.

6 ответов

Решение

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

Один из подходов заключается в следующем:

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);
}

Вы думали об использовании "часы"?

watch -n 1 /path/to/phpfile.php

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

Почему бы не запустить cron, чтобы сделать это, и в цикле php-файла 60 раз, что короткий сон. Таким образом я преодолел это, чтобы запускать php-скрипт 5 раз в минуту.

Чтобы настроить ваш файл для запуска в качестве скрипта, добавьте путь к вашему PHP в первой строке, например, скрипт perl

#!/user/bin/php
<?php
    while($i < 60) {
      sleep(1);
      //do stuff
      $i++;
    }
?>

Это простая обновленная версия 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);
}

Я заметил, что ОП отредактировал ответ, чтобы дать свое решение. Это решение не сработало на моем компьютере (неверный путь к PHP и неправильный синтаксис PHP)

Эта версия работала (сохраните как what.sh и chmod +X what.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);
}
?>

Вы можете запустить свой сценарий бесконечного цикла с помощью nohupкоманда на вашем сервере, которая может работать даже после выхода из системы. Только перезапуск или физическое завершение работы могут разрушить этот процесс. Не забудьте добавить sleep (1) в вашем php скрипте.

      nohup /usr/bin/php /path/to/you/script.php
Другие вопросы по тегам