PHP异步处理的实现方案
有时候执行PHP时,一个文件有多个操作,如果等操作完了之后,很容易就超时了。这时我们就可以考虑异步处理,多个操作划分成两个PHP文件操作,第一个PHP文件可以先处理一些简单的,第二个文件在异步处理耗时的程序。举个例子,比如我们操作成功后需要记录日志,这个时候我们就可以操作成功就返回,然后异步处理记录日志。下面雷雪松带大家看一下PHP四种常用的异步处理解决方案。
1、使用前端Ajax处理
1 | $.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'} ); |
2、使用popen,执行本地文件
1 | pclose(popen('php /var/www/doAsync.php &', 'r')); |
3、使用curl
设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒,curl请求地址必须为绝对路径
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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,需要自己拼接header部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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作为Web服务器,让PHP支持异步首先必须得在Apache配置文件httpd.conf配置enablesendfile on。
2、在异步执行的PHP文件中建议加上一下两个配置:
1 2 | ignore_user_abort(true); // 忽略客户端断开 set_time_limit(0); // 设置执行不超时 |
来源:PHP异步处理的实现方案
2016年9月9日 下午8:19
分享网上赚钱靠谱的方法
2016年9月10日 上午8:38
你的博客非常不错哦,我的个人网站 http://www.javaxxz.com 相互学习下。
2019年5月8日 下午11:41
哇塞,居然是沙发?留个名
2019年5月10日 下午11:56
先回复,再欣赏。