海天无影Blog

php异步处理

/ 2092阅 / 0评 / 0

前段时间在弄微信公众账号二次开发的时候碰到这样一个问题,微信服务器和我们公众账号接口的握手时间为5秒,超过这个时间后,我们如果没有返回数据给微信服务器,那么就等于断开了这次握手,最糟糕的情况就是用户收不到回复,用户体验大打折扣。很多朋友会说5秒钟的话应该够长的了,够服务器处理了。但是如果服务器配置不高,函数需要处理的数据库资源很大,需要远程截取的内容有延时等好多情况都有可能超过了5秒。这个时候就需要先将信息返回个用户,将占用时间较长的函数异步处理。

在网上看了几个方法,那些需要改动服务器组件的方法就不说了,海天技术还不到家,这里就来说说最常用的php伪异步处理方法吧,其实就是用fscokopen重新打开一个页面进行处理。

操作简述如下:

首先将源程序的占用时间较长的函数,重新建一个php页面,例如为2.php

然后在源程序1.php中使用fscokopen打开2.php

1.php代码

<?php
echo time().'<br>';
echo 'call asyn_sendmail<br>';
$fp = fsockopen("www.gan580.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /sendmail.php?hello=hahahah   HTTP/1.1\r\n";
$out .= "Host: www.gan580.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
sleep(1);
}
echo time()
?>
<?php
echo time().'<br>';
echo '1秒后<br>';
$fp = fsockopen("www.123.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET /2.php?hello=hahahah   HTTP/1.1\r\n";
$out .= "Host: www.123.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
/*忽略执行结果
while (!feof($fp)) {
echo fgets($fp, 128);
}*/
fclose($fp);
sleep(1);
}
echo time()
?>

可以看出fscokopen是可以传递参数的,还是很强大的。

2.php

<?php

$hello=$_GET['hello'];

sleep(10);

fopen($hello.time(),  "w");

?>

结果:运行1.php后应该会得到当前时间和1秒后时间,然后过10秒后会在同级目录下发现“hello+10秒后时间”的文件,异步处理运行成功

评论已关闭。