从服务器进程获取实时反馈[在PHP中]

需求:

我需要运行一个后台进程(根据用户请求),该过程大约需要30到60秒才能完成.我想给用户一些状态反馈.注意:Toly是正确的,不需要“背景”.

工作原理:

在此期间,该进程将打印约20条状态消息,我使用proc_open检索它们,并使用fgets在读取管道上进行侦听.我可以将这些消息保存到会话变量中,并使用时间戳(以帮助调试),我可以看到随着过程的进行,会话数组已被这些消息写入.

麻烦:

我的计划是使用ajax调用(每秒)轮询服务器,以检索这些会话var,以便在DOM中显示.瓶颈似乎是服务器仍在运行后台进程时无法为ajax请求提供服务.后台进程完成时,所有内容立即转储.据我所知,问题不在于输出缓冲,因为使用与每个过程消息一起保存的(调试)时间戳显示服务器正在按顺序写入会话var,所以这就是我知道proc_open和管道读取按预期工作的方式.问题似乎是服务器在处理完成之前无法向AJAX请求提供其JSON对象.或者,也许更准确地说,是通过读取管道的循环完成的.

明显的误解:

我认为将流程发送到后台(使用&)可能会给我一个解决方案.显然,我不知道后台进程和分支进程之间的区别.在这种情况下,在后台运行进程会获得什么好处(如果有的话)?

可能的解决方案:

>我不希望用户启动运行此程序的进程
过程/场景如此繁重,但是如果有什么我可以
内置到该解决方案中,这将有助于减轻繁重的工作,
现在喜欢这样做.
>这是多线程(pthread)还是
多进程(叉)解决方案?
>或者,我应该保存一个进程ID,
让我们用while(.. fgets ..)语句轮询它,然后
服务器为ajax服务后,请返回到该过程
请求?
>我想我可以运行伪造的状态消息,然后
完成后返回结果时,可以准确响应.
处理请求的时间不取决于用户,因此
我的虚假时间可能非常准确.但是,我想
知道提供实时反馈的解决方案.

解决方法:

在搜寻了一种您可以在此处描述的相同行为的技术之后,我提出了一个针对我的项目的简单解决方案.

一些重要的理论:
-session_start()和$_SESSION [“ x”] =“ y”之类的集合将始终锁定会话文件.

案例场景:
-一个process.php-通过ajax调用运行
-B-get_session.php-第二个ajax调用;

主要问题是,即使在通过AJAX运行的进程中设置$_SESSION,它也将始终必须等待会话文件被解锁,这将导致两个进程之间的同步. (AB)-两者同时完成!

因此,解决此问题并获得良好结果的最简单方法是在每个集合之后使用session_write_close().例如.:

%_SESSION["A"] = "B";
$_SESSION["x"] = "y";
session_write_close();

PS:最好的方法是拥有一组自定义的函数来处理会话.

抱歉加价.我刚刚创建了一个堆栈帐户.

上一篇:【linux】实战扩展swap分区


下一篇:【linux】循序渐进学运维-echo