新浦京81707con > 软件下载 > fsockopen异步处理实例程序,php定时计划任务与f

原标题:fsockopen异步处理实例程序,php定时计划任务与f

浏览次数:161 时间:2019-08-14

例子:

那样就足以由此fsockopen()函数来触发二个PHP脚本的实行,然后函数就能够再次回到。 接着试行下一步操作了。
前几天设有三个难点:当客户端断开连接后,也正是triggerRequest发送央求后,马上关闭了延续,那么也许会引起服务器纠正在实践的台本退出。
在 PHP 内部,系统一保险证着连日来境况,其情景有两种或者的景色: * 0 – NORMAL(正常)
* 1 – ABORTED(分外退出)
* 2 – TIMEOUT(超时)
当 PHP 脚本正常地运作 NORMAL 状态时,连接为使得。当客户端中断连接时,ABORTED 状态的标记将会被展开。远程客户端连接的中止平常是由用户点击 STOP 开关导致的。当连接时间超越 PHP 的时间限制(参阅 set_time_limit() 函数)时,TIMEOUT 状态的符号将被张开。

?>

<?php 
  ignore_user_abort(TRUE); //假设客户端断开连接,不会孳生脚本abort 
  set_time_limit(0); //撤废脚本推行延时上限 
或使用:
<?php 
  register_shutdown_function(callback fuction[, parameters]); //注册脚本退出时执行的函数

复制代码 代码如下:

<?php

  $header .= "Connection:Closern"; 
  if(!empty($cookie)){ 
    $_cookie = strval(NULL); 
    foreach($cookie as $k => $v){ 
$_cookie .= $k."=".$v."; "; 
    } 
    $cookie_str =  "Cookie: " . base64_encode($_cookie) ." rn"; //传递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-urlencodedrn";  
    $post_str .= "Content-Length: ". strlen($_post) ." rn"; //POST数据的长短 
    $post_str .= $_post."rnrn "; //传递POST数据 
    $header .= $post_str; 
  } 
  fwrite($fp, $header); 
  //echo fread($fp, 1024); //服务器重返 
  fclose($fp); 
  return true; 
}  

<?
    ignore_user_abort(TRUE);//借使客户端断开连接,不会引起脚本abort
   set_time_limit(0);//撤除脚本实施延时上限
  或使用:
<?
    register_shutdown_function(callback fuction[, parameters]);//注册脚本退出时实施的函数

<?php

您或然感兴趣的篇章:

  • php中fsockopen用法实例
  • php使用fsockopen函数发送post,get央求获取网页内容的艺术
  • PHP的fsockopen、pfsockopen函数被主机商禁止使用的化解办法
  • php fsockopen化解办法 php达成二十八线程
  • 浅析虚构主机服务器php fsockopen函数被剥夺的化解办法
  • php fsockopen伪造post与get方法的详解
  • 依照php socket(fsockopen)的运用实例分析
  • php fsockopen中二十多线程难点的解决办法[翻译]
  • 公布叁个用PHP fsockopen写的HTTP下载的类
  • php源码 fsockopen获取网页内容实例详解

<?
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.1rn";
        $header .= "Host: ". $url_array['host'] . "rn "; //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 rn";
        $header .= "Accept: text/xml,application/xml,application/xhtml xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 rn";
        $header .= "Accept-Language: en-us,en;q=0.5 ";
        $header .= "Accept-Encoding: gzip,deflatern";
         */
        $header .= "Connection:Closern";
        if(!empty($cookie)){
                $_cookie = strval(NULL);
                foreach($cookie as $k => $v){
                        $_cookie .= $k."=".$v."; ";
                }
                $cookie_str =  "Cookie: " . base64_encode($_cookie) ." rn"; //传递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-urlencodedrn";
                $post_str .= "Content-Length: ". strlen($_post) ." rn"; //POST数据的尺寸
                $post_str .= $_post."rnrn "; //传递POST数据
                $header .= $post_str;
        }
        fwrite($fp, $header);
        //echo fread($fp, 1024); //服务器重返
        fclose($fp);
        return true;
}  

例子

复制代码 代码如下:

亟待稳重的一点是 ABORTED 和 TIMEOUT 状态能够而且有效。那在报告 PHP 忽略用户的脱离操作时是唯恐的。PHP 将依然注意用户已经搁浅了一而再但脚本仍旧在运作的情状。倘诺到了运营的岁月限制,脚本将被剥离,设置过的闭馆触发函数也将被推行。在那儿会意识函数 connection_status() 返回 3。
故此还在要接触的本子中指明:

 代码如下

