当前位置:Gxlcms > PHP教程 > Ajax请求Redis的订阅操作无返回

Ajax请求Redis的订阅操作无返回

时间:2021-07-01 10:21:17 帮助过:30人阅读

界面上有一个按钮,点击向后台发送Ajax请求,请求的文件内容:

redis.php:

  1. <code class="php">ini_set('default_socket_timeout',25);
  2. $redis = new Redis();
  3. $conn = $redis->connect('127.0.0.1','6379');
  4. if($conn){
  5. $redis->subscribe(array('XGD'),'ckr');
  6. }else{
  7. echo '本地Redis无法连接!';
  8. exit;
  9. }
  10. function ckr($instance,$channel,$msg){
  11. echo $msg;
  12. }</code>

然后在服务器模拟向频道XGD发布消息,发布操作代码:

Publish.php:

  1. <code class="php">$redis = new Redis();
  2. $conn = $redis->connect('127.0.0.1','6379');
  3. if($conn){
  4. $i=0;
  5. while(true){
  6. sleep(1);
  7. $i++;
  8. $respose['id'] = uniqid();
  9. $respose['v_ltl_status'] = uniqid();
  10. $respose['ltl_time'] = uniqid();
  11. $respose['ltl_reckon'] = uniqid();
  12. $respose['ltl_cardno'] = uniqid();
  13. $respose['card_type'] = uniqid();
  14. $respose['card_name'] = uniqid();
  15. $respose['ltl_cardflag'] = uniqid();
  16. $respose['rsd_bicc'] = uniqid();
  17. $respose['v_ltl_type'] = uniqid();
  18. $res_json = json_encode(array('result'=>$respose));
  19. $redis->publish('XGD',$res_json);
  20. //echo '数据已经发布'.$i.'<br>';
  21. }
  22. }else{
  23. echo '本地Redis无法连接!';
  24. exit;
  25. }</code>

服务器使用Centos6.5, 在服务端用php命令运行publish.php,
同时进入本地redis-cli命令行,执行命令: subscribe XGD,
界面就循环出现订阅频道发布的内容,重新开启一个命令终端,用php命令执行redis.php,在命令行也出现了订阅频道发布的信息,问题是:
在Web前端的Ajax请求总是运行超时,没有返回结果。不知道为什么,还请各位大神赐教。

Ajax代码是:

  1. <code class="javascript">function loadResult(){
  2. //$.pdialog.open("__URL__/getRedisInfo",'operate','操作结果',{'width':'700','height':'400','mask':true});
  3. var dt = new Date();
  4. var ts = dt.getTime();
  5. $.ajax({
  6. cache : false,
  7. type : 'post',
  8. url : '/redis.php',
  9. global: false,
  10. dataType : 'json',
  11. async : true,
  12. data:{time:ts},
  13. timeout:1000,
  14. success:function(data){
  15. $(".redis").html($(".redis").html()+data.result);
  16. },
  17. complete:function(){
  18. loadResult();
  19. }
  20. })
  21. }</code>

(项目使用了Thinkphp+DWZ)

================================================================

回复内容:

界面上有一个按钮,点击向后台发送Ajax请求,请求的文件内容:

redis.php:

  1. <code class="php">ini_set('default_socket_timeout',25);
  2. $redis = new Redis();
  3. $conn = $redis->connect('127.0.0.1','6379');
  4. if($conn){
  5. $redis->subscribe(array('XGD'),'ckr');
  6. }else{
  7. echo '本地Redis无法连接!';
  8. exit;
  9. }
  10. function ckr($instance,$channel,$msg){
  11. echo $msg;
  12. }</code>

然后在服务器模拟向频道XGD发布消息,发布操作代码:

Publish.php:

  1. <code class="php">$redis = new Redis();
  2. $conn = $redis->connect('127.0.0.1','6379');
  3. if($conn){
  4. $i=0;
  5. while(true){
  6. sleep(1);
  7. $i++;
  8. $respose['id'] = uniqid();
  9. $respose['v_ltl_status'] = uniqid();
  10. $respose['ltl_time'] = uniqid();
  11. $respose['ltl_reckon'] = uniqid();
  12. $respose['ltl_cardno'] = uniqid();
  13. $respose['card_type'] = uniqid();
  14. $respose['card_name'] = uniqid();
  15. $respose['ltl_cardflag'] = uniqid();
  16. $respose['rsd_bicc'] = uniqid();
  17. $respose['v_ltl_type'] = uniqid();
  18. $res_json = json_encode(array('result'=>$respose));
  19. $redis->publish('XGD',$res_json);
  20. //echo '数据已经发布'.$i.'<br>';
  21. }
  22. }else{
  23. echo '本地Redis无法连接!';
  24. exit;
  25. }</code>

服务器使用Centos6.5, 在服务端用php命令运行publish.php,
同时进入本地redis-cli命令行,执行命令: subscribe XGD,
界面就循环出现订阅频道发布的内容,重新开启一个命令终端,用php命令执行redis.php,在命令行也出现了订阅频道发布的信息,问题是:
在Web前端的Ajax请求总是运行超时,没有返回结果。不知道为什么,还请各位大神赐教。

Ajax代码是:

  1. <code class="javascript">function loadResult(){
  2. //$.pdialog.open("__URL__/getRedisInfo",'operate','操作结果',{'width':'700','height':'400','mask':true});
  3. var dt = new Date();
  4. var ts = dt.getTime();
  5. $.ajax({
  6. cache : false,
  7. type : 'post',
  8. url : '/redis.php',
  9. global: false,
  10. dataType : 'json',
  11. async : true,
  12. data:{time:ts},
  13. timeout:1000,
  14. success:function(data){
  15. $(".redis").html($(".redis").html()+data.result);
  16. },
  17. complete:function(){
  18. loadResult();
  19. }
  20. })
  21. }</code>

(项目使用了Thinkphp+DWZ)

================================================================

阻塞模式,不会结束,所以就超时,你在callback里面exit看看?

人气教程排行