现在发送数据到客户端,并继续PHP处理

问题描述:

是否可能在PHP中,以发送数据现在到客户端,并继续PHP处理(可能是阻塞)?现在发送数据到客户端,并继续PHP处理

<?php 

// some code 

echo json_encode(array('ok' => '1')); // the client is waiting for this AJAX answer !! 
// how to send the response right now before finishing this PHP file ? 

// the output is REALLY finished here, so client, you can work with it 

some_blocking_processing(); // this is just some server processing that would 
          // block the client for ~ 5 seconds 
          // but it produces no output useful for client 

?> 

我知道正确的方式可能是使用队列或其他程序来进行处理。

但只是作为一个普遍的问题,是否有可能发送数据到客户端,在一个PHP文件中间

+1

是的,看看[输出缓冲](http://php.net/manual/en/book.outcontrol.php) – 2015-03-30 22:18:07

+0

@JohnConde只需在开始时使用'ob_start()'和在'echo'之后使用'ob_flush()'。这就是全部? – Basj 2015-03-30 22:25:29

+0

最简单的,是的。它可能需要更多的登录,具体取决于你在做什么,但这是它的基本要点。 – 2015-03-30 22:26:55

那么这真的取决于some_blocking_processing()实际上在做什么。我不能在不知道那里发生了什么的情况下提出解决方案。

但是,我可以指出你可以在哪些方面做更多的研究。其中一个可能是您正确的解决方案:

  1. PHP threading
  2. 产卵异步PHP程序
  3. 登录文件/数据库的状态,然后通过一个cron作业做额外的处理
+0

'some_blocking_processing()'确实从互联网上下载了一个.JPG(不是从用户上传的...)并将其转换成缩略图。如果图像很大(例如'5000x10000px'),则可能会阻挡2〜5秒。 – Basj 2015-03-31 00:05:02

+0

这是@Asquared:http://pastebin.com/aHCRwUtZ – Basj 2015-03-31 00:13:19

+0

为什么你不能在cron工作中这样做?只需将文章中的文件名保存到队列中(服务器或数据库上的文本文件),然后使用cron作业下载并创建图像。这个文件将完全独立于你的php代码,所以不会影响速度。 – 2015-03-31 00:41:38