ホームページ  >  記事  >  バックエンド開発  >  PHP非同期処理の実装計画

PHP非同期処理の実装計画

阿神
阿神オリジナル
2017-01-24 14:16:032974ブラウズ

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);

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。