使用 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
Axios 使用 vuejs cli 获取 php 文件不起作用
在 PhpStorm 中调试 CLI PHP 脚本,无法建立与 Xdebug 2.6.0 的连接