>  기사  >  백엔드 개발  >  PHP 비동기 처리 구현 계획

PHP 비동기 처리 구현 계획

阿神
阿神원래의
2017-01-24 14:16:032969검색

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); // 设置执行不超时
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.