Sometimes when executing PHP, a file has multiple operations. If you wait for the operation to be completed, it will easily time out. At this time, we can consider asynchronous processing. Multiple operations are divided into two PHP file operations. The first PHP file can process some simple ones first, and the second file processes time-consuming programs asynchronously. For example, if we need to record a log after the operation is successful, then we can return when the operation is successful, and then process the log asynchronously. Below, PHP programmer Lei Xuesong takes you through four commonly used asynchronous processing solutions in PHP.
1. Use front-end Ajax processing
$.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'} );
2. Use popen to execute local files
pclose(popen('php /var/www/doAsync.php &', 'r'));
3. Use curl
to set the curl timeout CURLOPT_TIMEOUT to 1 (minimum is 1), so the client needs to wait for 1 second, and the curl request address must be an absolute 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. When using fsockopen, you need to splice the header part yourself
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);
Note:
1. If you use Apache as a web server, you must first enable PHP to support asynchronous You must configure enablesendfile on in the Apache configuration file httpd.conf.
2. It is recommended to add the following two configurations to the asynchronously executed PHP file:
ignore_user_abort(true); // 忽略客户端断开 set_time_limit(0); // 设置执行不超时