php異步調用方法


本文為大家講述了php異步調用方法,分享給大家供大家參考,具體內容如下
客戶端與服務器端是通過HTTP協議進行連接通訊,客戶端發起請求,服務器端接收到請求后執行處理,並返回處理結果。
有時服務器需要執行很耗時的操作,這個操作的結果並不需要返回給客戶端。但因為php是同步執行的,所以客戶端需要等待服務處理完才可以進行下一步。
因此對於耗時的操作適合異步執行,服務器接收到請求后,處理完客戶端需要的數據就返回,再異步在服務器執行耗時的操作。
1.使用Ajax 與 img 標記
原理,服務器返回的html中插入Ajax 代碼或 img 標記,img的src為需要執行的程序。
優點:實現簡單,服務端無需執行任何調用
缺點:在執行期間,瀏覽器會一直處於loading狀態,因此這種方法並不算真正的異步調用。

1
2
$.get( "doRequest.php" , { name: "fdipzone" } );
<img src= "doRequest.php?name=fdipzone" >

2.使用popen
使用popen執行命令,語法:

1
2
3
// popen — 打開進程文件指針 
resource popen ( string $command , string $mode )
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://www.example.com/doRequest.php'
   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
29
30
31
32
33
34
35
36
37
38
<?php
    
$url = 'http://www.example.com/doRequest.php' ;
$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);    // 設置執行不超時

以上就是php異步調用方法的詳細介紹,希望對大家的學習有所幫助。

轉載自:https://www.jb51.net/article/76909.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM