php curl 模擬多線程,php利用curl 多線程 模擬 并發的詳解

php利用curl 多線程 模擬 并發的詳解

發布于 2014-12-07 10:17:25 | 265 次閱讀 | 評論: 0 | 來源: 網友投遞

PHP開源腳本語言PHP(外文名: Hypertext Preprocessor,中文名:“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,入門門檻較低,易于學習,使用廣泛,主要適用于Web開發領域。PHP的文件后綴名為php。

本文為大家講解的是php利用curl 多線程 模擬 并發的詳解,感興趣的同學參考下。

首先,先了解下 php中的curl多線程函數:

# curl_multi_add_handle

# curl_multi_close

# curl_multi_exec

# curl_multi_getcontent

# curl_multi_info_read

# curl_multi_init

# curl_multi_remove_handle

# curl_multi_select

一般來說,想到要用這些函數時,目的顯然應該是要同時請求多個url,而不是一個一個依次請求,否則不如自己循環去調curl_exec好了。

步驟總結如下:

第一步:調用curl_multi_init

第二步:循環調用curl_multi_add_handle

這一步需要注意的是,curl_multi_add_handle的第二個參數是由curl_init而來的子handle。

第三步:持續調用curl_multi_exec

第四步:根據需要循環調用curl_multi_getcontent獲取結果

第五步:調用curl_multi_remove_handle,并為每個字handle調用curl_close

第六步:調用curl_multi_close

這里有一個網上找的簡單例子,其作者稱為dirty的例子,(稍后我會說明為何dirty):

/*

Here's a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1

*/

$connomains = array(

"http://www.cnn.com/",

"http://www.canada.com/",

"http://www.yahoo.com/"

);

$mh = curl_multi_init();

foreach ($connomains as $i => $url) {

$conn[$i]=curl_init($url);

curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);

curl_multi_add_handle ($mh,$conn[$i]);

}

do { $n=curl_multi_exec($mh,$active); } while ($active);

foreach ($connomains as $i => $url) {

$res[$i]=curl_multi_getcontent($conn[$i]);

curl_close($conn[$i]);

}

print_r($res);

整個使用過程差不多就是這樣,但是,這個簡單代碼有個致命弱點,就是在do循環的那段,在整個url請求期間是個死循環,它會輕易導致CPU占用100%。

現在我們來改進它,這里要用到一個幾乎沒有任何文檔的函數curl_multi_select了,雖然C的curl庫對select有說明,但是,php里的接口和用法確與C中有不同。

把上面do的那段改成下面這樣:

