当前位置:编程学习 > php >>

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 de易做图t 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; 
 
  
 
   } 

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 de易做图t 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_rea
补充:Web开发 , php ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,