PHP開啟異步多線程執(zhí)行腳本

場景要求

客戶端調(diào)用服務(wù)器a.php接口倘潜,需要執(zhí)行一個長達5s-20s不等的耗資源操作,但是客戶端響應(yīng)請求時間為5秒(微信公眾賬號服務(wù)器請求響應(yīng)超時時間)废睦,5s以上無回復(fù)即斷開連接养泡。

解決設(shè)想

客戶端調(diào)用a.php之后嗜湃,a.php執(zhí)行異步多線程操作調(diào)用b.php澜掩,a.php調(diào)用成功后即刻反饋給客戶端回執(zhí),b.php自動執(zhí)行耗資源操作肩榕。

難點

PHP沒有真正實現(xiàn)多線程操作的方法。所以需要通過其它手段來進行模擬多線程橘荠。

方案一

利用CURL非阻塞調(diào)用b.php,實現(xiàn)過程可以參考

http://blog.csdn.net/linvo/article/details/5956629

但是有一個問題哥童,就是a.php會繼續(xù)等待b.php的響應(yīng)。

于是臨時想了一個解決方案:

在此處代碼中匀泊,將$curlopt_timeout改為1

/**  
     * 單個CURL調(diào)用超時限制   
     */    
    public $curlopt_timeout = 1;    
    private $param = array();  

但是這樣做就違背了curl本身的邏輯限制朵你。

方案二

利用socket

在a.php中加入以下代碼

$fp = fsockopen("test.com", 80, $errno, $errstr, 30);  
if (!$fp){  
    echo 'error fsockopen';  
}  
else{  
    stream_set_blocking($fp,0);  
    $http = "GET /test/b.php HTTP/1.1\r\n";      
    $http .= "Host: test.com\r\n";      
    $http .= "Connection: Close\r\n\r\n";  
    fwrite($fp,$http);  
    fclose($fp);  
}  

即可實現(xiàn)a.php調(diào)用b.php無阻塞。

代碼中stream_set_blocking函數(shù)用來設(shè)定socket鏈接為無阻塞方式(默認為阻塞)抡医。

問題

在使用方案二以后,遇到了一個問題忌傻,即客戶端短時間內(nèi)多次調(diào)用a.php大脉,出現(xiàn)部分請求 沒有執(zhí)行b.php 的情況水孩。

解決方法:

在Nginx的nginx.conf文件中,查看worker_processes為1秤标,判斷服務(wù)端響應(yīng)請求的線程啟動限制太大宙刘,得知服務(wù)器本身配置為雙核CPU,判斷2-4線程比較合適荐类,于是修改worker_processes為4.問題得到解決!

報錯:stream_set_blocking() expects parameter 1 to be resource, null given
解決方法玉罐,修改php.ini函數(shù)設(shè)置潘拨,找到
disable_functions =
將proc_open和stream_socket_server兩個參數(shù)刪除
重啟php

完整代碼:

/**
     * @parem $url 網(wǎng)頁地址 http://www.test.com/test/test.php
     * @parem $port 網(wǎng)址端口 默認80
     * @parem $t 腳本請求時間 默認30s
     * @parem $method 請求方式 get/post
     * @parem $data ['test'=>'1']
     * */
    public function asyncPHP($url, $port = 80, $t = 30, $method = 'get', $data = null)
    {
        $info = parse_url($url);
        $fp   = fsockopen($info["host"], $port, $errno, $errstr, $t);
        //stream_set_blocking函數(shù)用來設(shè)定socket鏈接為無阻塞方式
        stream_set_blocking($fp, 0);
        // 判斷是否有數(shù)據(jù)
        if (isset($data) && !empty($data)) {
            $query = http_build_query($data); // 數(shù)組轉(zhuǎn)url 字符串形式
        } else {
            $query = null;
        }
        // 判斷 請求方式
        if ($method == 'post') {
            $head = "POST " . $info['path'] . " HTTP/1.0" . PHP_EOL;
        } else {
            $head = "GET " . $info['path'] . "?" . $query . " HTTP/1.0" . PHP_EOL;
        }
        $head .= "Host: " . $info['host'] . PHP_EOL; // 請求主機地址
        $head .= "Referer: " . $url . PHP_EOL;
        if (isset($data) && !empty($data) && ($method == 'post')) {
            $head .= "Content-type: application/x-www-form-urlencoded" . PHP_EOL;
            $head .= "Content-Length: " . strlen(trim($query)) . PHP_EOL;
            $head .= PHP_EOL;
            $head .= trim($query);
        } else {
            $head .= PHP_EOL;
        }
        fwrite($fp, $head);
        fclose($fp);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末季蚂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扭屁,更是在濱河造成了極大的恐慌,老刑警劉巖料滥,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葵腹,死亡現(xiàn)場離奇詭異高每,居然都是意外死亡践宴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門带欢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烤惊,“玉大人,你說我怎么就攤上這事撕氧。” “怎么了伦泥?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵不脯,是天一觀的道長。 經(jīng)常有香客問我防楷,道長,這世上最難降的妖魔是什么复局? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任亿昏,我火速辦了婚禮峦剔,結(jié)果婚禮上角钩,老公的妹妹穿的比我還像新娘呻澜。我一直安慰自己惨险,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布栅受。 她就那樣靜靜地躺著一屋,像睡著了一般窘疮。 火紅的嫁衣襯著肌膚如雪冀墨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蔚出,我揣著相機與錄音虫腋,去河邊找鬼。 笑死悦冀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盒蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼讨惩,長吁一口氣:“原來是場噩夢啊……” “哼寒屯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寡夹,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳君,沒想到半個月后患蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體或颊,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡囱挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年沼溜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系草。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡找都,死狀恐怖唇辨,靈堂內(nèi)的尸體忽然破棺而出能耻,到底是詐尸還是另有隱情,我是刑警寧澤晓猛,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站栗恩,受9級特大地震影響洪燥,放射性物質(zhì)發(fā)生泄漏磕秤。R本人自食惡果不足惜蚓曼,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望床绪。 院中可真熱鬧其弊,春花似錦癞己、人聲如沸梭伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愉耙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朴沿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工魏铅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坚芜,地道東北人览芳。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓货岭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屯仗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容