PHP之异步处理

PHP之 异步处理

个人理解在项目中使用消息队列一般是有如下几个原因:

1.把瞬间服务器的请求处理换成异步处理,缓解服务器的压力
2.实现数据顺序排列获取
  • redis 队列 实现 异步处理的效果
connect('127.0.0.1',6379);
    for($i=0;$i<50;$i++){
        try{
            $redis->LPUSH('click',rand(1000,5000));
        }catch(Exception $e){
            echo $e->getMessage();
    }
}
在后台进行数据处理 守护进程 去处理数据
pconnect('127.0.0.1',6379);
    while(true){
        try{
            $value = $redis->LPOP('click');
            if(!$value){
                break;
            }
            var_dump($value)."\n";
        /*
        * 利用$value进行逻辑和数据处理
        */
        }catch(Exception $e){
            echo $e->getMessage();
        }
}
  • 使用ajax 去处理
// 使用ajax 去请求另外一个方法
$.get("doAsync.php", { name: 'raykaeso',job:'PHP    Programmer'});
  • 使用popen,执行本地文件
  • 使用curl
设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒,curl请求地址必须为绝对路径
'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);
  • 使用fsockopen,需要自己拼接header部分
'raykaeso',
    'job'=>'PHP Programmer'
    );
doRequest($url, $param);

注意:

1、如果使用Apache作为Web服务器,让PHP支持异步首先必须得在Apache配置文件httpd.conf配置enablesendfile on。
2、在异步执行的PHP文件中建议加上一下两个配置:
ignore_user_abort(true); // 忽略客户端断开
set_time_limit(0); // 设置执行不超时

最后,引入 鸟哥 的 经典 fsockopen 分装 代码:

 

 $v){
                        $_cookie .= $k."=".$v."; ";
                }
                $cookie_str =  "Cookie: " . base64_encode($_cookie) ." \r\n";//传递Cookie
                $header .= $cookie_str;
        }
        if(!empty($post_data)){
                $_post = strval(NULL);
                foreach($post_data as $k => $v)…{
                        $_post .= $k."=".$v."&";
                }
                $post_str  = "Content-Type: application/x-www-form-urlencoded\r\n";//POST数据
                $post_str .= "Content-Length: ". strlen($_post) ." \r\n";//POST数据的长度
                $post_str .= $_post."\r\n\r\n "; //传递POST数据
                $header .= $post_str;
        }
        fwrite($fp, $header);
        //echo fread($fp, 1024); //我们不关心服务器返回
        fclose($fp);
        return true;
}

你可能感兴趣的:(php,nosql(redis,mamcached,mogodb),php,异步处理,redis)