前言: 繼上一篇中說的第一種方法實現(自己測試用的,所以一切從簡)
方法的思路:
PHP本身不存在異步功能,所以我們拼接出http請求以及PHP本身自帶的fsockopen、fwrite方法來實現。
過程:
在Controller中創建一個方法,控制器命名為TestController,其中的代碼如下(注釋掉的為post請求,我們先講get請求)
http_build_query 方法: 生成 URL-encode 之后的請求字符串(此處用來拼接我們Get請求所要發送的數據)。
fsockopen 方法(重點理解該方法,明白它的作用): 打開一個網絡連接或者一個Unix套接字連接(此為手冊中的描述並不容易理解)。第一個參數為主機名,如果你是在本地測試,可以像我一樣給;第二個參數端口號:給服務器的80端口;
接下去的參數分別是一個存放錯誤編號的變量、一個存放錯誤信息字符串的變量和超時等待時間(此方法可以詳細的去看手冊上的描述以及百度上網友的理解分享)。該方法如果執行成功將會返回一個文件句柄(資源)
之后可以被其他文件類函數調用(例如:fgets(),fgetss(),fwrite(),fclose()還有feof())。如果調用失敗,將返回FALSE
。
接下來就是拼接的Get請求, 其中的Url即是該http請求請求得路徑,該請求執行的方法如下,該方法向一個文件中寫入拼接的字符串(此處沒有貼出發送郵件的代碼,只需要將此處的內容換成發送郵件以及一系列處理的代碼即可)
在瀏覽器中執行第一個路由,完成后馬上會看到頁面顯示的執行完畢,並且文件中有了寫入的字符串,這表示我們的PHP異步Get請求成功了,但是使用get請求發送郵件是不合適的,因為他不能攜帶太多數據,而郵件的內容有可能包含大量的數據
所以我們還是需要使用post請求(由於本人的post請求一直不能正常執行成功,並且還未能找到原因,所以不多做闡述,解決了問題便會補上)。
總結:
http請求通過fsockopen打開的socket通道利用流的形式發送了請求,並在后台執行,但是這樣做的弊端就是我們沒辦法對其進行監控,只能將想要的結果存到數據庫等,然后再在其它頁面查看記錄的結果
以上純屬個人理解,緊當筆記使用。