Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP异步任务-准备好后将结果发送到浏览器_Php_Html_Asynchronous_Pthreads_Gearman - Fatal编程技术网

PHP异步任务-准备好后将结果发送到浏览器

PHP异步任务-准备好后将结果发送到浏览器,php,html,asynchronous,pthreads,gearman,Php,Html,Asynchronous,Pthreads,Gearman,在PHP中,我想并行运行几个独立的任务。每个任务都会生成一个结果,当结果准备就绪时,我希望将其发送回访问者的浏览器。我们的想法是使用正常加载页面,然后使用HTML5 SSE(服务器发送事件)在浏览器可用时将数据发送到浏览器,同时使用保持活动状态保持HTTP连接打开。我不只是想刷新输出;我将做很多不同的任务,这些任务都是并行运行的完美候选,所以我不想同步执行它们 我最初的想法是使用多线程。我不确定线程是如何与PHP一起工作的;只要我有一个线程在运行,浏览器的连接是否保持打开状态,即我是否可以从线程

在PHP中,我想并行运行几个独立的任务。每个任务都会生成一个结果,当结果准备就绪时,我希望将其发送回访问者的浏览器。我们的想法是使用正常加载页面,然后使用HTML5 SSE(服务器发送事件)在浏览器可用时将数据发送到浏览器,同时使用
保持活动状态保持HTTP连接打开。我不只是想刷新输出;我将做很多不同的任务,这些任务都是并行运行的完美候选,所以我不想同步执行它们

我最初的想法是使用多线程。我不确定线程是如何与PHP一起工作的;只要我有一个线程在运行,浏览器的连接是否保持打开状态,即我是否可以从线程安全地将数据发送回浏览器?我认为pthreads相当稳定,但我不认为我应该使用它,因为它是实验性的

pthreads过去是,现在也是,一个效果非常好的实验。任何 其限制或特征可能随时发生变化;这就是自然 一系列的实验

然后我想起了Gearman,它允许我使用工人完成任务。我需要后台工作人员,因为我不希望在等待作业完成时阻止脚本执行,因为我希望并行运行多个作业。Gearman没有问题,但如果我使用后台工作人员,我不确定是否可以将结果发送回Gearman客户端。据我所知,后台工作人员将在他们自己的进程或上下文中运行,所以我猜这意味着我无法将数据从后台工作人员发送回浏览器?我注意到,提供了一些设置回调的方法,但据我的研究所知,似乎这些回调只通过同步调用调用。理想情况下,我要么想直接从后台工作人员那里发回结果(我怀疑这是不可能的),要么让后台工作人员在结果完成时通知客户,而不必探查Gearman的工作状态。回调处理程序是最佳选择,因为我可以从那里发回数据

我还考虑将ActiveMQ等消息传递系统(或memcached)与。其想法是在一个通道上发送工作者请求,然后在另一个通道上侦听结果。从结果通道读取消息时,消息将直接发送到浏览器。缺点是我需要做额外的工作,比如将结果消息映射到请求

最后,我非常倾向于Gearman方法,但我不确定是否有可能实现我想要的。总而言之,我希望执行并行任务,每个任务花费几秒钟的时间,并在结果准备好后(通过使用HTML5 SSE)将它们分别发送回浏览器


我的方法可行吗?你还有别的想法吗?提前多谢

我只能回答pthreads部分

到目前为止,还不支持持久线程,因此在每个请求结束时,所有创建的上下文都会被销毁(连接)。将数据直接从线程发送到浏览器可能是一个坏主意(在某些设置中会导致崩溃),原因是Zend级别无法控制apache或您正在使用的任何sapi的输出,因此pthreads不会尝试连接stdout或其他任何东西。。。想法应该是让接受连接的线程(或进程)使用它创建的线程中的数据处理到客户端的输出


持久性线程有点问题,PHP中并不真正支持持久性对象,mysqli等提供持久性对象的方式不同于pthreads对持久性线程的要求,首先,它们的接口总是相同的(即,它实现了mysqli),其中pthreads由用户在PHP中实现。即使我解决了这个问题,我也可以想象它们很容易被误解,我对持久线程的实验仍在继续,如果或当我找到合适的实现时,文档将被更新。

我只能回答pthreads部分

到目前为止,还不支持持久线程,因此在每个请求结束时,所有创建的上下文都会被销毁(连接)。将数据直接从线程发送到浏览器可能是一个坏主意(在某些设置中会导致崩溃),原因是Zend级别无法控制apache或您正在使用的任何sapi的输出,因此pthreads不会尝试连接stdout或其他任何东西。。。想法应该是让接受连接的线程(或进程)使用它创建的线程中的数据处理到客户端的输出


持久性线程有点问题,PHP中并不真正支持持久性对象,mysqli等提供持久性对象的方式不同于pthreads对持久性线程的要求,首先,它们的接口总是相同的(即,它实现了mysqli),其中pthreads由用户在PHP中实现。即使我解决了这个问题,我也可以想象他们很容易被误解,我对持久线程的实验仍在继续,如果或当我找到合适的实现时,文档将被更新。

我当然不知道你的答案,但我很好奇是谁做的,以及它是什么!如果可能的话,我认为一个好的解决方案是使用Ajax。如果是的话,我会给你写一个答案。我从未与Gearman合作过,但下面的链接可能会给你一些想法:你读过RabbitMQ吗?这是一个AMQP实现。这对你的案子可能有用。请阅读官方网站上的第六个示例(示例是java,但有足够多的php示例)。@Nick除非我误解了你的意思,否则AJAX似乎不适合这个。我的希望是成为abl