我有一台运行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和内存使用没有增加。
答案 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
命令获取它)。