php永远不会结束循环

时间:2014-09-05 03:03:56

标签: php loops

我是php的新手,感谢您的时间:)

我需要一个功能,它可以通过它自己在php中输出自己的帮助。因为我已经得到了以下代码,这对我很有用但因为它是一个永无止境的循环它会导致我的服务器出现任何问题或脚本,如果是这样,给我一些建议或替代方案。感谢。

$interval=60; //minutes
set_time_limit(0);

while (1){
    $now=time();
    #do the routine job, trigger a php function and what not.
    sleep($interval*60-(time()-$now));
}

4 个答案:

答案 0 :(得分:6)

我们在实时系统环境中使用无限循环基本上等待传入的SMS然后处理它。我们发现以这种方式这样做会使服务器资源密集,并且不得不重新启动服务器以释放内存。

我们遇到的另一个问题是,当您在浏览器中执行带有无限循环的脚本时,即使您点击停止按钮,它也将继续运行,除非您重新启动Apache。

    while (1){ //infinite loop
    // write code to insert text to a file
    // The file size will still continue to grow 
    //even when you click 'stop' in your browser.
    }

解决方案是在命令行上将PHP脚本作为deamon运行。以下是:

nohup php myscript.php &

&将您的流程置于后台。

我们不仅发现此方法的内存密集程度较低,而且您还可以通过运行以下命令在不重新启动apache的情况下将其终止:

kill processid

编辑:正如Dagon指出的那样,这并不是真正运行PHP作为守护进程的真正方式。但是使用nohup命令可以被视为穷人以守护进程身份运行进程的方式。

答案 1 :(得分:1)

您可以使用time_sleep_until()功能。它将返回TRUE或FALSE

$interval=60; //minutes
  set_time_limit( 0 );
  $sleep = $interval*60-(time());

  while ( 1 ){
     if(time() != $sleep) {
       // the looping will pause on the specific time it was set to sleep
       // it will loop again once it finish sleeping.
       time_sleep_until($sleep); 
     }
     #do the routine job, trigger a php function and what not.
   }

答案 2 :(得分:1)

有许多方法可以在php中创建一个守护进程,并且已经存在了很长时间。

在后台运行一些东西并不好。例如,如果它试图打印某些内容并且控制台已关闭,程序将会死亡。

我在linux上使用的一种方法是php-cli脚本中的pcntl_fork(),它基本上将你的脚本分成两个PID。让父进程自行终止,并让子进程再次自行处理。再次让父进程自杀。儿童过程现在将完全离婚,并且可以愉快地在后台做任何你想做的事情。

$i = 0;
do{
    $pid = pcntl_fork();
    if( $pid == -1 ){
        die( "Could not fork, exiting.\n" );
    }else if ( $pid != 0 ){
        // We are the parent
        die( "Level $i forking worked, exiting.\n" );
    }else{
        // We are the child.
        ++$i;
    }
}while( $i < 2 );

// This is the daemon child, do your thing here.

不幸的是,如果崩溃或服务器重新启动,此模型无法重新启动。 (这可以通过创造力解决,但......)

为了获得重生的稳健性,请尝试使用Upstart脚本(如果您使用的是Ubuntu。)Here is a tutorial - 但我还没有尝试过这种方法。

答案 3 :(得分:0)

while(1)表示它是无限循环。如果你想打破它,你应该按条件使用break。 例如,

while (1){ //infinite loop
    $now=time();
    #do the routine job, trigger a php function and what no.
    sleep($interval*60-(time()-$now));
    if(condition) break; //it will break when condition is true
}