我正在尝试使用API​​与服务器通信。

为了更容易,我写了一个脚本,将使用PHP脚本传递API。

我的目标是每秒查询一次API以查看其队列中是否有新消息。

我被建议使用服务器发送的事件方法,让服务器只在有新的东西时才向客户端发送响应。

这是我的PHP脚本

<?php

    // Register autoloader function
    spl_autoload_register('apiAutoloader');
    header("Content-Type: text/event-stream\n\n");

    $config = array('host' => 'server:IP',              //REQUIRED - Server Name
                    'port' => 8018,                     //REQUIRED - Server Port
                    'userID' => 'user',                 //REQUIRED - UserID to login with
                    'password' => '123456',             //REQUIRED - password for the UserID to login with
                    );

    try {

        //create a new instance of icws
        $icws = new API\ICWS($config); 

        //create a new session
        $icws->createSession(true);     

        while(1){

            $result = $icws->processMessage();
            echo json_encode($result);  

            ob_flush();
            flush();
            sleep(1);

        }

    } catch(Exception $e){
        echo $e->getMessage();
    }

    function apiAutoloader($className)
    {
        $className = ltrim($className, '\\');
        $fileName  = '';
        $namespace = '';

        if ($lastNsPos = strripos($className, '\\')) 
        {
            $namespace = substr($className, 0, $lastNsPos);
            $className = substr($className, $lastNsPos + 1);
            $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }

        $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

        $toLoad = dirname(__FILE__).'/'.$fileName;

        if (is_file($toLoad) === true)
        {
            include $toLoad;
        }
    }
?>

当用户访问我的页面时,这是我运行的代码

<script>

    $(function(){

        function isset(a, b){

            if(typeof a !== "undefined" && a){
                return a
            }

            return b;
        }


        var evtSource = new EventSource("poll.php");

        evtSource.onmessage = function(e) {

            $.each(e.data.calls, function(i, item){

                $.each(item, function(z, c){

                    var interactionId = isset(c.interactionId, 0);
                    var Eic_CallDirection = isset(c.Eic_CallDirection, '');
                    var Eic_State = isset(c.Eic_State, '');
                    var AccoRDI_mid = isset(c.AccoRDI_mid, '');
                    var Eic_RemoteAddress = isset(c.Eic_RemoteAddress, '');

                    if(Eic_State == '' || Eic_CallDirection == ''){
                        return;
                    }

                    //incoming call that is not answered
                    if( Eic_CallDirection == 'I' && Eic_State == 'A'){
                        console.log('Incomming Call From ' + Eic_RemoteAddress + ' MID: ' + AccoRDI_mid );
                        return;
                    }

                    //on hold
                    if( Eic_State == 'H'){
                        console.log('Phone number ' + Eic_RemoteAddress + ' is on hold' );
                        return;
                    }

                    //voicemail
                    if( Eic_State == 'M'){
                        console.log('Phone number ' + Eic_RemoteAddress + ' is on leaving a voicemail' );
                        return;
                    }

                    //connected call
                    if(Eic_State == 'C'){
                        console.log('Live Call With ' + Eic_RemoteAddress );
                        return;
                    }

                    //Dialling call
                    if(Eic_State == 'O'){
                        console.log('Dialling ' + Eic_RemoteAddress );
                        return;
                    }

                    //Dialling call
                    if(Eic_State == 'R'){
                        console.log('Outbound call is rining and waiting for answer ' );
                        return;
                    }

                    //Call Disconnected
                    if(Eic_State == 'I' || Eic_State == 'E' ){
                        console.log('Hungup with ' + Eic_RemoteAddress );
                        return;
                    }

                });
            });
        }
    });
</script>

我上面的代码不起作用。

我的控制台里没有任何东西。 但是这个错误Firefox can't establish a connection to the server at /icws/poll.php

我怎样才能让它发挥作用? 我通过PHP脚本实现的方式是否正确?

===============>>#1 票数:1 已采纳

您的事件源php文件的浏览器请求的状态代码是什么? 尝试使用firebug来确保它不是404。

还有关于PHP代码。

根据您在问题中包含的Mozilla来源。 应该命名服务器的正确响应并用换行符分隔

header("Content-Type: text/event-stream\n\n");     
while (1) {     
  echo "event: ping\n"; //event name
  echo 'data: '.json(); //event data
  Echo "\n\n"; //required  

  ob_flush(); flush(); sleep(1);    
 }

事件示例

event: userconnect
data: {"username": "bobby", "time": "02:33:48"} 

event: usermessage
data: {"username": "bobby", "time": "02:34:11", "text": "Hi everyone."} 

===============>>#2 票数:1

为了解决这个问题,我添加了一个类似的监听器事件

        var evtSource = new EventSource("poll.php");

        evtSource.addEventListener("ping", function(e) {

          var obj = JSON.parse(e.data);
          processMessages(obj);

        }, false);

