加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP实现异步的几种办法

发布时间:2022-07-19 15:04:52 所属栏目:PHP教程 来源:互联网
导读:通用的异步执行文件 exec.php pclose(popen(php exec.php , r)); echo 1; 缺点:只能异步执行本地的脚本文件,不能跨域执行,不能传递参数。 每次执行都会创建新的进程,当并发量高时就创建大量进程,从而造成资源浪费。 curl 应用程序以 curl 发起 http 请
  通用的异步执行文件 exec.php
 
 
  pclose(popen("php exec.php &", 'r'));
 
  echo 1;
 
  缺点:只能异步执行本地的脚本文件,不能跨域执行,不能传递参数。
 
  每次执行都会创建新的进程,当并发量高时就创建大量进程,从而造成资源浪费。
 
  curl
 
  应用程序以 curl 发起 http 请求的形式实现异步。但是 curl 请求也需要等待请求返回,程序同样会阻塞,这时我们需要设置 http 请求的超时时间为1s,这样相当于发起了一个 http 请求去执行任务,但是不等待其返回结果,继续向下执行程序,这样就可以实现异步效果。
 
 
 
 
  function asyncCurl($url, $data)
 
  {
 
      if (is_array($data)) {
 
          $data = http_build_query($data, null, '&');
 
      }
 
      $ch = curl_init();
 
      curl_setopt($ch, CURLOPT_URL, $url);
 
      curl_setopt($ch, CURLOPT_POST, 1);
 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
      curl_setopt($ch, CURLOPT_TIMEOUT, 1);
 
 
  $data = [];
 
   
 
  asyncCurl($url, $data);
 
   
 
  echo "OK";
 
  curl 请求实现异步方式的缺陷就是 http 请求的最小超时时间为1s。也就是应用程序无论如何都要等待1s钟以上才能响应(现在 curl 扩展也能支持毫秒级别的超时时间设置,不过毫秒时间的超时很容易造成请求失败)。
 
  fsockopen
 
  fsockopen() 函数用于打开一个网络连接或者一个Unix套接字连接。通过发起 http 通信来实现异步。
 
      $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 = http_build_query($param);
 
   
 
      if ($scheme == 'https') {
 
          $host = 'ssl://' . $host;
 
      }
 
      $fp = fsockopen($host, $port, $error_code, $error_msg, 1);
 
      if (!$fp) {
 
          return array('error_code' => $error_code, 'error_msg' => $error_msg);
 
      } else {
 
          stream_set_blocking($fp, 0);
 
          stream_set_timeout($fp, 10);
 
          $header = "GET $path" . "?" . "$query" . " HTTP/1.1rn";
 
   
 
  $host = "127.0.0.1";
 
  $url = "/exec.php";
 
  $param = [];
 
  $result = sockPost($host, $url, $param);
 
  var_dump($result);
 
  fsockopen 方式相比 curl 更复杂,需要自己拼接处 http 请求的 header 部分。在 curl 不支持毫秒级超时之前 fsockopen 方式无疑是最佳选择。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读