摘要:除了,其實也可以實現這樣的效果,有些主機上并不支持,我們就可以使用來實現。
本文僅作為本人學習過程中的一點心得,歡迎大家拍磚。
PHP從主流來看,是一門面向過程的語言,它的最大缺點就是無法實現多線程管理,其程序的執行都是從頭到尾,按照邏輯一路執行下來,不可能出現分支,這一點是限制php在主流程序語言中往更高級的語言發展的原因之一。
在PHP中我們有的時候其實希望在執行某項操作的時候,同時去執行另外一項操作,舉一個場景:在用戶搶票的時候,你并不希望用戶排隊去連接數據庫進行查詢、判斷、插入,完成之后再返回用戶結果。其實我們并不需要用戶等那么久的時間,用戶提交之后,直接告訴他已經搶票成功了就可以了,至于各種操作,交給后臺去處理就好。當然,這種情況我們現在都用消息列表來處理,把每一個用戶提交的請求存在一個消息列隊中,告訴用戶已經搞定了,用戶愉快的關掉頁面之后,實際上后臺還在一個一個從消息列隊中取出請求進行操作。我們這篇文章則是通過一種異類的手法,實現操作在后臺運行,無需用戶等待。
首先,我們要創建一個請求入口:
其次,我們需要一個后臺處理程序,用戶是否在線并不影響它的運行:
現在的問題是,在第一段代碼中,如何“提交給后臺”?我們通過一種非阻塞式的請求來實現這個功能。也就是創建一個可以被訪問的url,在這個url運行第二段程序,通過一個請求來請求這個url,從而激活第二段程序自動運行。接下來我們直接看代碼:
// 遠程請求(不獲取內容)函數 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);//設置超時 $header = "GET $path HTTP/1.1 "; $header.="Host: $host "; $header.="Connection: close ";//長連接關閉 fwrite($fp, $header); usleep(1000); // 這一句也是關鍵,如果沒有這延時,可能在nginx服務器上就無法執行成功 fclose($fp); return array("error_code" => 0); } }我們創建了一個基于fsockopen的函數,這個函數中利用fsockopen去訪問url,但是在訪問時,并不要求獲取url顯示的內容,而是僅僅發出訪問請求,請求到達后馬上關閉這個訪問。這樣做的好處就是無需再等待被訪問的url是否返回了可靠的信息,節約了時間,這段代碼的執行時間在0.1-0.2秒之間,對于普通訪客而言,幾乎察覺不到。因此,在使用時,僅需要調用這個函數和對應的url即可。不過,這里并沒有提供數據傳輸的部分,如何傳輸數據,其實只需要在$header中增加post的內容即可。
除了fsockopen,curl其實也可以實現這樣的效果,有些主機上并不支持fsockopen,我們就可以使用curl來實現。
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; }這段代碼的關鍵是提供了一個Timeout,僅1秒鐘,也就是說curl發出請求,無論是否接收到返回的內容,1秒鐘之后都會關閉該訪問,因此這個函數的執行數據為1.0-1.1秒之間。但對于用戶來說,如果是一個需要進行數據處理的應用,1秒中的等待幾乎是被忽略的,如果你希望用一段更簡單和容易被理解的代碼,可以選擇curl來實現。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21023.html
摘要:不支持多進程,如果需要異步請求,非阻塞的方式,請選擇。時會發送請求,類型為,是表單提交時最常見的一種。允許函數執行的最長秒數。設定請求中部分的內容。常規的使用來請求,功能強大,使用方便,按需配置。 在PHP后端的開發過程中,除了獲取數據庫的數據和處理數據的內部邏輯,往往還需要請求其他服務器接口的數據,我們一般有3種方式來獲取數據,分別是: file_get_contents fsoc...
摘要:的毫秒級超時也有問題。。中超時實現一初級最簡單的超時實現秒級超時思路很簡單鏈接一個后端,然后設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。實際處理這個調用的部件在完成后,通過狀態通知和回調來通知調用者。 概述 在PHP開發中工作里非常多使用到超時處理到超時的場合,我說幾個場景: 異步獲取數據如果某個后端數據源獲取不成功則跳過,不影響整個頁面展現 為了保...
摘要:此接口主要用于客服等有人工消息處理環節的功能,方便開發者為用戶提供更加優質的服務。不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。 1、關于群發接口和消息接口 關于群發接口1.訂閱號每天可以群發消息一條,服務號每月(自然月)四條的群發權限。開發者模式下,可以通過高級群發接口,實現更靈活的群發能力。2.注意● 對于認證訂閱號,群發接口每天可成功調用1次,此次群發可選擇發送給全...
閱讀 2371·2023-04-25 20:07
閱讀 3307·2021-11-25 09:43
閱讀 3666·2021-11-16 11:44
閱讀 2532·2021-11-08 13:14
閱讀 3182·2021-10-19 11:46
閱讀 899·2021-09-28 09:36
閱讀 2988·2021-09-22 10:56
閱讀 2377·2021-09-10 10:51