php 非同步呼叫方法
客戶端與伺服器端是透過HTTP協定進行連接通訊,客戶端發起請求,伺服器端接收請求後執行處理,並傳回處理結果。
有時伺服器需要執行很耗時的操作,這個操作的結果並不需要回傳給客戶端。但因為php是同步執行的,所以客戶端需要等待服務處理完才可以進行下一步。
因此對於耗時的操作適合異步執行,伺服器接收到請求後,處理完客戶端所需的資料就返回,再異步在伺服器執行耗時的操作。
1.使用Ajax 與img 標記
原理,伺服器傳回的html中插入Ajax 程式碼或img 標記,img的src為需要執行的程式。
優點:實作簡單,服務端無需執行任何呼叫
缺點:在執行期間,瀏覽器會一直處於loading狀態,因此這種方法並不算真正的非同步呼叫。
1 | $.get( "doRequest.php" , { name: "fdipzone" } );
|
登入後複製
1 | <img src= "doRequest.php?name=fdipzone" >
|
登入後複製
2.使用popen
#使用popen執行指令,語法:
1 2 | resource popen ( string $command , string $mode )
|
登入後複製
1 | pclose(popen('php /home/fdipzone/doRequest.php &', 'r'));
|
登入後複製
優點:執行速度快
#缺點:1.只能在本機執行
2.無法傳遞大量參數
3.存取量高時會建立許多流程。
3.使用curl
#設定curl的逾時時間CURLOPT_TIMEOUT 為1 (最小為1),因此客戶端需要等待1秒
1 2 3 4 5 6 7 8 9 10 11 | <?php
$ch = curl_init();
$curl_opt = array (
CURLOPT_URL, 'http:
CURLOPT_RETURNTRANSFER,1,
CURLOPT_TIMEOUT,1
);
curl_setopt_array( $ch , $curl_opt );
curl_exec( $ch );
curl_close( $ch );
?>
|
登入後複製
4.使用fsockopen
fsockopen是最好的,缺點就是需要自己拼接header部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php
$url = 'http:
$param = array (
'name'=>'fdipzone',
'gender'=>'male',
'age'=>30
);
doRequest( $url , $param );
function doRequest( $url , $param = array ()){
$urlinfo = parse_url ( $url );
$host = $urlinfo ['host'];
$path = $urlinfo ['path'];
$query = isset( $param )? http_build_query( $param ) : '';
$port = 80;
$errno = 0;
$errstr = '';
$timeout = 10;
$fp = fsockopen ( $host , $port , $errno , $errstr , $timeout );
$out = "POST " . $path . " HTTP/1.1\r\n" ;
$out .= "host:" . $host . "\r\n" ;
$out .= "content-length:" . strlen ( $query ). "\r\n" ;
$out .= "content-type:application/x-www-form-urlencoded\r\n" ;
$out .= "connection:close\r\n\r\n" ;
$out .= $query ;
fputs ( $fp , $out );
fclose( $fp );
}
?>
|
登入後複製
注意:當執行過程中,客戶端連線中斷或連線逾時,都會有可能造成執行不完整,因此需要加上
1 2 | ignore_user_abort(true);
set_time_limit(0);
|
登入後複製
Tips:關於fsockopen的介紹與用法可以參考我之前寫的《php
利用fsockopen GET/POST 提交表單及上傳檔案》與《PHP HTTP請求類,支援GET,POST,Multipart/form-data》
本篇講解如何使用php 非同步呼叫方法,更多相關內容請關注php中文網。
相關建議:
關於php 字串壓縮方法之間的比較
關於php Timer 頁面執行時間監測類別的相關介紹
關於php 建構子支援不同個數字參數的方法介紹
#
以上是如何使用php 非同步呼叫方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!