问题标签 [reactphp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - Ratchet PHP WAMP - React / ZeroMQ - 特定用户广播
注意:这与使用的这个问题不同
MessageComponentInterface
。我正在使用WampServerInterface
,所以这个问题专门与那部分有关。我需要一个带有代码示例和解释的答案,因为我可以看到这对未来的其他人有帮助。
尝试为单个用户循环推送
我正在使用 Ratchet 和 ZeroMQ 的 WAMP 部分,目前我有一个推送集成教程的工作版本。
我正在尝试执行以下操作:
- zeromq 服务器已启动并运行,准备记录订阅者和取消订阅者
- 用户通过 websocket 协议在浏览器中连接
- 启动一个循环,将数据发送给请求它的特定用户
- 当用户断开连接时,该用户数据的循环将停止
我有第 (1) 和 (2) 点有效,但是我遇到的问题是第三点:
首先:如何仅向每个特定用户发送数据?广播将其发送给每个人,除非“主题”最终可能是个人用户 ID?
其次:我有一个很大的安全问题。如果我要从客户端发送想要订阅的用户 ID,这似乎是我需要的,那么用户只需将变量更改为另一个用户的 ID,然后返回他们的数据。
第三:我必须运行一个单独的 php 脚本,其中包含 zeromq 的代码来启动实际的循环。我不确定这是最好的方法,我宁愿让它完全在代码库中工作,而不是单独的 php 文件。这是我需要整理的一个主要领域。
以下代码显示了我目前拥有的内容。
刚刚从控制台运行的服务器
我从字面上输入php bin/push-server.php
来运行它。订阅和取消订阅将输出到此终端以进行调试。
通过 websocket 发送数据的 Pusher
我省略了无用的东西,专注于onMessage()
andonSubscribe()
方法。
在循环中开始使用上述 Pusher 代码的脚本
这是我的问题 - 这是一个单独的 php 文件,希望将来可以集成到其他代码中,但目前我不确定如何正确使用它。我是否从会话中获取用户 ID?我仍然需要从客户端发送它......
最后,要订阅的客户端js
结论
以上是有效的,但我真的需要弄清楚以下几点:
如何向个人用户发送个人消息?当他们访问在 JS 中启动 websocket 连接的页面时,我是否也应该启动将内容推入 PHP 队列的脚本(zeromq)?这就是我目前正在手动执行的操作,只是感觉不对。
从 JS 订阅用户时,从会话中获取用户 ID 并从客户端发送是不安全的。这可能是伪造的。请告诉我有一个更简单的方法,如果是这样,怎么做?
php - $loop 在这个代码示例中做了什么?
Phil Sturgeon 写了这篇关于基准测试的文章。
我关心的是这种称为 ReactPHP 的技术。
我去过他们的 GitHub,但如果没有一个例子,我仍然无法理解它。
谢天谢地,我可以使用 Phil 的仓库。
在第 12 行,Phil 使用 ReactPHP 创建了一个循环。
https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12
然后他在第 24 行开始使用循环
https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L24
我的问题是:
- 这样做的目的是
$loop
什么? - 它在 ReactPHP 上说,它是一个简单的 Web 服务器。这是否意味着它取代了 nginx 或 Apache?
- 什么时候是使用 ReactPHP 或任何类似技术的好时机?什么时候不适合使用它?
我正在尝试了解这项技术,所以如果我对这个问题的措辞不好,请告诉我,以便我可以重写。
编辑:
由于我收到的反馈是这个问题太宽泛了,让我缩小我的问题范围,让它参考一个代码示例。
从https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12获取代码示例,
我在下面复制了它。做什么$loop
?
php - 当 React/Promise 解决时同步返回
一旦解决了 React/Promise,我需要从函数调用中返回。基本思想是从异步调用中伪造同步调用。这意味着一旦 promise 被解决或拒绝,外部函数必须返回一个值。
这是使用 React/Mysql 为 RedBeanPHP 创建一个驱动程序。我知道这可能会导致 React 事件循环中的 CPU 不足。
我最初的想法是使用生成器,然后在\React\Promise\Deferred::then
回调中调用 yield。
PHP 生成器类 AFAICT 只能由 PHP 引擎本身直接构造。then 回调需要在异步函数的生成器上直接调用 send 才能正常工作。
php - 用 Laravel 4 反应 PHP
我正在使用 Laravel 4,并且在使用 React PHP 时,是否有任何方法可以将 React PHP 与 Laravel 一起使用。
有没有从 React PHP 和 Laravel 开始的例子?或任何建议将它与 Laravel 一起使用?
php - 在 Windows 上设置 react/zmq
我正在按照官方网站的说明在我的系统上设置 Ratchet,我执行了以下操作:
- 从官网下载并安装zeromq
- 按照http://zeromq.org/bindings:php的说明进行 PHP 绑定并复制 dll 文件(由于提到的 url 已关闭,我从 [ http://178.79.157.189/~mikko/win32/获取了 dll 文件php-zmq-win32.zip] ) 3.修改php.ini文件。
但是当我重新启动服务器时,我得到了错误:
PHP 启动:无法加载动态库 'c:/wamp/bin/php/5.4.3/ext/php_zmq.dll' - %1 不是有效的 Win32 应用程序。
php - Composer:lib(React PHP)仅部分自动加载
React 库中的一个组件是自动加载的,但大多数不是。
我将 react/react 组合到我的项目中,并且该过程中的一切都很顺利。
尝试使用React\EventLoop\Factory
orReact\Stream\Stream
时,会引发“找不到类”错误。
我打开 xDebug 并注意到该Composer\Autoload\ClassLoader->prefixes['R']
数组包含React\Promise
... 但没有其他内容。
在我看来,其他 React 库也应该在那里。
看到这一点,我 var_dumped\React\Promise\any('string')
并成功地自动加载了React\Promise
命名空间。尽管如此,其他React\
命名空间下的类仍无法自动加载。
我不禁怀疑我的问题在某种程度上与它们在Composer\Autoload\ClassLoader->prefixes
阵列中的明显缺失有关,但作为新手,这只是一种预感。
顺便说一句,为了确保至少可以访问所有内容,我确实require
在这些类上尝试了硬编码。它成功了(当然,除了后续的依赖项没有被自动加载:)
您怀疑什么可能导致这种类型的有点/有点不自动加载?
php - 使用reachphp 或ratchet 在预定时间发布给订阅的客户
我是 reactphp 新手。我涉足 node.js。我正在研究一个需要在特定时间触发事件并将其发布给订阅客户的项目。这是 EventLoop 适合的东西吗?关于我如何解决这个问题的任何方向?
php - ReactPHP 真的是异步的吗?
我一直在对 ReactPHP 进行一些测试,因为它看起来非常棒。对于一个简单的套接字服务器,我已经使用以下react/socket代码对其进行了测试。
到此为止没有问题。服务器显示New client !
客户端何时连接并且客户端收到响应。
但是我做了一个新的测试,对data
事件进行了更多的处理。为了说明我的话,我将添加一个for
需要几毫秒才能完成的循环:
Wow, some data, such cool
在这种情况下,有 10 个客户端,客户端将在所有客户端处理后显示文本(大约 2 秒),但服务器New client !
无需等待即可显示。
所以这里我缺乏理解,ReactPHP 是异步 I/O,但是 PHP 是单线程的,如果输入输出之间有很多处理,就会阻塞所有客户端。
php - ReactPHP Socket Server:什么触发了写入(到客户端)?
当尝试写入客户端时,消息被缓冲,在某些情况下,它根本没有被写入。
当前状态:
当我远程登录到服务器时,Server Ready:
消息很容易按预期打印。
当我发送随机数据(“关闭”除外)时,服务器的终端每秒都会很好地显示进度,但客户端输出会等到所有睡眠之后,然后一次打印出来。
最重要的是,当发送“关闭”时,它只是等待强制性的第二个,然后在客户端没有任何写出的情况下关闭。
目标:
我的主要目标是在关闭连接之前向客户端写入一条快速消息。
代码:
摘要:
为什么在关闭之前我无法向客户写入任何内容?