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

Posted

技术标签:

【中文标题】使用 CLI 每秒运行一个 PHP 脚本【英文标题】:Run a PHP script every second using CLI 【发布时间】:2010-12-16 02:46:39 【问题描述】:

我有一台运行 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 和内存使用量都没有增加。

【问题讨论】:

我想我会问 - 你在做什么需要每秒完成?这似乎会给 mysql 服务器带来难以置信的压力。 嗨,我要经营一个拍卖网站。在这个网站上,您可以进行自动出价,这些都需要在时间结束之前完成。随着人们的出价,结束时间会延长一段时间,因此拍卖不必在特定时间结束。 @Saif,编辑您的问题以撤消拼写更正不是很有帮助... 【参考方案1】:

您实际上可以在 PHP 中做到这一点。编写一个运行 59 秒的程序,每秒进行一次检查,然后终止。将它与每分钟运行 that 进程的 cron 作业结合起来,嘿,presto。

一种方法是这样的:

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

【讨论】:

您好,感谢您的快速回复。我在想同样的事情,但是这种方法不会使用更多的 cpu 功率和内存使用量。而且我不知道如何更改我的域的默认 php 设置。我认为它的执行时间有限。 set_time_limit 会改变执行时间,根据我的经验,通常不会被主机阻止。 你能帮我每分钟设置一次这个 Cronjob。我是在 PLESK 还是其他地方做这个。 webhostingresourcekit.com/flash/plesk-8-linux/… 这个答案很有帮助,尤其是第二部分。对于那些想知道为什么有人想要如此频繁地运行 cron 的人;考虑我的情况,我需要通过 api 每 2 秒轮询一次交易市场数据。这个答案的后半部分特别有用,因为如果远程服务器繁忙,有时发出 api 请求的 php 脚本会运行超过 2 秒。【参考方案2】:

你有没有想过使用“手表”?

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

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

【讨论】:

我实际上更喜欢这个解决方案,而不是接受一个和其他具有相同想法的解决方案。 嗨米兰,我已经尝试在谷歌上搜索如何使用 watch -n 1 但没有显示结果。如果您能提供一些指点,我会很高兴谢谢 你有关于这个命令的更多信息吗?你在哪里发行? 此链接可能会有所帮助 - tuxtweaks.com/2013/12/linux-watch-command【参考方案3】:

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

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

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

【讨论】:

这种方法不会消耗更多的cpu功率或内存 将文件作为脚本运行是什么意思? 不,睡眠几乎肯定会比每秒重新加载 PHP 解释器使用更少的 CPU。 请注意,这可能加起来超过 60 秒,因为您的脚本也会占用一些时间。这将导致下一个 cron 作业与之前的执行重叠。【参考方案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】:

我注意到 OP 编辑​​了答案以给出他的解决方案。这个解决方案在我的盒子上不起作用(PHP的路径不正确,PHP语法不正确)

这个版本有效(保存为whatever.sh和chmod +Xwhatever.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);

?>

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

以上是关于使用 CLI 每秒运行一个 PHP 脚本的主要内容,如果未能解决你的问题,请参考以下文章

PHP CLI模式开发

Axios 使用 vuejs cli 获取 php 文件不起作用

php.ini 在 php-cli 中重新加载

在 PhpStorm 中调试 CLI PHP 脚本,无法建立与 Xdebug 2.6.0 的连接

PHP“mail()”函数从 php5 cli 发送邮件,但在浏览器运行脚本时不发送

PHP的CLI命令行运行模式浅析