首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器从polling发送的事件

服务器从polling发送的事件
EN

Stack Overflow用户
提问于 2013-05-26 01:01:54
回答 1查看 2.6K关注 0票数 0

后台需要定期向连接到web应用程序的客户端发送数据。下面是我设置的脚本:

代码语言:javascript
复制
<?php
header("Content-Type: text/event-stream\n\n");
header('Cache-Control: no-cache');

flush();
ob_flush();

require_once('connect.php');
//connect to the database
$mysql = mysql_connect($hostname, $username, $password) or die ('cannot reach database');
$db = mysql_select_db($database) or die ("this is not a valid database");
mysql_query("SET NAMES 'utf8'", $mysql);

$query = mysql_query("SELECT * FROM `clientEvents` ORDER BY id DESC LIMIT 1") or die(mysql_error());
    $row = mysql_fetch_array($query);
    $index = $row["id"];
    echo $index;

loop($index);

function loop($index){
while (1)
{
    ob_implicit_flush(true);
    $buffer = str_repeat(" ", 4096);
    echo $buffer."\n";

// Every second, look for new question.

$query = mysql_query("SELECT * FROM `clientEvents` WHERE id>$index ORDER BY id DESC LIMIT 1") or die(mysql_error());
$row = mysql_fetch_array($query);
if(mysql_num_rows($query)>0)
{
    if($row["type"]=="pushCustomQuestion"){
     pushCustomQuestion($row["data"],$row["id"]);
     break;
    }
    else if($row["type"]=="pushGameTimeEvent"){
     pushGameTimeEvent($row["data"],$row["id"]);
     break;
    }
}
sleep(3);
}

function pushGameTimeEvent($id,$index) {
    //echo "id for game event:".$id;
    $result = mysql_fetch_array(mysql_query("SELECT * FROM game_events WHERE id = $id LIMIT 1"));

    //$num_results = mysql_num_rows($result); 

    echo "event: new_game_event\n";
    echo 'data: {   "id": "' . $result['id'] . '",' 
                    .'"match_id": "' . $result['match_id'] . '",' 
                    .'"minute": "' . $result['minute'] . '",' 
                    .'"event_id": "' . $result['event_id'] . '",' 
                    .'"event_name": "' . $result['event_description'] . '",' 
                    .'"player_name": "' . $result['player1_name']. '",' 
                    .'"player2_name": "' . $result['player2_name'] . '",'
                    .'"which_half": "' . $result['which_half'] . '",'
                    .'"team_logo": "' . $result['team_logo'] . '"}';
    echo "\n\n";
    ob_flush();
    flush();
    sleep(10);
    loop($index);
}

一切似乎都很正常,直到七个客户端加载了web应用程序,所有东西都被占用。脚本本身有什么问题吗?

在我看来,我这样做是违反直觉的,因为我轮询数据库是为了发送一个新的事件。有没有其他更好的方法从后台应用程序触发事件?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-26 04:20:54

这很可能与Apache对一次可以像这样连接的人数的限制有关。

这是一个很棒的长轮询教程,与您设置的稍有不同:http://elikirk.com/2012/04/17/php-ajax-long-polling-comet-demonstration/

但是如果你想要扩展,长轮询并不是实时“推送”的最佳解决方案。

我建议看看node.js和sockets.io,因为这些技术是专门针对这一点的。缺点是node.js本质上是它自己的服务器,运行javascript,所以你必须放弃php。但是也有一些变通方法,你可以通过CURL在node.js和php之间架起桥梁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16751899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档