转自:点击打开链接
php本身是没有异步的,但我们经常会需要处理一些耗时操作,如微信公号推送给所有用户,发送邮件、短信等等。
实现的方式也是很多,gearman、队列等等。这里我用fscokopen,简单易操作,不用去管服务器那边的事情。
function asyncHandle($url, $post_data = ''){
$info = parse_url($url);
$fp = fsockopen($info["host"], 80, $errno, $errstr, 30);
$head = "POST ".$info['path']."?".$info["query"]." HTTP/1.0\r\n";
$head .= "Host: ".$info['host']."\r\n";
$head .= "Referer: http://".$info['host'].$info['path']."\r\n";
$head .= "Content-type: application/x-www-form-urlencoded\r\n";
$head .= "Content-Length: ".strlen(trim($post_data))."\r\n";
$head .= "Connection: Close\r\n";
$head .= "\r\n";
$head .= trim($post_data);
$write = fputs($fp, $head);
// while (!feof($fp))
// {
// $line = fread($fp,4096);
// echo $line;
// }
fclose($fp);
return true;
}
之前也试过这个 可以做到发送完请求就关闭返回,不用等待结果。拿微信推送消息来说,这个接收的不是键值对那样的传参方式,而是一段json格式的数据,我post json数据没解决,一直出现post data empty。无奈之下只能通过fsockopen先调用自己服务器上已经写好的方法,通过这个方法再去执行消息的推送,带上必要的参数(key=value&key2=value2),这样就达到了异步的效果。