PHP, Apache.在脚本完成之前向浏览器输出响应


PHP, Apache. Output response to browser before script has finished

我有一个脚本,它从DB中提取用户,准备一个XMPP消息,循环遍历每个用户并发送XMPP消息,然后记录消息的发送。轻松运行超过1000个用户。这是一个从移动设备调用的服务器端API脚本。移动设备正在等待接收一个成功的JSON响应。用户体验应该是快速的,我不希望移动用户等待超过几秒钟的响应。

问题是脚本需要相当多的时间来循环所有用户,所以我最初的解决方案是使用ob_flush() -注意这些只是测试脚本,看看计划的方法是否有效:

    ob_start(); 
$profiles_ar = array(
    "reach" => 30,
);
$return_ar = array(
    "success"   => $profiles_ar['reach'],
);
echo json_encode($return_ar);
$buffer = str_repeat(" ", 4096);                    // Note apparently  the buffer must be "filled" with 4096 characters (bytes?) for ob_flush() to work before sleep() occurs.
echo $buffer;
ob_flush();
flush();
for($i=0;$i < $profiles_ar['reach']; $i++)
{
   sleep(1);
}
echo "finshed: ".$i;
ob_flush();
flush();

这是不工作,没有得到输出,直到脚本已经完成-我错过了一些与OB技术?

……所以我做了一些搜索,得出了这个:

register_shutdown_function('process_after');
$profiles_ar = array(
    "reach" => 10,
);
$return_ar = array(
    "success"   => $profiles_ar['reach'],
);
echo json_encode($return_ar);

echo $buffer;
exit;
function process_after()
{
    global $profiles_ar;
    for($i=0;$i < $profiles_ar['reach']; $i++)
    {
       sleep(1);
    }
    echo "finshed: ".$i;
}

这个在mac上工作,但在服务器上不行....

有人有什么想法吗?如果我不能在主处理工作之前获得这种输出响应JSON的技术,那么我唯一的希望是在DB中构建一个队列并运行cron作业........div; (

php.ini是否启用了output_buffering ?http://php.net/manual/en/outcontrol.configuration.php

我将重构xmpp消息在其自己的文件中的创建,然后使用ajax调用发送每个消息。这样你就不用等待每条消息都成功了。

解决方案是:

    echo " ";
    ob_flush(); flush;

循环内....

ob_start(); 
$profiles_ar = array(
    "reach" => 10,
);
$return_ar = array(
    "success"   => $profiles_ar['reach'],
);
echo json_encode($return_ar);
for($i = 0; $i < 5000; $i++)
{
    echo " ";
    ob_flush(); flush;
}
echo $buffer;
ob_flush();
flush();
ob_end_flush();
for($i=0;$i < $profiles_ar['reach']; $i++)
{
   sleep(1);
}
echo "finshed: ".$i;
ob_flush();
flush();
ob_end_flush();

这将反复强制循环的第一次迭代输出,并最终开始执行。