如何让PHP脚本永远与Cron Job一起运行?

时间:2012-06-21 06:34:09

标签: php

<?php
 while(true){
 //code goes here.....
 }
  ?>

我想创建一个PHP Web服务器,那么如何使用Curl使这个脚本永远运行?

4 个答案:

答案 0 :(得分:23)

不要忘记将最长执行时间设置为无限(0)。

如果您的意图如此,请确保您不要运行多个实例:

ignore_user_abort(true);//if caller closes the connection (if initiating with cURL from another PHP, this allows you to end the calling PHP script without ending this one)
set_time_limit(0);

$hLock=fopen(__FILE__.".lock", "w+");
if(!flock($hLock, LOCK_EX | LOCK_NB))
    die("Already running. Exiting...");

while(true)
{

    //avoid CPU exhaustion, adjust as necessary
    usleep(2000);//0.002 seconds
}

flock($hLock, LOCK_UN);
fclose($hLock);
unlink(__FILE__.".lock");

如果在CLI模式下,只需运行该文件。

如果在网络服务器上的另一个PHP中,你可以启动必须像这样运行的那个(而不是使用cURL,这消除了依赖):

$cx=stream_context_create(
    array(
        "http"=>array(
            "timeout" => 1, //at least PHP 5.2.1
            "ignore_errors" => true
        )
    )
);
@file_get_contents("http://localhost/infinite_loop.php", false, $cx);

或者你可以使用wget从linux cron开始:

`* * * * * wget -O - http://localhost/infinite_loop.php`

或者您可以使用bitsadmin运行包含以下内容的.bat文件从Windows Scheduler启动:

bitsadmin /create infiniteloop
bitsadmin /addfile infiniteloop http://localhost/infinite_loop.php
bitsadmin /resume infiniteloop

答案 1 :(得分:3)

要让php代码永远运行,它应该有ff。:

  • set_time_limit(0); //所以php不会像往常一样终止,如果你要做的事情需要很长的处理时间
  • 保持页面处于活动状态的处理程序[通常通过设置客户端脚本来间隔调用同一页面]请参阅setInterval()setTimeout()

编辑: 但是,由于您将设置一个cron作业,因此您可以远离客户端处理。

编辑: 我的建议是,除非你有一段代码告诉它在一段时间后退出循环,否则不要使用无限循环。请记住,您将使用cron作业调用同一页面,因此没有必要保持循环无限。 [编辑]否则,您将需要@ Tiberiu-IonuţStan建议的锁定系统,因此每次调用cron作业时只能运行一个实例。

答案 2 :(得分:1)

默认情况下,不是因为PHP有​​执行时间限制。 请参阅:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time

您可以通过设置值或在脚本中调用set_time_limit来使其永久运行(http://php.net/manual/en/function.set-time-limit.php)。

但我不建议这样做,因为PHP(由HTTP请求调用)并不是设计为具有无限循环。如果可以,请使用本地脚本,或者间隔请求页面以经常执行任务。

如果您的网站经常被其他人浏览,您可以在每个页面中执行此操作。

(想象一下如果有人多次请求脚本,你将有多个实例运行)

答案 3 :(得分:0)

只有在脚本中设置 set_time_limit(0),才能实现,否则在配置中设置 max_execution_time 后,它将停止执行。< / p>

您正在使用while(true)条件,这将使您的脚本始终运行。