Запускать скрипт PHP каждую секунду, используя CLI - PullRequest
13 голосов
/ 13 ноября 2009

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

Ответы [ 5 ]

27 голосов
/ 13 ноября 2009

Вы могли бы сделать это на PHP. Напишите одну программу, которая будет работать в течение 59 секунд, проверяя каждую секунду, а затем завершается. Объедините это с заданием cron, которое запускает , который обрабатывает каждую минуту, и эй 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);
}
21 голосов
/ 13 января 2012

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

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

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

2 голосов
/ 29 октября 2014

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

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

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

#!/user/bin/php
<?php
    while($i < 60) {
      sleep(1);
      //do stuff
      $i++;
    }
?>
1 голос
/ 27 октября 2010

Я заметил, что ОП отредактировал ответ, чтобы дать свое решение. Это решение не сработало на моем компьютере (неверный путь к 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);
}
?>
...