使用CLI每秒运行一次PHP脚本

时间:2009-11-12 23:23:18

标签: php loops time cron command-line-interface

我有一台运行Cent OS的专用服务器,带有Parallel PLESK面板。我需要每秒运行一个PHP脚本来更新我的数据库。这些在时间上是无可替代的方式,它需要每秒更新一次。

我可以使用网址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设置为每分钟。我已经在测试环境中运行了一段时间,并且它运行良好。它真的超级快,我看到CPU和内存使用没有增加。

6 个答案:

答案 0 :(得分:27)

你实际上可以在PHP中完成它。编写一个将运行59秒的程序,每秒执行一次检查,然后终止。将它与一个cron作业相结合,该作业每分钟运行 处理,并且嘿嘿。

一种方法是:

set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    doMyThings();
    sleep(1);
}

您唯一需要注意的是doMyThings()功能的运行时间。即使这只是一小部分,然后超过60次迭代,这可能会导致一些问题。如果您运行PHP&gt; = 5.1(或Windows上的&gt; = 5.3),那么您可以使用time_sleep_until()

$start = microtime(true);
set_time_limit(60);
for ($i = 0; $i < 59; ++$i) {
    doMyThings();
    time_sleep_until($start + $i + 1);
}

答案 1 :(得分:21)

您是否考虑过使用“手表”?

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

只需启动一次即可继续使用。这样它就可以免受PHP崩溃的影响(不是它发生了,但你永远都不知道)。您甚至可以添加此inittab以使其完全防弹。

答案 2 :(得分:2)

为什么不运行一个cron来执行此操作并在php文件循环中进行60次短暂睡眠。这就是我克服这个问题的方式,每分钟运行一次PHP脚本5次。

要设置要作为脚本运行的文件,请在第一行添加PHP的路径,例如perl脚本

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我注意到OP编辑了给出解决方案的答案。这个解决方案在我的盒子上不起作用(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);
}
?>

答案 5 :(得分:0)

您可以在服务器上使用 nohup 命令运行无限循环脚本,即使您从系统注销也可以运行。只有重新启动或物理关闭才能破坏此进程。不要忘记在您的 php 脚本中添加 sleep (1)

nohup php /path/to/you/script.php

现在,如果您在工作时不需要使用控制台,它会将其输出写入您工作目录中的 nohup.out 文件(使用 pwd 命令获取它)。