急求:关于PHP实时向客户端输出数据的问题

风一样的女子& 2010-03-16 10:50:44
测试代码如下:
<?php
ob_start();
for($i = 1; $i <= 100; $i++){
$sourceName = 'filetoupload' . $i;
$imageArray = array();
$message = "Image $i has been uploaded to the server";
echo $message;
flush();
ob_flush();
usleep(500000);
}
ob_end_flush();
?>
测试结果如下:
在本地服务器上该脚本就可以边运行边输出,可是在内网服务器上运行就是100次循环运行完后才输出;

想要的正确结果:
如同在本地服务器上运行结果一样,边运行边输出显示。请问为什么同样的脚本在内网服务器执行就是不同的结果,是不是与php.ini中的哪个配置项有关??? 与哪些配置项有关???望得到大家的帮助,先感谢了
...全文
810 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
myzhang222 2012-03-29
  • 打赏
  • 举报
回复
特地注册来感谢这位大虾,搞了好几个小时了,果然是跟APACHE有关[Quote=引用 26 楼 的回复:]
这个缓冲和浏览器相关,和apache的某些模块也相关。
keep try
===================================
PHP code
ob_end_clean();
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
ini_set('implicit_flush', 1);
……
[/Quote]
Life_Laughing 2011-11-07
  • 打赏
  • 举报
回复
我登录了 啊 怎么还看不到 答案
_yyy 2011-07-10
  • 打赏
  • 举报
回复
mark
foolbirdflyfirst 2010-03-16
  • 打赏
  • 举报
回复
ob_start();
for($i = 1; $i <= 100; $i++){
$sourceName = 'filetoupload' . $i;
$imageArray = array();
$message = "Image $i has been uploaded to the server";
echo $message;
ob_end_flush();
flush();
usleep(500000);
}
床上等您 2010-03-16
  • 打赏
  • 举报
回复
这个问题我也试过,但我得到的答案是:php是服务器端的,多方面把php整个执行完才一次向客户发送。
这个答案我一直半信半疑。。。。。
但也实现不了楼主所说的功能。。。
helloyou0 2010-03-16
  • 打赏
  • 举报
回复
看一下这一页上的几个配置
http://ca.php.net/manual/en/outcontrol.configuration.php
  • 打赏
  • 举报
回复
大家帮我回答回答了,自己顶
  • 打赏
  • 举报
回复
另外:flush支持的PHP版本为(PHP 3, PHP 4, PHP 5)
ob_flush 支持的PHP版本为(PHP 4 >= 4.2.0, PHP 5)

无论是我本机的PHP还是服务器的PHP版本都是支持上述函数的。
  • 打赏
  • 举报
回复
我本机的php版本是5.2.0 服务器的PHP版本是 5.1.6
jichangh1983 2010-03-16
  • 打赏
  • 举报
回复
我觉得这个应该不会是跟配置文件有关
问一下,你的内网服务器和本地服务器上的PHP版本是一样的吗?
我感觉像这样的情况很多都是PHP版本问题。
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 foolbirdflyfirst 的回复:]
嗨,你要早点去http://php.net/manual/en/function.flush.php看看就好了,以后遇到问题记得多上在线php手册看看,那里有全世界phper们的开发经验。呵呵
[/Quote]

哈哈,知道了,感谢大哥。
foolbirdflyfirst 2010-03-16
  • 打赏
  • 举报
回复
嗨,你要早点去http://php.net/manual/en/function.flush.php看看就好了,以后遇到问题记得多上在线php手册看看,那里有全世界phper们的开发经验。呵呵
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 foolbirdflyfirst 的回复:]
这个缓冲和浏览器相关,和apache的某些模块也相关。
keep try
===================================