* 0 – NORMAL(正常)
* 1 – ABORTED(非凡退出)
* 2 – TIMEOUT(超时)

Web服务器实践二个PHP脚本,不时耗费时间不短本事再次回到实行结果,前边的台本须要等待相当长一段时间才具继续施行。如若想完成只轻易触发耗费时间剧本的试行而不等待施行结果就直接实施下一步操作,能够经过fscokopen函数来贯彻。
PHP帮助socket编制程序,fscokopen函数再次回到二个到长途主机连接的句柄,能够像使用fopen再次来到的句柄一样,对它实行fwrite、fgets、fread等操作。使用fsockopen连接到本地服务器,触发脚本实施,然后立时赶回,不等待脚本推行到位,即可兑现异步实行PHP的职能。
示范代码如下:

  • 1;
            if ($flags & 2) $headerlen = 2;
            $unpacked = @gzinflate(substr($data, $headerlen));
            if ($unpacked === FALSE) $unpacked = $data;
            return $unpacked;
        }//gzdecode end
      
        //央求函数,只诉求,不回去
        public function Request($url, $cookie=array(), $post=array(), $timeout=3){
            $this->url        = $url;
            $this->cookie    = $cookie;
            $this->post        = $post;
            $this->timeout    = $timeout;
          
            if(!$this->analyzeUrl()){
                return $this->result;
            }
            $this->assHeader();
          
            stream_set_blocking($this->fop, 0);//非阻塞,无须等待
            fwrite($this->fop, $this->header);
            fclose($this->fop);
            return true;
        }//Request end
      
        //获取函数,乞请并赶回
        public function Get($url, $cookie=array(), $post=array(), $timeout=30){
            $this->url        = $url;
            $this->cookie    = $cookie;
            $this->post        = $post;
            $this->timeout    = $timeout;
          
            if(!$this->analyzeUrl()){
                return $this->result;
            }
            $this->assHeader();
          
            stream_set_blocking($this->fop, $this->block); 
            stream_set_timeout($this->fop, $this->timeout);
            fwrite($this->fop, $this->header);
            $status = stream_get_meta_data($this->fop);
          
            if(!$status['timed_out']){
                $h='';
                while(!feof($this->fop)){
                    if(($header = @fgets($this->fop)) && ($header == "\r\n" ||  $header == "\n")){
                        break;
                    }
                    $h .= $header;
                }
              
                $checkHttp    = $this->checkRecvHeader($h);
                if($checkHttp!=200){return $checkHttp;}
              
                $stop = false;
                $return = '';
                $this->gzip = false;
                if(strstr($h,'gzip')) $this->gzip = true;
                while(!($stop && $status['timed_out'] && feof($this->fop))){
                    if($status['timed_out']) return false;
                    $data = fread($this->fop, ($this->limit == 0 || $this->limit > 128 ? 128 : $this->limit));
                    if($data == ''){//有个别服务器不行,须自行剖断FOEF
                        break;
                    }
                    $return    .= $data;
                    if($this->limit){
                        $this->limit -= strlen($data);
                        $stop = $this->limit <= 0;
                    }
                  
                }
                @fclose($this->fop);
                $this->result    = $this->gzip ? $this->gzdecode($return) : $return;
                return $this->result;
            }else{
                return false;
            }
        }//Get end
    }

  脚本也许有十分的大恐怕被内置的脚本沙漏中断。暗中认可的超时间限制制为 30 秒。这一个值能够通过安装 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的"php_value max_execution_time"参数也许 set_time_limit() 函数来改动。当计数器超时的时候,脚本将会临近于上述连接中断的动静退出,先前被注册过的闭馆触发函数也就要这时被实行。在该关闭触发函数中,能够经过调 用 connection_status() 函数来检查超时是不是产生关闭触发函数被调用。若是超时导致了关门触发函数的调用,该函数将回到 2。

复制代码 代码如下:

增加补充叁个异步管理类

本文由新浦京81707con发布于软件下载,转载请注明出处:fsockopen异步处理实例程序,php定时计划任务与f

关键词: 新浦京81707con

上一篇:php实现TCP端口检测的方法,PHP获取当前页面完整

下一篇:没有了