首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP、Apache。在脚本完成之前将响应输出到浏览器

PHP、Apache。在脚本完成之前将响应输出到浏览器
EN

Stack Overflow用户
提问于 2013-02-28 01:54:02
回答 2查看 1.1K关注 0票数 1

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

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

代码语言:javascript
复制
    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技术中的什么?

.所以做了一些搜索,得出了这个结论:

代码语言:javascript
复制
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作业......;(

EN

回答 2

Stack Overflow用户

发布于 2013-02-28 02:05:04

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-03 06:10:23

解决方案是添加:

代码语言:javascript
复制
    echo " ";
    ob_flush(); flush;

在循环内部...

代码语言:javascript
复制
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();

这会反复强制循环的第一次迭代的输出,并最终发挥作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15118914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档