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

问题描述 投票:13回答:5

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

php loops time cron command-line-interface
5个回答
27
投票

你实际上可以用PHP来做。编写一个将运行59秒的程序,每秒执行一次检查,然后终止。将它与一个cron作业结合起来,每分钟运行一次这个过程,然后嘿嘿。

一种方法是:

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

您唯一需要注意的是doMyThings()功能的运行时间。即使这只是一小部分,然后超过60次迭代,这可能会导致一些问题。如果您运行PHP> = 5.1(或Windows上的> = 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);
}

21
投票

你有没有考虑过使用“手表”?

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

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


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

2
投票

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

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

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

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);
}
?>
© www.soinside.com 2019 - 2024. All rights reserved.