do {

$mrc = curl_multi_exec($mh,$active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active and $mrc == CURLM_OK) {

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

因為$active要等全部url數據接受完畢才變成false,所以這里用到了curl_multi_exec的返回值判斷是否還有數據,當有數據的時候就不停調用curl_multi_exec,暫時沒有數據就進入select階段,新數據一來就可以被喚醒繼續執行。這里的好處就是CPU的無謂消耗沒有了。

另外:還有一些細節的地方可能有時候要遇到:

控制每一個請求的超時時間,在curl_multi_add_handle之前通過curl_setopt去做:

curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);

判斷是否超時了或者其他錯誤,在curl_multi_getcontent之前用:curl_error($conn[$i]);

這里我只是簡單使用上述的dirty的例子(足夠用了,并未發現cpu使用100%的情況)。

對“看點”(kandian.com)某一接口模擬并發,功能是向 memcache中讀數據并寫入數據。因為保密關系,相關數據及結果就不貼出了。

模擬了3次,第一次10線程同時請求1000次,第二次,100線程同時請求1000次,第三次,1000線程同時請求100次(已經相當費勁了,不敢在設置超過1000的多線程)。

看來curl多線程模擬并發還是有一定局限的。

另外還懷疑,可能會因為多線程延遲帶來結果的大誤差,對比數據發現。在初始化和set所用時間出入不大,差別處在get方法,因此可簡單排除這點~~~

相關閱讀:

php利用curl 多線程 模擬 并發的詳解

PHP Curl多線程原理實例詳解

PHP CURL 多線程操作代碼實例

PHP實現多線程異步請求的3種方法

php fsockopen中多線程問題的解決辦法

PHP+shell實現多線程的方法

如何解決PHP無法實現多線程的問題

PHP安裝threads多線程擴展基礎教程

php利用curl抓取遠程頁面內容的示例代碼

PHP CURL登錄郵箱獲取郵箱地址的詳解

PHP 異步執行方法,模擬多線程的示例

PHP使用curl實現多線程采集的例子

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537899.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537899.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537899.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新版DAEMON Tools Lite打不開 bin 文件解決方法

DAEMON Tools Lite 支持打開 *.cue 解決方法很簡單:將*.bin 重命名為 *.cue 就可以打開

Linux集群架構(LVS DR模式搭建、keepalived + LVS)

為什么80%的碼農都做不了架構師?>>> LVS DR模式搭建 準備工作:三臺機器 分發器,也叫調度器(簡寫為dir):192.168.248.128 rs1 :192.168.248.129 rs2 : 192.168.248.130 vip : 192.16…

java手機狀態欄圓形圖標,android實現狀態欄添加圖標的函數實例

本文實例講述了android實現狀態欄添加圖標的函數。分享給大家供大家參考。具體如下:private void showNotification() {// 創建一個NotificationManager的引用NotificationManager notificationManager (NotificationManager)AutoFile.this.getSystemService(andro…

Windows下SVN回滾到舊版本(TortoiseSVN)

原文地址:https://www.cnblogs.com/tommy-huang/p/4729634.html ---------------------------------------- 當發現新提交的代碼有問題,然后想將某個舊的版本作為最新的版本時,可以使用回滾, 操作步驟如下: 1. 簽出…

看懂架構設計中的服務隔離

前言 我們在做系統架構設計的時候,經常離不開的一個話題就是進行服務的隔離設計。 那什么是「服務隔離」呢? 顧名思義,它是指將系統按照一定的原則劃分為若干個服務模塊,各個模塊之間相對獨立,無強依賴。當有故障發生時…

2018最新蘋果APP上架App Store流程(超詳細)

內容很豐富,點擊查看博文 https://blog.csdn.net/xxw888/article/details/73618837/

[五] JavaIO之InputStream OutputStream簡介 方法列表說明

InputStream 和 OutputStream 對于字節流的輸入和輸出 是作為協議的存在 所以有必要了解下這兩個類提供出來的基本約定 這兩個類是抽象類,而且基本上沒什么實現,都是依賴于子類具體的去實現 但是他是對于其子類 協議綱領一般的存在 了解清楚每一個方法含義,對于后續具體的子類將…

Mysql yum 安裝后,一些重要的文件路徑

默認配置文件路徑: 配置文件:/etc/my.cnf 日志文件:/var/log//var/log/mysqld.log 服務啟動腳本:/usr/lib/systemd/system/mysqld.service socket文件:/var/run/mysqld/mysqld.pid #(a)數據庫目錄 /var/lib/mysql…

mysql雙機熱備 配置文件,MYSQL 雙機熱備配置手冊()

[原創] MYSQL 雙機熱備配置手冊[原創]http://www.chinaunix.net 作者:squall1 發表于:2007-07-23 19:01:43【發表評論】【查看原文】【存儲備份之家討論區】【關閉】作者:CU-squall發表于:2005年4月18日 8:21 可以不經作者同意自由傳播&…

[轉]資本經營董事長班告訴你:不只企業有商業模式,個人商業價值更重要

本文轉自:http://blog.sina.com.cn/s/blog_181b5b47e0102xz4v.html 東方財智-資本經營董事長班>>> 經營者如何輕松駕馭金融工具為企業發展加速、升級互聯網工具實現品牌營銷裂變、利用管理工具優化公司內部結構,把握前沿視角,實現快…

CentOS 7添加開機啟動服務腳本

原文路徑:https://blog.csdn.net/wang123459/article/details/79063703 --------------------------------------------------------- 一、添加開機自啟服務 在CentOS 7中添加開機自啟服務非常方便,只需要兩條命令(以Jenkins為例): system…

php 彩票系統,hsyl12141511 一套完整的PHP版彩票系統 - 下載 - 搜珍網

文件名大小更新時間BOEKJ02017-12-14BOEKJ\.idea02017-12-13BOEKJ\.idea\BOEKJ.iml2812017-04-28BOEKJ\.idea\modules.xml2622017-04-28BOEKJ\.idea\workspace.xml100272017-04-28BOEKJ\String-ext.js10402015-05-30BOEKJ\TianHeng.exe230402015-05-05BOEKJ\config.js309232017…

CPR認證-建材CE認證-305/2011/EU

建材CPR認證 - Regulation (EU) No 305/2011  2011年3月,歐盟頒布了新建筑產品法規RETULATION (EU) No 305/2011 – CPR,并通告了新法規于2013年7月進入強制執行,取代了老CPD指令89/106/EEC。  新的建材CPR認證也是…

python支持復數類型以下什么說法是錯誤的,【Python】專項練習題(1)

1.python代碼如下:foo [1,2]foo1 foofoo.append(3)A.foo 值為[1,2]B.foo 值為[1,2,3]C.foo1 值為[1,2]D.foo1 值為[1,2,3]答案:B D鏈接:https://www.nowcoder.com/profile/153165401/myFollowings/detail/20055659來源:牛客網2.下列程序打印…

ios10不能定位 window.navigator.geolocation.getCurrentPosition(定位第一節)

原文連接: https://blog.csdn.net/michael_ouyang/article/details/54137709 --------------------------------------------------------- 問題分析: 目前由于許多蘋果用戶都升級到了iOS系統,蘋果的iOS 10已經正式對外推送,…

php網站無法顯示,php – 在UTF-8網站上無法正確顯示的字符

我已經完成了我能想到的一切,但是在這個網頁上沒有正確顯示特殊字符.例如,在數據庫中它是:但在網站上它是:Nouveaux R�alistes這是我檢查過的一切……數據庫設置為UTF-8:該頁面是用NetBeans編寫的,文檔編碼設置為UTF-8&#xff1a…

ios如何獲取gps坐標(定位第二節)

原文連接: https://blog.csdn.net/michael_ouyang/article/details/54378338 -------------------------------------------------------------------- 在上一篇文章,解決ios 10不能定位的問題,把navigator.geolocation.getCurrentPosition…

java并發編程——線程池的工作原理與源碼解讀

2019獨角獸企業重金招聘Python工程師標準>>> 線程池的簡單介紹 基于多核CPU的發展,使得多線程開發日趨流行。然而線程的創建和銷毀,都涉及到系統調用,比較消耗系統資源,所以就引入了線程池技術,避免頻繁的線…

php pcre回溯攻擊,php preg_match pcre回溯繞過

原理需要知識:正則NFA回溯原理,php的pcre.backtrack_limit設置。正則NFA回溯原理正則表達式是一個可以被"有限狀態自動機"接受的語言類。"有限狀態自動機",擁有有限數量的狀態,每個狀態可以遷移到零個或多個狀態,輸入字串決定執行哪個狀態的遷移…