成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP異步:在PHP中使用 fsockopen curl 實(shí)現(xiàn)類似異步處理的功能

freewolf / 2565人閱讀

摘要:除了,其實(shí)也可以實(shí)現(xiàn)這樣的效果,有些主機(jī)上并不支持,我們就可以使用來實(shí)現(xiàn)。

本文僅作為本人學(xué)習(xí)過程中的一點(diǎn)心得,歡迎大家拍磚。


PHP從主流來看,是一門面向過程的語言,它的最大缺點(diǎn)就是無法實(shí)現(xiàn)多線程管理,其程序的執(zhí)行都是從頭到尾,按照邏輯一路執(zhí)行下來,不可能出現(xiàn)分支,這一點(diǎn)是限制php在主流程序語言中往更高級的語言發(fā)展的原因之一。

在PHP中我們有的時(shí)候其實(shí)希望在執(zhí)行某項(xiàng)操作的時(shí)候,同時(shí)去執(zhí)行另外一項(xiàng)操作,舉一個(gè)場景:在用戶搶票的時(shí)候,你并不希望用戶排隊(duì)去連接數(shù)據(jù)庫進(jìn)行查詢、判斷、插入,完成之后再返回用戶結(jié)果。其實(shí)我們并不需要用戶等那么久的時(shí)間,用戶提交之后,直接告訴他已經(jīng)搶票成功了就可以了,至于各種操作,交給后臺去處理就好。當(dāng)然,這種情況我們現(xiàn)在都用消息列表來處理,把每一個(gè)用戶提交的請求存在一個(gè)消息列隊(duì)中,告訴用戶已經(jīng)搞定了,用戶愉快的關(guān)掉頁面之后,實(shí)際上后臺還在一個(gè)一個(gè)從消息列隊(duì)中取出請求進(jìn)行操作。我們這篇文章則是通過一種異類的手法,實(shí)現(xiàn)操作在后臺運(yùn)行,無需用戶等待。

首先,我們要?jiǎng)?chuàng)建一個(gè)請求入口:



其次,我們需要一個(gè)后臺處理程序,用戶是否在線并不影響它的運(yùn)行:



現(xiàn)在的問題是,在第一段代碼中,如何“提交給后臺”?我們通過一種非阻塞式的請求來實(shí)現(xiàn)這個(gè)功能。也就是創(chuàng)建一個(gè)可以被訪問的url,在這個(gè)url運(yùn)行第二段程序,通過一個(gè)請求來請求這個(gè)url,從而激活第二段程序自動(dòng)運(yùn)行。接下來我們直接看代碼:

// 遠(yuǎn)程請求(不獲取內(nèi)容)函數(shù)
function _sock($url) {
  $host = parse_url($url,PHP_URL_HOST);
  $port = parse_url($url,PHP_URL_PORT);
  $port = $port ? $port : 80;
  $scheme = parse_url($url,PHP_URL_SCHEME);
  $path = parse_url($url,PHP_URL_PATH);
  $query = parse_url($url,PHP_URL_QUERY);
  if($query) $path .= "?".$query;
  if($scheme == "https") {
    $host = "ssl://".$host;
  }

  $fp = fsockopen($host,$port,$error_code,$error_msg,1);
  if(!$fp) {
    return array("error_code" => $error_code,"error_msg" => $error_msg);
  }
  else {
    stream_set_blocking($fp,true);//開啟了手冊上說的非阻塞模式
    stream_set_timeout($fp,1);//設(shè)置超時(shí)
    $header = "GET $path HTTP/1.1
";
    $header.="Host: $host
";
    $header.="Connection: close

";//長連接關(guān)閉
    fwrite($fp, $header);
    usleep(1000); // 這一句也是關(guān)鍵,如果沒有這延時(shí),可能在nginx服務(wù)器上就無法執(zhí)行成功
    fclose($fp);
    return array("error_code" => 0);
  }
}

