2014-10-08 111 views
3

我在PHP中有一个脚本,它使用Curl逐个打击一长串URL并在最后将响应写入文件,我希望从列表中上传列表一个浏览器,并在后台执行其余的处理(而不会让用户等待响应)。我已经尝试了以下解决方案 -在Windows机器上长时间运行PHP的后台进程

$command = "C:\wamp\bin\php\php5.5.12\php.exe ../background_process/subscribe_bg.php ".$file_temp_path; 
    shell_exec(sprintf('%s > /dev/null 2>/dev/null &', $command)); 

这会成功运行脚本,但会使浏览器等待。 (这可能会在Linux机器上的后台运行。)

$command = "C:\wamp\bin\php\php5.5.12\php.exe ../background_process/subscribe_bg.php ".$file_temp_path; 

    execInBackground($command); 

    function execInBackground($cmd) { 
     if (substr(php_uname(), 0, 7) == "Windows"){ 
      pclose(popen("start /B ". $cmd, "r")); 
     } 
     else { 
      exec($cmd . " > /dev/null &"); 
     } 
    } 

我发现这个解决方案的Windows机器,但对于me.The脚本不起作用根本不会执行。

请在Windows机器上使用PHP在后台建议运行一个很长的过程(不是很长〜30-40分钟)的最佳实践。

+0

谢谢你,sainiankit。这行:pclose(popen(“start/B”。$ cmd,“r”));为我工作。我在Windows 7上运行PHP 5.3。 – kdanylo 2015-09-13 13:04:35

+0

'脚本根本不执行。' - 实际上,只要父进程(http请求)执行就会死掉。一个[后台工作实施](https://www.google.com/search?q=php+background+job+queue&oq=php+background+job+queue)(或在捏[forking](http:// php.net/manual/en/function.pcntl-fork.php))太宽泛,无法在Stackoverflow上描述 - 但这就是你要求的。 – AD7six 2015-09-13 13:14:57

回答

2

这完全Works的Windows机器上,与写入$ response_file_path脚本的所有输出 -

$command = $PHP_DIR." ../background_process/subscribe_bg.php -p=".$file_path_arg." >../sublogs/responses/".$file_response_path." 2>../sublogs/error_logs/err.txt"; 

execInBackground($command) 

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
     return 1; 
    } 
    else { 
     return 0; 
     //Or the code for linux machine. 
    } 
} 
+0

正是我的意思。它之前没有工作,因为你的初始命令不是将输出重定向到一个文件)))谢谢。 – kdanylo 2015-09-16 01:55:37

+0

哦,是的!确切地说,这使得浏览器等待该过程完成。 – sainiankit 2015-09-16 05:17:52

0

我认为你应该将你的后台进程的输出重定向到另一个文件。既然你没有重定向它,PHP正在等待它。添加'>'重定向到你的命令:

$command = "C:\wamp\bin\php\php5.5.12\php.exe ../background_process/subscribe_bg.php ".$file_temp_path . " > out.log "; 

祝你好运! Danylo

相关问题