我写了我的processMessages函数

        function processMessages(obj) {

            $.each(obj.calls, function(i, item){

                $.each(item, function(z, c){

                    var interactionId = isset(c.interactionId, 0);
                    var Eic_CallDirection = isset(c.Eic_CallDirection, '');
                    var Eic_State = isset(c.Eic_State, '');
                    var mid = isset(c.mid, '');
                    var account_id = isset(c.account_id, '');
                    var Eic_RemoteAddress = isset(c.Eic_RemoteAddress, '');

                    if(Eic_State == '' || Eic_CallDirection == ''){
                        return;
                    }

                    //incoming call that is not answered
                    if( Eic_CallDirection == 'I' && Eic_State == 'A'){
                    var msg = '';
                        if(mid != ''){
                            msg = ' MID: ' + mid;
                        }

                        if(account_id != ''){
                            msg = ' Account ID: ' + account_id;
                        }
                        console.log('Incomming Call From ' + Eic_RemoteAddress + msg );
                        return;
                    }

                    //on hold
                    if( Eic_State == 'H'){
                        console.log('Phone number ' + Eic_RemoteAddress + ' is on hold' );
                        return;
                    }

                    //voicemail
                    if( Eic_State == 'M'){
                        console.log('Phone number ' + Eic_RemoteAddress + ' is on leaving a voicemail' );
                        return;
                    }

                    //connected call
                    if(Eic_State == 'C'){
                        console.log('Live Call With ' + Eic_RemoteAddress );
                        return;
                    }

                    //Dialling call
                    if(Eic_State == 'O' && Eic_CallDirection = 'O'){
                        console.log('Dialling ' + Eic_RemoteAddress );
                        return;
                    }

                    //Dialling call
                    if(Eic_State == 'R'){
                        console.log('Outbound call is rining and waiting for answer ' );
                        return;
                    }

                    //Call Disconnected
                    if(Eic_State == 'I' || Eic_State == 'E' ){
                        console.log('Hungup with ' + Eic_RemoteAddress );
                        return;
                    }

                });
            });
        }

我的PHP代码看起来像这样

    while(1){

        $result = array('test' => 'This is a test records');
        echo 'event: ping' . "\n";
        echo 'data: ' . json_encode($result) . "\n";    
        echo "\n"; //required  

        ob_flush(); flush(); sleep(1);   

    }

在PHP中很少有人指出。 重要的是在每一行之后\\n在最后一行。 同样重要的是要查找位于我的PHP代码中的关键字ping以及我的javascript代码中的监听器事件。 如果你改变它,你必须在2个地方改变它。

我希望这可以帮助别人 :)

  ask by Jaylen translate from so

未解决问题?本站智能推荐:

1回复

PHP轮询mySQL的服务器发送的事件

后台需要定期将数据发送到连接到Web应用程序的客户端。 这是我设置的脚本: 一切正常,直到有七个客户端将所有东西都加载到Web应用程序上为止。 脚本本身有问题吗? 在我看来,这样做的方式是违反直觉的,因为我正在轮询数据库以发送新事件。 还有其他更好的方法可以从后台应用程序触发
2回复

使用服务器发送的事件发布到PHP?

是否可以像在Ajax中一样使用SSE将POST数据发送到PHP? 我已经使用AJAX已有相当长的一段时间了,但在长轮询技术上却有不好的结果。 我也一直在考虑WebSockets,但似乎有点多余。
1回复

服务器发送的事件轮询导致长时间延迟

我有一个连接器,它将使用cURL和PHP调用RESP API。 我需要每秒调用一种方法来检查新消息,然后对其进行处理。 我使用以下2种方法来处理消息 使用SetInterval() AJAX轮询:每秒调用一次php脚本。 除非我无法阻止从浏览器的不同选项卡同时运行多个SetI
1回复

将SSE发送给特定客户

我有一个网络应用程序,其中教师创建一个类,并能够上传材料并将学生添加到课堂。 学生还可以加入特定的教师班级并下载任何上传的资料。 当教师将材料上载到特定类时,会将服务器发送事件发送到每个连接的客户端,并从客户端执行检查以查明此事件是否与客户端有关。 这是一个代码示例: 我想知道
1回复

服务器发送事件时面对Javascript冒泡

想想HTML5服务器发送的事件(我在服务器端使用php)。 要获取服务器发送的数据,我需要以下代码: 其中chat.php every 4 seconds发送一些数据。 1st 4 second (即0秒到4秒)在页面上单击,我得到1 alert 。 2nd 4 seconds (
1回复

服务器发送事件以显示导航按钮

我有一个网络销售点,并且为某些功能隐藏了一些按钮。 我需要能够让管理员在管理面板中单击“启用”,并且它会立即显示在POS中。 我一直在研究服务器发送事件技术,这似乎是我所需要的,但是我不确定如何实现它。
1回复

基于PHP的查询使用服务器发送事件进行实时聊天。(多对一系统不进行群聊)

我正在尝试使用html服务器发送事件在网站上构建实时聊天查询表单。 我按照本教程作为基础 以下是我打算根据本教程做的事情 在客户端,要求用户输入用户名。这用作唯一聊天记录识别的主键。 客户端和服务器通过监听以下php页面来侦听服务器发送的事件。 当客户端按下发送按钮时
3回复

document.getElementById与jQuery $ html()一起接收服务器发送的事件数据

我正在测试通过SSE接收数据 这是我的stream.php文件: 要接收数据,我使用: 当我使用document.getElementById("result") ,它会重复显示数据。 但是当我使用$("#result").html(e.data) ,它没有。 为什么呢
1回复

客户端从服务器检索聊天消息的最佳方式?

我正在使用JavaScript,jQuery,MySQL和PHP构建聊天应用程序,我只是想知道客户端从服务器检索聊天消息的最佳方式是什么? 我目前的潜在候选人是轮询,长轮询,HTML5服务器发送事件( EventSource )和WebSockets。 哪一个是最快的(即时消息)和最有效的方
1回复

使用名称为“ data:”以外的名称的SSE从服务器检索数据

因此,我正在写这个基本的自定义jQuery插件,该插件将处理基于服务器发送事件的动画进度条(到目前为止:我也计划处理Websocket和Long-Polling Ajax)。 我很想知道服务器发送的数据是否有其他不同的命名方式。 到目前为止,我已经阅读到服务器必须输出如下内容: