客戶端與服務(wù)器端是通過(guò)HTTP協(xié)議進(jìn)行連接通訊,客戶端發(fā)起請(qǐng)求,服務(wù)器端接收到請(qǐng)求后執(zhí)行處理刻像,并返回處理結(jié)果。
有時(shí)服務(wù)器需要執(zhí)行很耗時(shí)的操作并闲,這個(gè)操作的結(jié)果并不需要返回給客戶端细睡。但因?yàn)閜hp是同步執(zhí)行的,所以客戶端需要等待服務(wù)處理完才可以進(jìn)行下一步帝火。
因此對(duì)于耗時(shí)的操作適合異步執(zhí)行纹冤,服務(wù)器接收到請(qǐng)求后,處理完客戶端需要的數(shù)據(jù)就返回购公,再異步在服務(wù)器執(zhí)行耗時(shí)的操作萌京。
實(shí)例:(使用fsockopen方式)
異步文件 test.php
<?php
$url = 'http://test.hjy.com/1.php';
$param = array(
'name'=>'hjy',
'gender'=>'man',
'age'=>22
);
ignore_user_abort(true); // 忽略客戶端斷開(kāi)
set_time_limit(0); // 設(shè)置執(zhí)行不超時(shí)
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.php(一般寫(xiě)耗時(shí)任務(wù))
<?php
echo '程序開(kāi)始';
sleep(10);
echo '程序結(jié)束';