需求:
我需要运行一个后台进程(按照用户的请求),这个进程需要大约30至60秒才能完成。 我想给用户一些状态反馈。注意:Toly是对的,“Background”不是必需的。
现状:
这个进程在执行时会打印大约20条状态消息,我通过proc_open并使用fgets监听读取管道来检索它们。我可以将这些消息保存到会话变量中,并使用时间戳(以帮助调试)来查看会话数组随着进程的进行而被写入这些消息。
问题所在:
我的计划是使用ajax调用轮询服务器(每秒一次)来检索这些会话变量,以便在DOM中显示它们。瓶颈似乎是服务器在运行后台进程时无法服务于ajax请求。当后台进程完成时,所有内容都会一起输出。从我所能看到的,问题不在于输出缓冲区,因为每个处理消息都保存有(调试)时间戳,这样就可以看到服务器按顺序写入会话变量,因此我知道proc_open和pipe读取按预期工作。问题似乎是服务器不能在完成进程或循环读取管道之前向AJAX请求提供其JSON对象。
明显的误解:
我认为将进程发送到后台(使用&)可能会给我一个解决方案。显然,我不知道后台进程和分岔进程之间的区别。在此情况下运行进程时,后台模式是否有任何好处?
可能的解决方案:
- 我不希望用户启动的此进程/场景很重,但如果这个解决方案中有什么可以帮助处理大量数据的东西,我愿意尝试。
- 这是多线程(pthreads)还是多进程(fork)解决方案?
- 或者,我应该保存一个进程ID,在while(..fgets..)语句中进行轮询,然后在服务器服务ajax请求后返回到进程?
- 我可以运行虚假的状态消息,然后在完成后准确地响应结果。处理请求的时间不取决于用户,因此我的虚假时间可以相当准确。但是,我想知道提供实时反馈的解决方案是什么。