首頁  >  文章  >  後端開發  >  PHP非同步處理的實作方案

PHP非同步處理的實作方案

阿神
阿神原創
2017-01-24 14:16:032985瀏覽

有時候執行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);

3、使用curlOUT

客戶端要等待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); // 设置执行不超时


注意:

🎜1、如果使用Apache作為WebWeb,讓PHPpache支援伺服器首先必須得在Apache設定檔httpd.conf設定enablesendfile on。 🎜2、在非同步執行的PHP檔案中建議加上兩個設定:🎜rrreee
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn