Elephant.io客户端无法正常工作

时间:2015-01-06 13:22:25

标签: php sockets websocket socket.io phpwebsocket

我是一个基于socket.io的Websocket-Server,应该从php应用程序获取通知。我发现http://elephant.io/似乎是正确的库。看来elephant.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

我是作曲家的新手,但对我来说,似乎这个系统应该通过包含autoloader文件来处理所有包含内容。

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

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

3 个答案:

答案 0 :(得分:3)

之前我使用过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");

答案 1 :(得分: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);

结果:

  

object(ElephantIO \ Client)#8(2){   [ “发动机”: “ElephantIO \客户端”:私人] =>   object(ElephantIO \ Engine \ SocketIO \ Version1X)#9(4){   [ “URL”:保护] => array(6){[“scheme”] => string(4)“http”   [ “宿主”] => string(9)“localhost”[“query”] => array(0){} [“path”] =>   string(9)“socket.io”[“port”] => int(8000)[“secured”] =>布尔(假)}   [ “会话”:保护] => NULL [“options”:protected] => array(7){   [ “上下文”] => array(0){} [“debug”] => bool(false)[“wait”] =>   int(100000)[“timeout”] => string(2)“60”[“version”] => INT(2)   [ “use_b64”] => bool(false)[“transport”] => string(7)“polling”}   [ “流”:保护] => NULL} [“logger”:“ElephantIO \ Client”:private] =>   NULL}

答案 2 :(得分:-1)

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

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

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

很抱歉延迟,我不经常检查stackoverflow,特别是关于Elephant.io的主题:)