PHP code
ob_end_clean();
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
ini_set('implicit_flush',……
[/Quote]

不知道你是不是比我大,但我还是想叫你一声:大哥。
你的这段代码在我之前的那个内网服务器上确实是OK的。
你的这个提醒让我知道了问题的所在:
我之前的内网服务器上的apache配置文件httpd.conf中打开了压缩模块,并且对压缩的类型进行了设置。如下:
#压缩模块
LoadModule deflate_module modules/mod_deflate.so

# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
#压缩的类型有:text/html text/javascript text/css
AddOutputFilterByType DEFLATE text/html text/javascript text/css
</Directory>

这样当我服务器向客户端输出内容时就会先缓冲起来,等完成后一次性输出。这就造成了我上述的问题。

真的感谢,太感谢了。

  • 打赏
  • 举报
回复
我换用另外一台内网服务器(PHP版本:5.1.6 linux系统 与之前的一致)就脚本就OK了,实现了我所要的边运行边输出,看来问题还是出在服务器配置上,具体问题点我还得比较它们的配置文件。

在这里真的非常感谢楼上帮忙的每一位朋友,谢谢你们在百忙中抽出时间来帮我分析问题,感谢了。希望大家都工作顺利,每天开心。
foolbirdflyfirst 2010-03-16
  • 打赏
  • 举报
回复
这个缓冲和浏览器相关,和apache的某些模块也相关。
keep try
===================================
ob_end_clean();
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
ini_set('implicit_flush', 1);
ob_start();//开始缓冲数据
for($i = 1; $i <= 100; $i++){
$sourceName = 'filetoupload' . $i;
$imageArray = array();
$message = "Image $i has been uploaded to the server<br/>";
echo $message.str_repeat(" ",1024);//ie有默认的1k buffer
ob_flush();
flush();
usleep(500000);
}
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 bing19870624 的回复:]
引用 22 楼 renjianqin_1984 的回复:
引用 19 楼 bing19870624 的回复:
为这问题 我开启了好久没用的linux 最终发现是缓存的问题

PHP code

<?php
ob_start();
for($i = 1; $i <= 100; $i++){
ob_end_flush();//关闭缓存
$sourceName = 'filetoup……
[/Quote]

感谢,感谢,感谢!!!
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 t240034137 的回复:]
哎 终于找到了!看手册吧!
如下代码:

PHP code

<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

echo "<br> Line to show.";
echo str_pad('',4096)."\n";

……
[/Quote]

这个代码我已经试过了,刚又试了一遍,我把手册中能试的代码也都试了。本机服务器(PHP:5.2.0 Windows系统)是OK的,边运行边输出。 内网服务器(PHP:5.1.6 linux系统)不OK的,运行后一次性输出。

按说不应该是脚本的问题,感觉还是服务器之间有差别造成的。但就是不知道问题出在哪里。头大!!!真的很感谢大家帮忙,依然在找答案中...
餅餅 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 renjianqin_1984 的回复:]
引用 19 楼 bing19870624 的回复:
为这问题 我开启了好久没用的linux 最终发现是缓存的问题

PHP code

<?php
ob_start();
for($i = 1; $i <= 100; $i++){
ob_end_flush();//关闭缓存
$sourceName = 'filetoupload' . $i;
$imageArray = arr……
[/Quote]
IE下还真没试 火狐下OK= = 干活了 你再研究研究
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 bing19870624 的回复:]
为这问题 我开启了好久没用的linux 最终发现是缓存的问题

PHP code

<?php
ob_start();
for($i = 1; $i <= 100; $i++){
ob_end_flush();//关闭缓存
$sourceName = 'filetoupload' . $i;
$imageArray = array();
$mes……
[/Quote]

循环外用了一对ob_start();ob_end_flush(); 你又在循环里的开头用了ob_end_flush();//关闭缓存
,你那边这样OK吗?在我这边用IE8访问内网服务器(PHP:5.1.6 linux系统)还是不OK,依然是循环完后一次性输出,而且还会输出一些警告通知信息:
Image 1 has been uploaded to the server
Notice: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush. in /var/www/html/streaming_serverPush/test.php on line 8
Notice: ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in /var/www/html/streaming_serverPush/test.php on line 4




t240034137 2010-03-16
  • 打赏
  • 举报
回复
哎 终于找到了!看手册吧!
如下代码:

<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

echo "<br> Line to show.";
echo str_pad('',4096)."\n";

ob_flush();
flush();
sleep(2);
}

echo "Done.";

ob_end_flush();

?>
加载更多回复(13)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