0

我正在编写有关使用此处提到的棘轮的基本教程http://socketo.me/docs/push

我为教程创建了一个完美运行的测试设置。但是,当我尝试将设置与 CakePHP 3 集成时,我遇到了问题。就像教程中提到的那样,棘轮和 ZMQ 服务器是独立的。只有以下代码需要移动到 CakePHP 3 控制器中:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($entryData));

此代码基本上将新数据提交到 ZMQ 队列以转发到棘轮。如果我将相同的 4 行放在 CakePHP 3 代码库之外的普通 PHP 文件中,它就可以工作。当我在 APP\Controller\SamplesController 中放置相同的四行时,它说找不到类 APP\Controller\ZMQContext。

CakePHP 3 文档提到通过 composer 安装的供应商库将通过自动加载器自动可用。我已经通过以下命令安装了 React\ZMQ 库:

php composer require react/zmq

我尝试通过以下命名空间访问该类,但它们都没有工作:

ZMQContext ( Class 'App\Controller\ZMQContext' not found )
\ZMQContext ( Class 'App\Controller\ZMQ' not found )
React\ZMQ\ZMQContext ( Class 'App\Controller\React\ZMQ\ZMQContext' not found )
\React\ZMQ\ZMQContext ( Class 'React\ZMQ\ZMQContext' not found )

可能错过了 PHP 中的一些命名空间概念,但我的理解是,如果 ZMQContext 通过全局命名空间在普通 PHP 文件中可用,那么它也应该在 CakePHP 3 中通过 \ZMQContext 可用。

我有以下问题:

  1. 如何在我的 CakePHP 3 APP 中将数据推送到 ZMQ 队列?
  2. APP::path() 和 APP::classname() 似乎只适用于 CakePHP 3 应用程序中的类。如何检查特定供应商库类的路径?
  3. 如何正确自动加载供应商库类?(我不希望 require/require_once 它们,因为每个想要通过棘轮发布数据的控制器都需要这样做)
  4. 关于通过 \CLASSNAME 访问全局命名空间的假设是否错误?
  5. 我在 \ZMQContext 访问供应商库类的第二次尝试解析为 App\Controller\ZMQ。当它应该在根命名空间内尝试时,这怎么可能?
  6. ZMQContext 不是 react/zmq 库的一部分,这是否意味着它是 libzmq 的默认 php 绑定的一部分?
4

1 回答 1

0

这是一个简单的错字问题:

$context = new \ZMQContext();
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($entryData));

缺少第二行中的第二个命名空间规范。

于 2016-12-09T09:28:08.837 回答