0

0

php三种实现多线程类似的方法

高洛峰

高洛峰

发布时间:2016-12-21 13:06:26

|

1214人浏览过

|

来源于php中文网

原创

1、curl_multi方法

当需要多线程的时候,可以用curl_multi一次性请求多个操作来完成,但curl走的是网络通信,效率与可靠性就比较差了的。

function main(){
  
   $sql = "select waybill_id,order_id from waybill where status>40 order by update_time desc limit 10 ";
  
    $data = Yii::app()->db->createCommand($sql)->queryAll(); //yii 框架格式
  
    foreach ($data as $k => $v) { 
  
      if ($k % 2 == 0) { //偶数发一个网址
  
        $send_data[$k]['url'] = '';
  
        $send_data[$k]['body'] = $v['waybill_id'];
  
      } else { //奇数发送另外一个网址
        $send_data[$k]['url'] = 'http://www.abc.com';
  
        $send_data[$k]['body']=array($v['order_id'] => array('extra' => 16));
  
      }
  
    }
 
    $back_data =sendMulitRequest($send_data);
  
    var_dump($back_data);
  
  }
  function sendMulitRequest($send_data){
    $params = array();
    $curl = $text = array();
    $handle = curl_multi_init();
  
    foreach ($data as $k => $v) {
  
      if (empty($v['url'])) {
  
        $v['url'] = "http://www.xxx.com"; //if url is empty,set defalut url
  
      }
  
      $reqBody = json_encode($v['body']);
  
      $reqStream = array(
  
        'body' => $reqBody,
      ); 
      $encRequest = base64_encode(json_encode($reqStream)); 
      $params['data'] = $encRequest;
      $curl[$k] = curl_init();
      curl_setopt($curl[$k], CURLOPT_URL, $v['url']);
      curl_setopt($curl[$k], CURLOPT_POST, TRUE);
      curl_setopt($curl[$k], CURLOPT_HEADER, 0);
      curl_setopt($curl[$k], CURLOPT_POSTFIELDS, http_build_query($params));
      curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
      curl_multi_add_handle($handle, $curl[$k]);
    }
    $active = null;
  
    do {
  
      $mrc = curl_multi_exec($handle, $active);
  
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    while ($active && $mrc == CURLM_OK) {
  
      if (curl_multi_select($handle) != -1) {
  
        do {
  
          $mrc = curl_multi_exec($handle, $active);
  
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  
      }
  
    }
    foreach ($curl as $k => $v) { 
      if (curl_error($curl[$k]) == "") {
        $text[$k] = (string) curl_multi_getcontent($curl[$k]);
       } 
      curl_multi_remove_handle($handle, $curl[$k]); 
      curl_close($curl[$k]);
    }
    curl_multi_close($handle); 
    return $text; 
  }

   

BJXSHOP网上开店专家
BJXSHOP网上开店专家

BJXShop网上购物系统是一个高效、稳定、安全的电子商店销售平台,经过近三年市场的考验,在中国网购系统中属领先水平;完善的订单管理、销售统计系统;网站模版可DIY、亦可导入导出;会员、商品种类和价格均实现无限等级;管理员权限可细分;整合了多种在线支付接口;强有力搜索引擎支持... 程序更新:此版本是伴江行官方商业版程序,已经终止销售,现于免费给大家使用。比其以前的免费版功能增加了:1,整合了论坛

下载

2、通过stream_socket_client 方式

立即学习PHP免费学习笔记(深入)”;

function sendStream() {
    $english_format_number = number_format($number, 4, '.', '');
  
    echo $english_format_number; 
    exit();
    $timeout = 10;
    $result = array();
    $sockets = array();
    $convenient_read_block = 8192;
    $host = "test.local.com";
    $sql = "select waybill_id,order_id from xm_waybill where status>40 order by update_time desc limit 1 "; 
    $data = Yii::app()->db->createCommand($sql)->queryAll();
    $id = 0;
  
    foreach ($data as $k => $v) {
      if ($k % 2 == 0) {
        $send_data[$k]['body'] = NoticeOrder::getSendData($v['waybill_id']);
  
      } else {
        $send_data[$k]['body'] = array($v['order_id'] => array('extra' => 16)); 
      } 
      $data = json_encode($send_data[$k]['body']);
      $s = stream_socket_client($host . ":80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);
      if ($s) { 
        $sockets[$id++] = $s;
        $http_message = "GET /php/test.php?data=" . $data . " HTTP/1.0\r\nHost:" . $host . "\r\n\r\n"; 
        fwrite($s, $http_message);
      } else { 
        echo "Stream " . $id . " failed to open correctly.";
      } 
    }
  
    while (count($sockets)) {
  
      $read = $sockets;
  
      stream_select($read, $w = null, $e = null, $timeout);
       if (count($read)) { 
        /* stream_select generally shuffles $read, so we need to
         compute from which socket(s) we're reading. */
        foreach ($read as $r) {
  
          $id = array_search($r, $sockets);
          $data = fread($r, $convenient_read_block);
          if (strlen($data) == 0) {
            echo "Stream " . $id . " closes at " . date('h:i:s') . ".
"; fclose($r); unset($sockets[$id]); } else { $result[$id] = $data; } } } else { /* A time-out means that *all* streams have failed to receive a response. */ echo "Time-out!\n"; break; } } print_r($result); }

   

3、通过多进程代替多线程

function daemon($func_name,$args,$number){
  while(true){
    $pid=pcntl_fork();
    if($pid==-1){
      echo "fork process fail";
      exit();
    }elseif($pid){//创建的子进程
  
      static $num=0;
      $num++;
      if($num>=$number){
        //当进程数量达到一定数量时候,就对子进程进行回收。
        pcntl_wait($status);
  
        $num--;
      } 
    }else{ //为0 则代表是子进程创建的,则直接进入工作状态
  
      if(function_exists($func_name)){
        while (true) {
          $ppid=posix_getpid();
          var_dump($ppid);
          call_user_func_array($func_name,$args);
          sleep(2);
        }
      }else{
        echo "function is not exists";
      }
      exit();  
    }
  }
} 
function worker($args){ 
  //do something
  
} 
daemon('worker',array(1),2);

   

以上就是为大家分享的三种php实现多线程类似的方法,希望对大家的学习有所帮助。

更多php三种实现多线程类似的方法相关文章请关注PHP中文网!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 10.3万人学习

Java 教程
Java 教程

共578课时 | 40.5万人学习

HTML教程
HTML教程

共500课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号