我們創(chuàng)建了一個(gè)基于fsockopen的函數(shù),這個(gè)函數(shù)中利用fsockopen去訪問url,但是在訪問時(shí),并不要求獲取url顯示的內(nèi)容,而是僅僅發(fā)出訪問請求,請求到達(dá)后馬上關(guān)閉這個(gè)訪問。這樣做的好處就是無需再等待被訪問的url是否返回了可靠的信息,節(jié)約了時(shí)間,這段代碼的執(zhí)行時(shí)間在0.1-0.2秒之間,對于普通訪客而言,幾乎察覺不到。因此,在使用時(shí),僅需要調(diào)用這個(gè)函數(shù)和對應(yīng)的url即可。不過,這里并沒有提供數(shù)據(jù)傳輸?shù)牟糠?,如何傳輸?shù)據(jù),其實(shí)只需要在$header中增加post的內(nèi)容即可。

除了fsockopen,curl其實(shí)也可以實(shí)現(xiàn)這樣的效果,有些主機(jī)上并不支持fsockopen,我們就可以使用curl來實(shí)現(xiàn)。

function _curl($url) {
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_TIMEOUT,1);
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}

這段代碼的關(guān)鍵是提供了一個(gè)Timeout,僅1秒鐘,也就是說curl發(fā)出請求,無論是否接收到返回的內(nèi)容,1秒鐘之后都會關(guān)閉該訪問,因此這個(gè)函數(shù)的執(zhí)行數(shù)據(jù)為1.0-1.1秒之間。但對于用戶來說,如果是一個(gè)需要進(jìn)行數(shù)據(jù)處理的應(yīng)用,1秒中的等待幾乎是被忽略的,如果你希望用一段更簡單和容易被理解的代碼,可以選擇curl來實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21023.html

相關(guān)文章

  • PHP cURL請求詳解

    摘要:不支持多進(jìn)程,如果需要異步請求,非阻塞的方式,請選擇。時(shí)會發(fā)送請求,類型為,是表單提交時(shí)最常見的一種。允許函數(shù)執(zhí)行的最長秒數(shù)。設(shè)定請求中部分的內(nèi)容。常規(guī)的使用來請求,功能強(qiáng)大,使用方便,按需配置。 在PHP后端的開發(fā)過程中,除了獲取數(shù)據(jù)庫的數(shù)據(jù)和處理數(shù)據(jù)的內(nèi)部邏輯,往往還需要請求其他服務(wù)器接口的數(shù)據(jù),我們一般有3種方式來獲取數(shù)據(jù),分別是: file_get_contents fsoc...

    paney129 評論0 收藏0
  • PHP超時(shí)處理全面總結(jié)

    摘要:的毫秒級超時(shí)也有問題。。中超時(shí)實(shí)現(xiàn)一初級最簡單的超時(shí)實(shí)現(xiàn)秒級超時(shí)思路很簡單鏈接一個(gè)后端,然后設(shè)置為非阻塞模式,如果沒有連接上就一直循環(huán),判斷當(dāng)前時(shí)間和超時(shí)時(shí)間之間的差異。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過狀態(tài)通知和回調(diào)來通知調(diào)用者。 概述 在PHP開發(fā)中工作里非常多使用到超時(shí)處理到超時(shí)的場合,我說幾個(gè)場景: 異步獲取數(shù)據(jù)如果某個(gè)后端數(shù)據(jù)源獲取不成功則跳過,不影響整個(gè)頁面展現(xiàn) 為了保...

    I_Am 評論0 收藏0
  • 利用客服消息和模板消息實(shí)現(xiàn)微信群發(fā)(突破群發(fā)接口上限)

    摘要:此接口主要用于客服等有人工消息處理環(huán)節(jié)的功能,方便開發(fā)者為用戶提供更加優(yōu)質(zhì)的服務(wù)。不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。 1、關(guān)于群發(fā)接口和消息接口 關(guān)于群發(fā)接口1.訂閱號每天可以群發(fā)消息一條,服務(wù)號每月(自然月)四條的群發(fā)權(quán)限。開發(fā)者模式下,可以通過高級群發(fā)接口,實(shí)現(xiàn)更靈活的群發(fā)能力。2.注意● 對于認(rèn)證訂閱號,群發(fā)接口每天可成功調(diào)用1次,此次群發(fā)可選擇發(fā)送給全...

    Gemini 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<