php定时计划任务与fsockopen持续进程实例

Web服务器执行一个PHP脚本,有时耗时很长才能返回执行结果,后面的脚本需要等待很长一段时间才能继续执行。
如果想实现只简单触发耗时脚本的执行而不等待执行结果就直接执行下一步操作,可以通过fscokopen函数来实现。


PHP支持socket编程,fscokopen函数返回一个到远程主机连接的句柄,可以像使用fopen返回的句柄一样,对它进行 fwrite、fgets、fread等操作。
使用fsockopen连接到本地服务器,触发脚本执行,然后立即返回,不等待脚本执行完成,即可实现异步 执行PHP的效果。


例子:




复制代码 代码如下:



<? 


function triggerRequest($url, $post_data = array(), $cookie = array()){ 


  $method = “GET”;  //通过POST或者GET传递一些参数给要触发的脚本 


  $url_array = parse_url($url); //获取URL信息 


  $port = isset($url_array[‘port’])? $url_array[‘port’] : 80;   


  $fp = fsockopen($url_array[‘host’], $port, $errno, $errstr, 30); 


  if (!$fp) { 


    return FALSE; 


  } 


  $getPath = $url_array[‘path’] .”?”. $url_array[‘query’]; 


  if(!empty($post_data)){ 


    $method = “POST”; 


  } 


  $header = $method . ” ” . $getPath; 


  $header .= ” HTTP/1.1/r/n”; 


  $header .= “Host: “. $url_array[‘host’] . “/r/n “; //HTTP 1.1 Host域不能省略 


  /*以下头信息域可以省略


  $header .= “User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 /r/n”;


  $header .= “Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 /r/n”;


  $header .= “Accept-Language: en-us,en;q=0.5 “;


  $header .= “Accept-Encoding: gzip,deflate/r/n”;


   */ 


  $header .= “Connection:Close/r/n”; 


  if(!empty($cookie)){ 


    $_cookie = strval(NULL); 


    foreach($cookie as $k => $v){ 


$_cookie .= $k.”=”.$v.”; “; 


    } 


    $cookie_str =  “Cookie: ” . base64_encode($_cookie) .” /r/n”; //传递Cookie 


    $header .= $cookie_str; 


  } 


  if(!empty($post_data)){ 


    $_post = strval(NULL); 


    foreach($post_data as $k => $v){ 


$_post .= $k.”=”.$v.”&”; 


    } 


    $post_str  = “Content-Type: application/x-www-form-urlencoded/r/n”;  


    $post_str .= “Content-Length: “. strlen($_post) .” /r/n”; //POST数据的长度 


    $post_str .= $_post.”/r/n/r/n “; //传递POST数据 


    $header .= $post_str; 


  } 


  fwrite($fp, $header); 


  //echo fread($fp, 1024); //服务器返回 


  fclose($fp); 


  return true; 


}  




这样就可以通过fsockopen()函数来触发一个PHP脚本的执行,然后函数就会返回。 接着执行下一步操作了。
现在存在一个问题:当客户端断开连接后,也就是triggerRequest发送请求后,立即关闭了连接,那么可能会引起服务器端正在执行的脚本退出


在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:


* 0