亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2207 | 回復: 3
打印 上一主題 下一主題

PHP多線程運作方式,使用CURL函數(shù) [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-10-16 17:45 |只看該作者 |倒序瀏覽
PHP在多線程還是用得到, 例如要同時連結(jié)不同資料庫的資料表, 運算後取得結(jié)果,
並把這些結(jié)果顯示在頁面上, 如果一個個連線, 運算後得到結(jié)果, 再連線到另一個資料庫,
那可能要等待一段時間, USER就會覺得怎麼那麼慢...

尤其是像跨國公司, 如果他要同時A公司的資料庫, B公司的資料庫, C公司的資料庫...
然後運算各公司業(yè)績後, 顯示在頁面上做一個比較, 這時就很需要多線程去處理了,
不然你要等到連完A公司的資料庫後取得運算結(jié)果, 再連到B公司的資料庫後取得運算結(jié)果.....
這過程無疑會等待許久, 依程式運算資料量的內(nèi)容, 可能十多秒到數(shù)十秒都有可能...

多線程同時連線去處理, 只需要等待處理較久的那個線程即可, 縮短不少時間

以下是一個多線程函數(shù),使用PHP的CURL函數(shù),多線程抓取資料,
亦即程式模仿USER去瀏覽網(wǎng)頁一樣,差別在於因為不是瀏覽器,
所以$_SESSION  $_COOKIE等變數(shù)是不存在的.... 要特別注意,
另外要注意是CURL是抓資料,不是執(zhí)行內(nèi)部函數(shù),所以如果你是要抓取你自己的程式執(zhí)行結(jié)果,
你要返回內(nèi)容,必須在該程式內(nèi)使用echo指令輸出,而不是 return,
如果你是返回陣列,先用serialize轉(zhuǎn)為字串輸出,接收之後再用unserialize轉(zhuǎn)為變數(shù)

  1.    function curl_get_url($url_array, $wait_usec = 0)
  2.     {
  3.     if (!is_array($url_array))
  4.         return false;

  5.     $wait_usec = intval($wait_usec);

  6.     $data    = array();
  7.     $handle  = array();
  8.     $running = 0;

  9.     $mh = curl_multi_init(); // multi curl handler

  10.     $i = 0;
  11.     foreach($url_array as $url) {
  12.         $ch = curl_init();

  13.         curl_setopt($ch, CURLOPT_URL, $url);
  14.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
  15.         curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  16.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
  17.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
  18.         curl_setopt($ch, CURLOPT_MAXREDIRS, 7);

  19.         curl_multi_add_handle($mh, $ch); // 把 curl resource 放進 multi curl handler 裡

  20.         $handle[$i++] = $ch;
  21.     }

  22.     /* 執(zhí)行 */
  23.     /* 此種做法會造成 CPU loading 過重 (CPU 100%)
  24.     do {
  25.         curl_multi_exec($mh, $running);

  26.         if ($wait_usec > 0) // 每個 connect 要間隔多久
  27.             usleep($wait_usec); // 250000 = 0.25 sec
  28.     } while ($running > 0);
  29.     */

  30.     /* 此做法就可以避免掉 CPU loading 100% 的問題 */
  31.     // 參考自: http://www.hengss.com/xueyuan/sort0362/php/info-36963.html
  32.     do {
  33.         $mrc = curl_multi_exec($mh, $active);
  34.     } while ($mrc == CURLM_CALL_MULTI_PERFORM);

  35.     while ($active and $mrc == CURLM_OK) {
  36.         if (curl_multi_select($mh) != -1) {
  37.             do {
  38.                 $mrc = curl_multi_exec($mh, $active);
  39.             } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  40.         }
  41.     }

  42.     /* 讀取資料 */
  43.     foreach($handle as $i => $ch) {
  44.         $content  = curl_multi_getcontent($ch);
  45.         $data[$i] = (curl_errno($ch) == 0) ? $content : false;
  46.     }

  47.     /* 移除 handle*/
  48.     foreach($handle as $ch) {
  49.         curl_multi_remove_handle($mh, $ch);
  50.     }

  51.     curl_multi_close($mh);

  52.     return $data;
  53.     }
復制代碼
範例A

  1. $urls = array('http://www.baidu.com/img/baidu_sylogo1.gif',
  2.                     'http://www.baidu.com/img/baidu_sylogo1.gif',
  3.                     'http://www.baidu.com/img/baidu_sylogo1.gif'
  4.                    );
  5. print_r(curl_get_url($urls));
復制代碼
範例B
我上面說過$_SESSION是不存在的...所以要用傳值的方式

  1. $urls = array('http://www.aaa.com/index.php?act=data1&A=1&B=2&C=3',
  2.                     'http://www.aaa.com/index.php?act=data2&A=1&B=2&C=3',
  3.                     'http://www.aaa.com/index.php?act=data3&A=1&B=2&C=3'
  4.                    );

  5. print_r(curl_get_url($urls));
復制代碼

論壇徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46處女座
日期:2013-10-24 14:25:01酉雞
日期:2014-04-07 11:54:15
2 [報告]
發(fā)表于 2012-10-17 12:31 |只看該作者
多線程? 不知道I/O復用接口? 沒用過libcurl的multi接口?

論壇徽章:
0
3 [報告]
發(fā)表于 2012-10-17 14:46 |只看該作者
lol沒用過。。。;旧蠜]用過多線程干活

論壇徽章:
0
4 [報告]
發(fā)表于 2012-10-19 16:58 |只看該作者
玩過,但是覺得不好用,還不如搞個任務(wù)跑,
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP