最近在业务开发的过程中遇到一个问题,需要时时发送异步请求而不用的等待结果的返回,我们具体来聊下:
业务场景:记录所有用户操作行为的日志并且上报到某个服务器地址进行入库处理,所以这时需要的是异步处理这些上报的日志请求,忽略返回值。
PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。还有一种更简单的方式,可用于 Web 程序中,那就是用 fsockopen()、fputs() 来请求一个 URL 而无需等待返回,如果你在那个被请求的页面中做些事情就相当于异步了
fscokopen()函数:fsockopen支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分,可以参考官网文档: http://cn.php.net/fsockopen/。
下面是我实现的简单例子:
/**
* 发起异步请求,忽略返回值
* @param $url
* @param array $params
* @return bool
*/
public static function asyncPost($url, $params = [])
{
$args = parse_url($url); //对url做下简单处理
$host = $args['host']; //获取上报域名
$path = $args['path'] . '?' . http_build_query($params);//获取上报地址
$fp = fsockopen($host, 80, $error_code, $error_msg, 1);
if (!$fp) {
Yii::error($error_code . '