个人理解在项目中使用消息队列一般是有如下几个原因:
1.把瞬间服务器的请求处理换成异步处理,缓解服务器的压力
2.实现数据顺序排列获取
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 去请求另外一个方法
$.get("doAsync.php", { name: 'raykaeso',job:'PHP Programmer'});
设置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);
'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;
}