【问题标题】:Elephant.io Client not workingElephant.io 客户端不工作
【发布时间】:2015-03-04 04:12:02
【问题描述】:

我有一个基于 socket.io 的 Websocket-Server,它应该从 php 应用程序获取通知。我找到了http://elephant.io/,这似乎是执行此操作的正确库。似乎大象.io 已针对作曲家进行了优化,因为如果没有它们,我找不到任何使用它的示例,并且通过我自己的尝试,我得到了无尽的错误,包括丢失的包含文件。

所以我第一次安装了composer,并且在lib\composer文件夹中安装了elephant.io包,所以这个库的所有文件都位于lib\composer\vendor\wisembly中。 http://elephant.io/#usage 的示例不起作用,因为客户端的构造函数不接受这些参数。它只有两个参数,第一个参数必须是 ElephantIO\EngineInterface 的实例,所以我尝试了以下方法:

error_reporting(E_ALL);
ini_set('display_errors', true);

require_once __DIR__ . '/lib/composer/vendor/autoload.php';

use ElephantIO\Client as Elephant;
use ElephantIO\Engine\SocketIO as Version1X;

$elephant = new Elephant(new Version1X('http://mywsserver.com:8000'));

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

但它也不起作用:

Fatal error: Class 'ElephantIO\Engine\SocketIO' not found in C:\inetpub\wwwroot\test.php on line 11

我是作曲家的新手,但对我来说,这个系统似乎应该通过包含自动加载器文件来处理所有包含的东西。

我只想将通知从 php-app 发送到 socket.io 服务器,这似乎很难做到。我找到的唯一选择是https://github.com/rase-/socket.io-php-emitter,但这需要redis。我不喜欢这样,因为我使用的是 Windows,而我的应用程序不会从 redis 中获利,因为我只有一台服务器。

难道没有一种简单的方法可以做到这一点吗?我在使用 socket.io 之前使用了 phpws,这很有效,但是 socket.io 似乎是一个更好的解决方案,而不是我之前用作服务器的 .NET 库,所以我更愿意继续使用 socket.io。

【问题讨论】:

    标签: php sockets websocket socket.io phpwebsocket


    【解决方案1】:

    我之前使用过 ElephantIO,我所做的是创建自己的 php 自动加载器。作曲家应该已经完成​​了,但无法从代码中看到您出错的地方。无论如何,这是我的 autoloader.php

    require_once("src/Client.php");
    require_once("src/EngineInterface.php");
    require_once("src/AbstractPayload.php");
    require_once("src/Exception/SocketException.php");
    require_once("src/Exception/MalformedUrlException.php");
    require_once("src/Exception/ServerConnectionFailureException.php");
    require_once("src/Exception/UnsupportedActionException.php");
    require_once("src/Exception/UnsupportedTransportException.php");
    
    require_once("src/Engine/AbstractSocketIO.php");
    require_once("src/Engine/SocketIO/Session.php");
    require_once("src/Engine/SocketIO/Version0X.php");
    require_once("src/Engine/SocketIO/Version1X.php");
    require_once("src/Payload/Decoder.php");
    require_once("src/Payload/Encoder.php");
    

    【讨论】:

    • 为什么他们不把 autoloader.php 放在源代码中?
    • 公平地说,我在它还处于测试阶段时就使用了它,所以我不得不这样做。如果它现在不能开箱即用,我会感到惊讶
    • 我还创建了自己的自动加载。我不知道他们为什么不包括它。
    【解决方案2】:

    我使用以下方法解决了这个问题:

    use ElephantIO\Engine\SocketIO\Version1X as Version1X;
    

    代替:

    use ElephantIO\Engine\SocketIO as Version1X;
    

    然后:

    $Elephant   =   new Elephant(new Version1X("http://localhost:8000"));
    var_dump($Elephant);
    

    结果:

    对象(ElephantIO\Client)#8 (2) { ["engine":"ElephantIO\Client":private]=> 对象(ElephantIO\Engine\SocketIO\Version1X)#9 (4) { ["url":protected]=> array(6) { ["scheme"]=> string(4) "http" ["host"]=> string(9) "localhost" ["query"]=> array(0) { } ["path"]=> string(9) "socket.io" ["port"]=> int(8000) ["secured"]=> bool(false) } ["session":protected]=> NULL ["options":protected]=> array(7) { ["context"]=> array(0) { } ["debug"]=> bool(false) ["wait"]=> int(100000) ["timeout"]=> string(2) "60" ["version"]=> int(2) ["use_b64"]=> bool(false) ["transport"]=> string(7) "polling" } ["stream":protected]=> NULL } ["logger":"ElephantIO\Client":private]=> 空}

    【讨论】:

      【解决方案3】:

      您需要回顾一下您对 PHP 命名空间的概念,正如 Mfaspk 的回答所建议的那样。

      我们不能在包中包含自动加载器,因为它是一个库,而不是应用程序本身;它将包含在其他库中。因此,您自己的应用程序中的自动加载器应该负责自动加载,而不是库(否则,如果每个库都需要注册自己的自动加载系统,那将是一个无法维护的混乱)

      顺便说一句,网站上的文档不是最新的(我们应该花一点时间来处理这些东西......)。正如自述文件中提到的那样,有一个简单的示例显示了基本的操作方法:https://github.com/Wisembly/elephant.io/tree/master/example/socket.io/1.x/emitter

      抱歉耽搁了,我没有经常检查 stackoverflow,特别是关于 Elephant.io 的主题:)

      【讨论】:

      • 你的库很棒,我不是这些问题的专家,但你们真的需要像这样的自动加载器https://github.com/rmccue/Requests。否则安装是一团糟。甚至类/文件名也没有前缀来编写通用自动加载器。我可以使用作曲家,但我在代码中丢失了我的框架库样式
      • 你不需要特别有作曲家(虽然这是推荐的方式)。我应该补充一点,它使用的是 PSR-4 加载系统,所以人们可以适应他们的目录架构? WDYT ?
      • 当然也可以,这也是我所做的。但是像 Requests 中的静态函数 ::RequestAutoload 对我来说很有意义,我的意思是毕竟一个库应该只是即插即用而不适应任何特定的加载系统(这应该是库的内部结构,如你的自动加载方式。
      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2021-03-08
      • 2017-03-26
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多