以非阻塞模式从cronjob执行PHP脚本

时间:2012-12-14 16:34:28

标签: php cron call nonblocking

我在使用cronjob的共享服务器上运行一个非常慢的PHP脚本。 (该脚本会执行一些HTTP请求,这些请求会不时地暂停其在服务器上的执行...它会在~15-20秒内完成执行。)

问题是cronjob不时终止,共享服务器的帮助台告诉我它不应该连续运行超过5秒。

所以我认为(在进行严肃的优化任务之前)执行脚本并在脚本继续运行时立即返回。直到现在我想到了两种方式:

  1. Cronjob不会等待PHP脚本完成其工作。
  2. Cronjob将执行一个虚拟PHP脚本,该脚本将调用主PHP脚本并立即返回,而无需等待第二个脚本返回。
  3. 我已经在网上看过这两个选项,特别是在这个网站上,并没有找到真正有用的东西:如果第一个脚本立即完成,multi_curl什么都不做......

    提前致谢。


    使用可能的解决方案进行编辑我刚刚提出:

    header("Content-Length: 0");
    header("Connection: close");
    flush();
    
    $mainUrl = 'mySecondScript.php';
    
    $active= null;
    $mch = curl_multi_init();  
    $ch1 = curl_init($mainUrl);
    curl_setopt($ch1, CURLOPT_HEADER, 0);
    
    curl_multi_add_handle($mch, $ch1);  
    $resultCurl = curl_multi_exec($mch, $active);  
    
    do {
    $resultCurl = curl_multi_exec($mch, $active);
    } while ($resultCurl == CURLM_CALL_MULTI_PERFORM);
    

    它可能类似于您可能熟悉的代码或网络上的任何其他代码 - 但如果我使用它,就像其他人为我写的一样,它就不会起作用 - 只有这样!

1 个答案:

答案 0 :(得分:1)

如果您的主机上运行的用户PHP具有执行权限,您可以使用shell_exec和&使它运行后台进程,在PHP文件中如下所示:shell_exec('/path/to/php /path/to/file >/dev/null 2>&1 &')