急,Header设置content-type!

#1 S3P

我想问下各位,比如我有一个功能需要PHP设置conent-type:text/event-stream.这个php是设置成控制器还是单独的一个php文件放在其他目录访问如lib。急!我用控制器的话设置content-type貌似没用,希望看到的人帮忙解决下,有点儿急谢谢

2013-06-04 15:23:10

#2 jake

在header前面加上 ob_clean();

另:请把问题写清楚,“貌似没用”是什么意思?

2013-06-04 16:42:47

#3 S3P

就是如果是控制器的话调用的index方法在里面设置header也是可以得吗,还有这种类似的文件一般用于ajax调用的文件不会写成控制器吧,还是单独写PHP文件就OK了呢
谢谢!

2013-06-04 17:56:46

#4 jake

单入口程序,都是写控制器的。而且设置header是没有问题的,除非你的程序在header之前有输出,比如说空格或者BOM之类的,header才会失效。

2013-06-04 20:23:15

#5 S3P

嗯,解决了多谢!不是框架问题,html5 eventsource的问题哈哈多谢提醒

2013-06-05 00:45:30

#6 istony

S3P 发表于 2013-6-5 00:45
嗯,解决了多谢!不是框架问题,html5 eventsource的问题哈哈多谢提醒
楼主怎么解决的?遇到同样问题,请告知,谢谢!

jack老大,请指教:
客户端js使用EventSource,如果把下面的代码放在框架的控制器内部,代码执行总是挂起(pending)。同样的代码,如果放在单独的php文件里面,不使用框架,则可以正常flush()输出内容,好像是内容被缓存了,flush()不起作用,无法输出内容?请指教!:handshake
2017-10-04_222053.jpg
代码在附件中,请查看!

2017-10-04 22:43:57

#7 istony

istony 发表于 2017-10-4 22:43
楼主怎么解决的?遇到同样问题,请告知,谢谢!

jack老大,请指教:
补充一下,SpeedPHP版本是3.1.89

2017-10-04 22:46:22

#8 istony

istony 发表于 2017-10-4 22:43
楼主怎么解决的?遇到同样问题,请告知,谢谢!

jack老大,请指教:
补充一下,Speed版本是3.1.89

2017-10-04 22:47:27

#9 jake

istony 发表于 2017-10-4 22:43
楼主怎么解决的?遇到同样问题,请告知,谢谢!

jack老大,请指教:
按专业前端给的意见,这请求后加上一个随机时间戳参数,即可避免浏览器缓存。

2017-10-05 00:23:03

#10 istony

解决了,谢谢jake!

不过问题还是出在 ob_fush()这里:查看SpeedPHP手册,看到由于sp框架默认开启了ob_start,
'auto_ob_start' =>TRUE,//是否自动开启缓存输出控制,默认值:TRUE,其作用相当于ob_start()
但是,在代码里面写入了一行 ob_flush();仍然无效,又查询php手册发现ob_start(),可以嵌套调用,下面是php官网的原话:
输出缓冲区是可堆叠的,这即意谓着,当有一个 ob_start() 是活跃的时, 你可以调用另一个 ob_start() 。 只要确保又正确调用了 ob_end_flush() 恰当的次数即可。 如果有多重输出回调函数是活跃的,输出内容会一直按嵌套的顺序依次通过它们而被过滤。
猜想可能堆叠调用了,使用函数:ob_get_level()果然“返回输出缓冲机制的嵌套级别为2”,将代码改为如下,关闭2次缓冲区,运行正常




2017-10-05 02:16:55

#11 istony

istony 发表于 2017-10-5 02:16
解决了,谢谢jake!

不过问题还是出在 ob_fush()这里:查看SpeedPHP手册,看到由于sp框架默认开启了ob_sta ...
解决了,谢谢jake!

不过问题还是出在 ob_fush()这里:查看SpeedPHP手册,看到由于sp框架默认开启了ob_start,
'auto_ob_start' =>TRUE,//是否自动开启缓存输出控制,默认值:TRUE,其作用相当于ob_start()
但是,在代码里面写入了一行 ob_flush();仍然无效,又查询php手册发现ob_start(),可以嵌套调用,下面是php官网的原话:
输出缓冲区是可堆叠的,这即意谓着,当有一个 ob_start() 是活跃的时, 你可以调用另一个 ob_start() 。 只要确保又正确调用了 ob_end_flush() 恰当的次数即可。 如果有多重输出回调函数是活跃的,输出内容会一直按嵌套的顺序依次通过它们而被过滤。
猜想可能堆叠调用了,使用函数:ob_get_level()果然“返回输出缓冲机制的嵌套级别为2”,将代码改为如下,关闭2次缓冲区,运行正常

2017-10-05_021800.jpg

2017-10-05 02:24:20

#12 jake

istony 发表于 2017-10-5 02:24
解决了,谢谢jake!

不过问题还是出在 ob_fush()这里:查看SpeedPHP手册,看到由于sp框架默认开启了ob_s ...
其实问题并非ob相关函数,而是服务器配置的缓存区,一般HTTP服务器会缓存输出1k数据的,我们做持续输出的时候,如果要刷出小量数据,要给输出补齐1K数据,这是最稳妥的方法,可以百度看看这个的解决方案。记得好像是用pack函数什么的,忘记了。

你的解决方案是关闭系统缓冲区,这样不太好。

3.1版框架有配置可以关闭ob_start的,不过跟这个问题无关,因为服务器自带有缓冲区,ob函数只是对缓冲区的部分控制。

2017-10-05 14:21:52

#13 istony

jake 发表于 2017-10-5 14:21
其实问题并非ob相关函数,而是服务器配置的缓存区,一般HTTP服务器会缓存输出1k数据的,我们做持续输出的 ...
好,我根据你的信息,再百度找下相关信息,调试一下,辛苦喽:handshake

2017-10-05 14:57:26