2012-11-29 55 views
2

在我的php脚本中,我想输出数据到浏览器,然后在运行一个函数之前sleep()2秒。下面似乎没有输出json睡觉之前,任何人有任何想法?echo json data then sleep

if ($_POST['process'] == '1') { 
    // adding stuff to $data here 
    } 

    echo json_encode($data); 
    ob_flush(); 
    flush(); 
    sleep(2); 
    // Do something else 
} 
+0

请粘贴完整代码。在当前的代码片段中,你错过了'{'或'} – GBD

+1

我认为你需要首先执行'ob_start();',所以你创建了一个缓冲区。 –

回答

3

是的,这是你是如何做到的。基本上,你关闭连接并同时阿帕奇继续处理文件返回给用户的响应...

ignore_user_abort(true); 
header('Content-Type: application/json'); 
header('Connection: close'); 
header('Content-Length: ' . strlen($YOUR_JSON_RESPONSE)); 

echo $YOUR_JSON_RESPONSE; 
flush(); 

sleep(2); 
your_cool_function_to_run(); 
die(); 

对于那些需要立即响应和/或需要很长的快速Ajax调用的伟大工程有时间去做实际的工作。

我必须谨慎地使用这种类型的东西......每次发生这种情况时都会打开一个新的进程/线程来处理请求的其余部分。太多太快,你会用完流程。 (取决于您的设置)

+0

“连接:”和“内容长度:”标题+1。我认为除了关闭STDOUT之外,这些还应该有所斩获。 – tomlogic

+0

我从来没有听说过PHP脚本跨线程分裂:你有任何参考?此外,线程和进程是真正不同的野兽 – Raffaele

+0

我没有一个参考..纠正我的理解,如果它的错误:每个用户请求PHP打开一个单独的进程,一旦关闭和响应发送过程结束。当你以这种方式发送响应,然后继续该过程时,它会产生一个新的php进程来处理处理。因为,你可以在睡眠(2)之后让该函数继续运行数分钟,然后进程就会挂起。该工作一种享受 – phpisuber01

0

您可以尝试关闭STDOUT,向Web服务器发送脚本已完成将数据发送到HTTP客户端的信号。

fclose(STDOUT);