- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Ratchet php。我是这样开始的:
$loop = \React\EventLoop\Factory::create();
$webSock = new \React\Socket\Server($loop);
$webSock->listen($this->port, $this->host);
$webServer = new \Ratchet\Server\IoServer(
new \Ratchet\Http\HttpServer(
new \Ratchet\WebSocket\WsServer(
new PusherServer()
)
),
$webSock
);
return $loop;
onMessage()
中我的
Pusherserver
类(实现
MessageComponentInterface
),我想执行一个长时间的阻塞任务。这将是一个 HTTP 请求,最多可能需要 10 秒才能完成。
onMessage()
在执行前一个 HTTP 请求时可以自由处理其他请求吗?我不能使用 pthreads,因为我无权更改我已经提供的 php 版本(这是线程安全的)。
最佳答案
这正是您在事件循环中执行任何操作时必须避免的问题:它不能被阻塞,因为其他任何人然后尝试订阅、调用消息或其他任何事件驱动的事件都不会发生,直到这就完成了。
这更像是一个架构问题,一旦你找到了最好的方法,那就是简化它并确保它适用于你需要的所有任务。
Ratchet 提供 ZMQ绑定(bind) - 这很棒,因为一旦你设置了它,你在端口 5555 上收到的任何东西都会在 onYourMethodName()
中命中你的事件循环。 ,或者随便你怎么称呼它!
考虑到这一点,您需要将需要完成的工作发送到另一个进程的作业队列中(react 有它的 child-process 扩展名,我特别不喜欢它,因为它在用户区进行轮询而不是中断 -驱动 I/O,如 PHP 的 PCNTL extension ) 或类似的。
如果您想“让它正常工作”,请启动需要完成的工作以及连接 ID 或其他 ID,以便您知道响应需要返回给谁,在子进程中以及何时完成发送出来。这不会阻塞!
如果你想以更好的方式去做,我强烈建议你研究一下这个和它的架构,这样当你再次处理这样的异步问题时,你可以把这些知识带在你的职业生涯中,采用'fire-and -忘记'的方法。将需要完成的工作触发到事件循环中的作业队列中,然后忘记它。
您的作业队列可以执行它的任务,当它完成时,通过 ZMQ(正在监听的端口 5555,记住)将结果返回,然后可以将数据发送回客户端。
对于关于工作队列的精彩演讲,我强烈推荐 this one来自 PHPNW。
最后要注意的是,因为你打开了这个东西并在端口 5555 上监听数据,所以你可以从任何地方发送这些数据。它可以是进程间通信,就像您有一个将数据发送到端口 5555 的 Java 应用程序一样,或者实际上是任何东西。它将事物绑定(bind)在一起,但不耦合它们,这在您的架构中很重要。
对于实际使用 ZMQ 的示例,他们在 this page here 上提供了所有内容。 (如上链接),但我会尝试解释一下正在发生的事情。
$pull->bind('tcp://127.0.0.1:5555');
$pull->on('message', array($pusher, 'onYourMethodName'));
onYourMethodName
在您的
$pusher
目的。真的就是这么简单。超过 5555,点击
$pusher::onYourMethodName
.
onMessage()
、
onSubscribe()
等旁边)......这在该页面上再次提到。
public function onYourMethodName($data)
{
/** You'll probably want to send the data in JSON format **/
/** Imagine you get through a 'topic' in here... **/
$data = json_decode($data, true);
/** You should already have stored the people who are connected, topics etc - see the tutorial **/
$topic = $this->subscribedTopics[$data['topic']];
/** Send the data out to everyone subscribed to this topic **/
$topic->broadcast($data);
}
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://localhost:5555");
$socket->send(json_encode($data));
关于php - Ratchet PHP 和长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38495191/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!