16

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

4

6 回答 6

31

你实际上可以在 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);
}
于 2009-11-12T23:27:27.417 回答
24

Have you thought about using "watch"?

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

Just start it once and it will keep going. This way it is immune to PHP crashing (not that it happens, but you never know). You can even add this inittab to make it completely bullet-proof.

于 2012-01-13T08:38:14.663 回答
3

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

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

#!/user/bin/php
<?php
    while($i < 60) {
      sleep(1);
      //do stuff
      $i++;
    }
?>
于 2009-11-12T23:26:13.737 回答
2

This is simple upgraded version of nickf second solution witch allow to specify the desired interval in seconds beetween each executions in execution time.

$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);
}
于 2014-10-29T15:57:22.507 回答
1

I noticed that the OP edited the answer to give his solution. This solution did not work on my box (the path to PHP is incorrect and the PHP syntax is not correct)

This version worked (save as whatever.sh and chmod +X whatever.sh so it can execute)

#!/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);
}
?>
于 2010-10-27T00:15:21.620 回答
0

You can run your infinite loop script with nohup command on your server which can work even you logout from system. Only restart or physically shutdown can destroy this process. Don't forget to add sleep (1) in your php script.

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

Now in case you don't need to use the console while it's working, it'll write its output to nohup.out file in your working directory (use the pwd command to get it).

于 2021-07-12T21:14:04.353 回答