有時候執行PHP時,一個檔案有多個操作,如果等操作完了之後,很容易就超時了。這時我們可以考慮非同步處理,多個操作分割成兩個PHP檔案操作,第一個PHP檔案可以先處理一些簡單的,第二個檔案在非同步處理耗時的程式。舉個例子,例如我們操作成功後需要記錄日誌,這個時候我們就可以操作成功就返回,然後非同步處理記錄日誌。以下PHP程式設計師雷雪松帶大家來看看PHP四種常用的非同步處理解決方案。
1、使用前端Ajax處理
$.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'} );
2、使用popen,執行本機檔案
pclose(popen('php /var/www/doAsync.php &', 'r'));
3、使用curlOUTp
$param = array( 'name'=>'raykaeso', 'job'=>'PHP Programmer' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com/doAsync.php"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param)); //将数组转换为URL请求字符串 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_exec($ch); curl_close($ch);
客戶端要等待1秒,curl請求位址必須為絕對路徑
function doRequest($url, $param=array(),$timeout =10){ $urlParmas = parse_url($url); $host = $urlParmas['host']; $path = $urlParmas['path']; $port = isset($urlParmas['port'])? $urlParmas['port'] :80; $errno = 0; $errstr = ''; $fp = fsockopen($host, $port, $errno, $errstr, $timeout); $query = isset($param)? http_build_query($param) : ''; $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); } $url = 'http://www.example.com/doAsync.php'; $param = array( 'name'=>'raykaeso', 'job'=>'PHP Programmer' ); doRequest($url, $param);
4、使用fsockopen,需要自己拼接header部分
ignore_user_abort(true); // 忽略客户端断开 set_time_limit(0); // 设置执行不超时