我是一个基于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
答案 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的主题:)