php执行一段顺序,有可能几毫秒就执行终了,也有可能耗时较长。
例如,用户下单这个事情,假如挪用了些第三方效劳进行发邮件、短信、推送等告诉,可能招致前端不断正在期待。
而有的时分,咱们其实不关怀这些耗时剧本的前往后果,只需执行就好了。这时候候就需求采纳异步的形式执行。
家喻户晓,PHP不间接支持多线程这类货色。咱们能够采纳折中的形式完成。这里次要说的就是fsockopen
。
经过fsockopen发送申请并疏忽前往后果,顺序能够即刻前往。
示例代码:
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET /backend.php HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); /*疏忽执行后果 while (!feof($fp)) { echo fgets($fp, 128); }*/ fclose($fp); }
需求留意的是咱们需求手动拼出header头信息。经过关上正文局部,能够查看申请前往后果,但这时候候又变为同步的了,由于顺序会期待前往后果才完结。
实际测试的时分发现,没有疏忽执行后果,调试的时分每一次城市胜利发送sock申请;但疏忽执行后果,常常看到不胜利发送sock申请。查看nginx日记,发现不少状态码为499的申请。
起初找到了缘由:
fwrite
之后即刻执行fclose
,nginx会间接前往499,没有会把申请转发给php解决。
客户端自动端口申请衔接时,NGINX 没有会将该申请代办署理给下游效劳(FastCGI PHP 过程),这个时分 access log 中会以 499 记载这个申请。
处理计划:
1)nginx.conf添加设置装备摆设
# 疏忽客户端中缀 fastcgi_ignore_client_abort on;
2)fwrite之后应用usleep函数休眠20毫秒:
usleep(20000);
起初测试就不发现失败的状况了。
附上完好代码:
<?php /** * 对象类 * */ class FsockService { public static function post($url, $param){ $host = parse_url($url, PHP_URL_HOST); $port = 80; $errno = ''; $errstr = ''; $timeout = 30; $data = http_build_query($param); // create connect $fp = fsockopen($host, $port, $errno, $errstr, $timeout); if(!$fp){ return false; } // send request $out = "POST ${url} HTTP/1.1\r\n"; $out .= "Host:${host}\r\n"; $out .= "Content-type:application/x-www-form-urlencoded\r\n"; $out .= "Content-length:".strlen($data)."\r\n"; $out .= "Connection:close\r\n\r\n"; $out .= "${data}"; fwrite($fp, $out); //疏忽执行后果;不然期待前往后果 // if(APP_DEBUG === true){ if(false){ $ret = ''; while (!feof($fp)) { $ret .= fgets($fp, 128); } } usleep(20000); //fwrite之后即刻执行fclose,nginx会间接前往499 fclose($fp); } public static function get($url, $param){ $host = parse_url($url, PHP_URL_HOST); $port = 80; $errno = ''; $errstr = ''; $timeout = 30; $url = $url.'?'.http_build_query($param); // create connect $fp = fsockopen($host, $port, $errno, $errstr, $timeout); if(!$fp){ return false; } // send request $out = "GET ${url} HTTP/1.1\r\n"; $out .= "Host:${host}\r\n"; $out .= "Connection:close\r\n\r\n"; fwrite($fp, $out); //疏忽执行后果;不然期待前往后果 // if(APP_DEBUG === true){ if(false){ $ret = ''; while (!feof($fp)) { $ret .= fgets($fp, 128); } } usleep(20000); //fwrite之后即刻执行fclose,nginx会间接前往499 fclose($fp); } } ?>
更多相干php常识,请拜访php教程!
以上就是php中应用fsockopen完成异步申请(代码示例)的具体内容,更多请存眷资源魔其它相干文章!
标签: php开发教程 php开发资料 php开发自学 fsockopen
抱歉,评论功能暂时关闭!