php三种实现多线程类似的方法_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;
  } 

2、通过stream_socket_client 方式

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') . ".<br>  ";
            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实现多线程
实现多线程的三种方法、多线程实现的三种方式、ios三种多线程、多线程有几种实现方法、java多线程实现方式,以便于您获取更多的相关知识。

时间: 2024-08-31 15:05:11

php三种实现多线程类似的方法_php技巧的相关文章

php多线程并发实现方法_php技巧

本文实例讲述了php多线程并发实现方法.分享给大家供大家参考,具体如下: java里多线程就是一个new thread的事情,php依赖apache靠着linux底层有一个多线程的办法. 这里就来说说如果你无法操控apache的服务器,如何模拟php并发 <?php if(function_exists('date_default_timezone_set')) { date_default_timezone_set('PRC'); } function a() { $time = time()

三种php连接access数据库方法_php实例

一种是利用php的pdo,一种是odbc,com接口来与access数据库连接. 利用pdo与access数据库连接  复制代码 代码如下: $path ="f:fontwww.jb51.netspiderresult.mdb";  $conn = new pdo("sqlite:$path"); if( $conn ) {  echo ('connection pdo success'); } else {  echo ('cnnection pdo fail ,

ASP技巧:三种禁用FileSystemObject组件的方法

filesystemobject|技巧|禁用 众所周知,FileSystemObject组件的强大功能及破坏性是它屡屡被免费主页 提供商(那些支持ASP)的禁用的原因,我整理了一下,本来只找到两种方法,后来 被某人一刺激,硬是想到第三种不为人所知的方法,呵呵,也不知道是不是这样的. 第一种:用RegSrv32 /u C:\WINDOWS\SYSTEM\scrrun.dll(win98路径)来注销该组 件.此方法过于狠毒,属于同归于尽的方法,大家都没得用,是下招 第二种:修改Progid的值,在A

用户体验设计:三种用户体验的量化方法

案例研究 前面的文章中介绍了三种用户体验量化方法.通过这篇文章,我们将通过案例来一起研究以行为为中心的量化方法的使用.案例需要借助以体验为中心的量化方法来得到以行为为中心的量化表达式,并将其与以体验为中心的量化结果进行比较.具体情况如下: 首先,通过认知实验来获得行为交互过程中的时间与步骤.我们选择了小范围样本取样的方法,有24人参与了该实验,年龄分布在22-27岁之间.任务是通过两款外观相似.键盘布局相似以及档次相同的手机分别完成照片拍摄并将照片以彩信形式发送的任务.在拍照的过程中,操作者在统

Linux操作系统下三种配置环境变量的方法

  现在使用linux的朋友越来越多了,在linux下做开发首先就是需要配置环境变量,下面以配置java环境变量为例介绍三种配置环境变量的方法. 修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. (1)用文本编辑器打开/etc/profile (2)在profile文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05 PATH=$JAVA_HOME/bin:

windows 7常见的三种字体问题的解决方法

使用系统过程中遇到字体问题的,可以说概率非常小,大部分遇到的都是某个软件的问题而不是系统本身的问题.这边就来分享三个小编收集的windows 7中经常遇到的字体问题. 1 字体替换成宋体后,出现乱码 这个只能说,替换成宋体千万不要使用修复功能.没使用修复功能基本没什么问题.使用了才回出现问题. 2 我19屏幕使用分辨率1440*900,为什么一些软件字体会太小了,解决方法: 在调节自定义DPI到125.138.150的使用不要使用"使用xp风格DPI缩放比例"这个不能选择就可以,解决问

三种解密 HTTPS 流量的方法介绍

三种解密 HTTPS 流量的方法介绍 Web 安全是一项系统工程,任何细微疏忽都可能导致整个安全壁垒土崩瓦解.拿 HTTPS 来说,它的「内容加密.数据完整性.身份认证」三大安全保证,也会受到非法根证书.服务端配置错误.SSL 库漏洞.私钥被盗等等风险的影响.很多同学认为只要访问的网站地址前有一把小绿锁就绝对安全,其实不然.本文通过介绍三种最常规的 HTTPS 流量解密方法及原理,浅谈一下 HTTPS 的安全风险. Man-in-the-middle Man-in-the-middle(中间人,

sql下三种批量插入数据的方法_MsSql

本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表:第三种使用的方法是sql server中的表值参数方法,表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据.       代码示例:    

三种禁用FileSystemObject组件的方法

众所周知,FileSystemObject组件的强大功能及破坏性是它屡屡被免费主页 提供商(那些支持ASP)的禁用的原因,我整理了一下,本来只找到两种方法,后来 被某人一刺激,硬是想到第三种不为人所知的方法,呵呵,也不知道是不是这样的.第一种:用RegSrv32 /u C:WINDOWSSYSTEMscrrun.dll(win98路径)来注销该组 件.此方法过于狠毒,属于同归于尽的方法,大家都没得用,是下招 第二种:修改Progid的值,在ASP里调用组件的方式通常是 Set 对象名=Serve