是ob_start()
用于output buffering
使头被缓冲,而不是发送到浏览器?我在这里有道理吗?如果没有那么我们为什么要使用ob_start()
?
flush()不一定将文件的数据写入磁盘.使用flush()后跟os.fsync()来确保此行为.
所以我的问题是:Python到底在flush
做什么?我认为它强制将数据写入磁盘,但现在我发现它没有.为什么?
我正在尝试使用PHPunit来测试输出一些自定义标头的类.
问题是在我的机器上这个:
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
$headers_list = headers_list();
header_remove();
ob_clean();
$this->assertContains('Location: foo', $headers_list);
}
}
Run Code Online (Sandbox Code Playgroud)
甚至这个:
<?php
class HeadersTest extends PHPUnit_Framework_TestCase {
public function testHeaders()
{
ob_start();
header('Location: foo');
header_remove();
ob_clean();
}
}
Run Code Online (Sandbox Code Playgroud)
返回此错误:
name@host [~/test]# phpunit --verbose HeadersTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.
E
Time: 0 seconds, Memory: 2.25Mb
There was 1 error:
1) HeadersTest::testHeaders
Cannot modify header information - headers already sent by (output started at /usr/local/lib/php/PHPUnit/Util/Printer.php:173)
/test/HeadersTest.php:9 …
Run Code Online (Sandbox Code Playgroud) 我ob_flush()
和flush()
两个人之间有什么区别?
该ob_flush()
参考说:
此函数将发送输出缓冲区的内容(如果有).
该flush()
参考说:
刷新PHP的写缓冲区以及PHP正在使用的任何后端(CGI,Web服务器等).
但是,它继续说:
[它]可能无法覆盖您的Web服务器的缓冲方案......
所以,在我看来,我可以只使用ob_flush()
所有的时间.但是,当我这样做时,我得到了奇怪的结果.有人可以用简单的语言解释这里发生了什么吗?
在PHP中,有没有办法清除/删除所有以前回显或打印的项目?
例如:
<?php
echo 'a';
print 'b';
// some statement that removes all printed/echoed items
echo 'c';
// the final output should be equal to 'c', not 'abc'
?>
Run Code Online (Sandbox Code Playgroud)
我的脚本使用include函数.包含的文件不应该回应任何东西.为了防止有人(ex = hacker)尝试,我需要一种方法来删除.
在节点v8.1.4和v6.11.1上
我开始使用以下echo服务器实现,我将其称为pipe.js或pipe.
const http = require('http');
const handler = (req, res) => req.pipe(res);
http.createServer(handler).listen(3001);
Run Code Online (Sandbox Code Playgroud)
我用wrk和下面的lua脚本(为简洁起见缩短了)对它进行了基准测试,它将发送一个小体作为有效载荷.
wrk.method = "POST"
wrk.body = string.rep("a", 10)
Run Code Online (Sandbox Code Playgroud)
每秒2k请求和44ms的平均延迟,性能不是很好.
所以我编写了另一个使用中间缓冲区的实现,直到请求完成,然后将这些缓冲区写出来.我将其称为 buffer.js或buffer.
const http = require('http');
const handler = (req, res) => {
let buffs = [];
req.on('data', (chunk) => {
buffs.push(chunk);
});
req.on('end', () => {
res.write(Buffer.concat(buffs));
res.end();
});
};
http.createServer(handler).listen(3001);
Run Code Online (Sandbox Code Playgroud)
性能发生了巨大变化,buffer.js每秒处理20k次请求,平均延迟为4ms.
在视觉上,下图描绘了超过5次运行和各种延迟百分位数的服务请求的平均数量(p50是中位数).
因此,缓冲区在所有类别中都要好一个数量级.我的问题是为什么?
接下来是我的调查笔记,希望它们至少具有教育意义.
这两个实现都是精心设计的,因此它们会给出与返回的完全相同的响应curl -D - --raw
.如果给出一个10 d's的主体,两者都将返回完全相同的响应(当然,修改时间): …
它们似乎都做同样的事情:将输出缓冲区内容返回给你并在之后删除它.
我应该使用哪一个?
ob_clean()
和之间有什么区别ob_flush()
?
还有什么区别ob_end_clean()
和ob_end_flush()
?我知道ob_get_clean()
并且ob_get_flush()
都获得内容和结束输出缓冲.
抑制函数可能产生的任何输出的最简单方法是什么?说我有这个:
function testFunc() {
echo 'Testing';
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想调用testFunc()并获得其返回值,而不会在页面中显示"Testing".假设这是在其他代码的情况下不输出其他的东西,是有这样的好方法?也许搞乱输出缓冲区?
output-buffering ×10
php ×8
echo ×1
flush ×1
fsync ×1
function ×1
http ×1
io ×1
javascript ×1
node.js ×1
output ×1
phpunit ×1
python ×1
stream ×1
unit-testing ×1