欢迎您访问我的笔记本站旨在于记录一些平时工作中遇到的一些问题和解决方法,方便查阅,部分内容来源于网络,如有侵权请联系我删除
  • 微信微信
您现在的位置是:首页 > PHP后端

php 异步处理的一个方法-[转载]

日期:2018-08-03 09:37:31 作者:tanyi 来源:网络 浏览:1146 次
这个方法感觉还是很实用的
public function _sock($url) {
   $host = parse_url($url,PHP_URL_HOST);
   $port = parse_url($url,PHP_URL_PORT);
   $port = $port ? $port : 80;
   $scheme = parse_url($url,PHP_URL_SCHEME);
   $path = parse_url($url,PHP_URL_PATH);
   $query = parse_url($url,PHP_URL_QUERY);
   if($query) $path .= '?'.$query;
   if($scheme == 'https') {
      $host = 'ssl://'.$host;
   }

   $fp = fsockopen($host,$port,$error_code,$error_msg,1);
   if(!$fp) {
      return array('msg' => 'error');
   }
   else {
      stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式
      stream_set_timeout($fp,1);//设置超时
      $header = "GET $path HTTP/1.1\r\n";
      $header.="Host: $host\r\n";
      $header.="Connection: close\r\n\r\n";//长连接关闭
      fwrite($fp, $header);
      usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功
      fclose($fp);
      return array('msg' => 'yes');
   }
}

正常逻辑处理

异步处理时间比较长的逻辑:写一个处理方法,然后根据地址调用该方法。

public function write(){
   sleep(20);
   file_put_contents('./lock.txt','ceshi');
}
$this->_sock('http://xxxx/write');


调用这个方法后可以立即接收到回应,而不用等write方法里面的逻辑处理完才去响应客户端

提交评论
评论列表