PHP를 실행할 때 파일에 여러 작업이 포함되는 경우가 있습니다. 작업이 완료될 때까지 기다리면 쉽게 시간 초과됩니다. 이때 비동기 처리를 고려할 수 있습니다. 여러 작업은 두 개의 PHP 파일 작업으로 나누어집니다. 첫 번째 PHP 파일은 몇 가지 간단한 작업을 먼저 처리할 수 있고, 두 번째 파일은 시간이 많이 걸리는 프로그램을 비동기적으로 처리합니다. 예를 들어 작업이 성공한 후 로그를 기록해야 하는 경우 작업이 성공했을 때 반환된 다음 로그를 비동기적으로 처리할 수 있습니다. 아래에서는 PHP 프로그래머 Lei Xuesong이 PHP에서 일반적으로 사용되는 네 가지 비동기 처리 솔루션을 소개합니다.
1. 프런트엔드 Ajax 처리 사용
$.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'} );
2. popen을 사용하여 로컬 파일 실행
pclose(popen('php /var/www/doAsync.php &', 'r'));
3. 컬
을 사용하여 컬 시간 초과 CURLOPT_TIMEOUT을 1(최소값은 1)로 설정하므로 클라이언트는 1초를 기다려야 하며 컬 요청 주소는 절대 주소여야 합니다. path
$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);
4. fsockopen을 사용할 때 헤더 부분을 직접 연결해야 합니다
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);
참고:
1. Apache를 웹 서버로 사용하려면 먼저 PHP가 비동기식을 지원하도록 활성화해야 합니다. Apache 구성 파일 httpd.conf에서 활성화 endfile을 구성해야 합니다.
2. 비동기적으로 실행되는 PHP 파일에는 다음 두 가지 구성을 추가하는 것이 좋습니다.
ignore_user_abort(true); // 忽略客户端断开 set_time_limit(0); // 设置执行不超时