国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php三種實現多線程類似的方法

2024-05-04 23:39:59
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了php三種實現多線程類似的方法,需要的朋友可以參考下

1、curl_multi方法

當需要多線程的時候,可以用curl_multi一次性請求多個操作來完成,但curl走的是網絡通信,效率與可靠性就比較差了的。

 

 
  1. function main(){  
  2.  
  3. $sql = "select waybill_id,order_id from waybill where status>40 order by update_time desc limit 10 ";  
  4.  
  5. $data = Yii::app()->db->createCommand($sql)->queryAll(); //yii 框架格式  
  6.  
  7. foreach ($data as $k => $v) {  
  8.  
  9. if ($k % 2 == 0) { //偶數發一個網址  
  10.  
  11. $send_data[$k]['url'] = '';  
  12.  
  13. $send_data[$k]['body'] = $v['waybill_id'];  
  14.  
  15. else { //奇數發送另外一個網址  
  16. $send_data[$k]['url'] = 'http://www.abc.com';  
  17.  
  18. $send_data[$k]['body']=array($v['order_id'] => array('extra' => 16));  
  19.  
  20. }  
  21.  
  22. }  
  23.  
  24. $back_data =sendMulitRequest($send_data);  
  25.  
  26. var_dump($back_data);  
  27.  
  28. }  
  29. function sendMulitRequest($send_data){  
  30. $params = array();  
  31. $curl = $text = array();  
  32. $handle = curl_multi_init();  
  33.  
  34. foreach ($data as $k => $v) {  
  35.  
  36. if (empty($v['url'])) {  
  37.  
  38. $v['url'] = "http://www.xxx.com"; //if url is empty,set defalut url  
  39.  
  40. }  
  41.  
  42. $reqBody = json_encode($v['body']);  
  43.  
  44. $reqStream = array(  
  45.  
  46. 'body' => $reqBody,  
  47. );  
  48. $encRequest = base64_encode(json_encode($reqStream));  
  49. $params['data'] = $encRequest;  
  50. $curl[$k] = curl_init();  
  51. curl_setopt($curl[$k], CURLOPT_URL, $v['url']);  
  52. curl_setopt($curl[$k], CURLOPT_POST, TRUE);  
  53. curl_setopt($curl[$k], CURLOPT_HEADER, 0);  
  54. curl_setopt($curl[$k], CURLOPT_POSTFIELDS, http_build_query($params));  
  55. curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);  
  56. curl_multi_add_handle($handle, $curl[$k]);  
  57. }  
  58. $active = null;  
  59.  
  60. do {  
  61.  
  62. $mrc = curl_multi_exec($handle, $active);  
  63.  
  64. while ($mrc == CURLM_CALL_MULTI_PERFORM);  
  65. while ($active && $mrc == CURLM_OK) {  
  66.  
  67. if (curl_multi_select($handle) != -1) {  
  68.  
  69. do {  
  70.  
  71. $mrc = curl_multi_exec($handle, $active);  
  72.  
  73. while ($mrc == CURLM_CALL_MULTI_PERFORM);  
  74.  
  75. }  
  76.  
  77. }  
  78. foreach ($curl as $k => $v) {  
  79. if (curl_error($curl[$k]) == "") {  
  80. $text[$k] = (string) curl_multi_getcontent($curl[$k]);  
  81. }  
  82. curl_multi_remove_handle($handle, $curl[$k]);  
  83. curl_close($curl[$k]);  
  84. }  
  85. curl_multi_close($handle);  
  86. return $text;  

2、通過stream_socket_client 方式

 

 
  1. function sendStream() {  
  2. $english_format_number = number_format($number, 4, '.''');  
  3.  
  4. echo $english_format_number;  
  5. exit();  
  6. $timeout = 10;  
  7. $result = array();  
  8. $sockets = array();  
  9. $convenient_read_block = 8192;  
  10. $host = "test.local.com";  
  11. $sql = "select waybill_id,order_id from xm_waybill where status>40 order by update_time desc limit 1 ";  
  12. $data = Yii::app()->db->createCommand($sql)->queryAll();  
  13. $id = 0;  
  14.  
  15. foreach ($data as $k => $v) {  
  16. if ($k % 2 == 0) {  
  17. $send_data[$k]['body'] = NoticeOrder::getSendData($v['waybill_id']);  
  18.  
  19. else {  
  20. $send_data[$k]['body'] = array($v['order_id'] => array('extra' => 16));  
  21. }  
  22. $data = json_encode($send_data[$k]['body']);  
  23. $s = stream_socket_client($host . ":80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT | STREAM_CLIENT_CONNECT);  
  24. if ($s) {  
  25. $sockets[$id++] = $s;  
  26. $http_message = "GET /php/test.php?data=" . $data . " HTTP/1.0/r/nHost:" . $host . "/r/n/r/n";  
  27. fwrite($s, $http_message);  
  28. else {  
  29. echo "Stream " . $id . " failed to open correctly.";  
  30. }  
  31. }  
  32.  
  33. while (count($sockets)) {  
  34.  
  35. $read = $sockets;  
  36.  
  37. stream_select($read, $w = null, $e = null, $timeout);  
  38. if (count($read)) {  
  39. /* stream_select generally shuffles $read, so we need to  
  40. compute from which socket(s) we're reading. */ 
  41. foreach ($read as $r) {  
  42.  
  43. $id = array_search($r, $sockets);  
  44. $data = fread($r, $convenient_read_block);  
  45. if (strlen($data) == 0) {  
  46. echo "Stream " . $id . " closes at " . date('h:i:s') . ".<br> ";  
  47. fclose($r);  
  48. unset($sockets[$id]);  
  49. else {  
  50. $result[$id] = $data;  
  51. }  
  52. }  
  53. else {  
  54. /* A time-out means that *all* streams have failed  
  55. to receive a response. */ 
  56. echo "Time-out!/n";  
  57. break;  
  58. }  
  59. }  
  60. print_r($result);  
  61.  

3、通過多進程代替多線程

 

 
  1. function daemon($func_name,$args,$number){  
  2. while(true){  
  3. $pid=pcntl_fork();  
  4. if($pid==-1){  
  5. echo "fork process fail";  
  6. exit();  
  7. }elseif($pid){//創建的子進程  
  8.  
  9. static $num=0;  
  10. $num++;  
  11. if($num>=$number){  
  12. //當進程數量達到一定數量時候,就對子進程進行回收。  
  13. pcntl_wait($status);  
  14.  
  15. $num--;  
  16. }  
  17. }else//為0 則代表是子進程創建的,則直接進入工作狀態  
  18.  
  19. if(function_exists($func_name)){  
  20. while (true) {  
  21. $ppid=posix_getpid();  
  22. var_dump($ppid);  
  23. call_user_func_array($func_name,$args);  
  24. sleep(2);  
  25. }  
  26. }else{  
  27. echo "function is not exists";  
  28. }  
  29. exit();  
  30. }  
  31. }  
  32. }  
  33. function worker($args){  
  34. //do something  
  35.  
  36. }  
  37. daemon('worker',array(1),2);  

以上就是為大家分享的三種php實現多線程類似的方法,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 繁峙县| 瓮安县| 巴林右旗| 沽源县| 江川县| 开远市| 喀喇沁旗| 手机| 方正县| 宁明县| 五河县| 上犹县| 武夷山市| 田东县| 禹州市| 开远市| 含山县| 牙克石市| 渭源县| 边坝县| 新干县| 年辖:市辖区| 阿克陶县| 三亚市| 琼海市| 双峰县| 赫章县| 霍林郭勒市| 新密市| 昌邑市| 湖南省| 漳浦县| 汤原县| 徐汇区| 元阳县| 普洱| 文水县| 南昌县| 深州市| 盘山县| 固原市|