PHP を実行するときに、ファイルに複数の操作が含まれる場合、操作が完了するまで待機するとタイムアウトになりやすくなります。このとき、複数の操作を 2 つの PHP ファイル操作に分割することができます。最初の PHP ファイルはいくつかの単純なものを最初に処理し、2 番目のファイルは時間のかかるプログラムを非同期で処理します。たとえば、操作が成功した後にログを記録する必要がある場合、操作が成功したときに戻って、ログを非同期に処理できます。以下では、PHP プログラマーの Lei Xuesong が、PHP で一般的に使用される 4 つの非同期処理ソリューションについて説明します。
1. フロントエンド Ajax 処理を使用します
$.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'} );
2. Popen を使用してローカル ファイルを実行します
curl タイムアウトを 1 に設定します
, そのため、クライアントは 1 秒待つ必要があり、curl リクエストのアドレスは絶対パスである必要がありますpclose(popen('php /var/www/doAsync.php &', 'r'));
4. fsockopen を使用する場合は、ヘッダー部分を自分で結合する必要があります
$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。 Apache を Web サーバーとして使用する場合は、PHP が非同期をサポートできるようにします。まず、Apache 設定ファイル httpd.conf で Enablesendfile をオンに設定する必要があります。
2. 非同期実行される PHP ファイルに次の 2 つの設定を追加することをお勧めします:
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);