@cornel: 当你认为你拥有这个人时,说“不要那样做”很容易。但是一个人并不总是拥有最初的编码者,甚至不是一个原始编码者的十几个。你真的建议在替代方法可能是查看数百个你没有编写、没有引入错误的源文件时,使用此函数作为临时解决方案是错误的吗?
不过,对于你的观点,不应在文件的末尾放置结束 PHP 标签是一个普遍接受的最佳实践。但是,当执行该操作需要时间机器时,使用 ob_clean() 作为临时解决方案来使动态生成的图像按预期工作是合适的。
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
ob_clean — 清除(擦除)活动输出缓冲区的内容
此函数调用输出处理程序(使用 PHP_OUTPUT_HANDLER_CLEAN
标志),丢弃其返回值并清除(擦除)活动输出缓冲区的内容。
此函数不会像 ob_end_clean() 或 ob_get_clean() 那样关闭活动输出缓冲区。
ob_clean() 在没有使用 PHP_OUTPUT_HANDLER_CLEANABLE
标志启动的活动输出缓冲区的情况下会失败。
此函数没有参数。
如果函数失败,它会生成一个 E_NOTICE
。
@cornel: 当你认为你拥有这个人时,说“不要那样做”很容易。但是一个人并不总是拥有最初的编码者,甚至不是一个原始编码者的十几个。你真的建议在替代方法可能是查看数百个你没有编写、没有引入错误的源文件时,使用此函数作为临时解决方案是错误的吗?
不过,对于你的观点,不应在文件的末尾放置结束 PHP 标签是一个普遍接受的最佳实践。但是,当执行该操作需要时间机器时,使用 ob_clean() 作为临时解决方案来使动态生成的图像按预期工作是合适的。
我发现这个函数在使用 php(与 GD)操作或创建图像时非常有用。
我花费了相当长的时间搜索大量包含的文件,以查找我在哪里有 PHP 结束标签后出现的不必要的空格 - 因为这导致了我所有动态生成的图像由于已设置输出而无法工作。更令人讨厌的是,这没有被 php 的错误报告捕获,因此我的日志文件中没有对问题行(行)的引用。我不知道为什么错误报告不会捕获它,因为它被设置为接受警告,并且以前也捕获过类似的事情。
尽管如此,我从未找到在生成我的图像之前添加额外空格或换行符的行(行),但我所做的是在我的图像操作代码之前以及 include/require 代码之后添加了这个方便的函数。
例如
<?php
// require some external library files
require ("lib/somelibrary.php");
require ("lib/class/someclass.php");
// clean the output buffer
ob_clean();
// simple test image
header("Content-type: image/gif");
$im = imagecreate (100, 50);
imagegif($im);
imagedestroy($im);
?>
虽然这似乎是对该函数的微不足道的使用,但实际上它非常有用,可以确保在 php 中创建图像时没有任何额外的空格或换行符已经被输出。正如你们中的许多人可能已经知道的那样,出现在图像代码之前的额外行、间距和填充会阻止图像创建。如果文件“lib/somelibrary.php”在结束 PHP 标签之后至少有一个额外的换行符,那么它将完全阻止上面的脚本中的图像正常工作。
如果你像我一样在一个非常大的项目中工作,并且有很多源文件和必需文件,那么在使用 php 创建图像之前,总是清除输出缓冲区是明智之举。
不要使用 ob_clean() 来清除包含文件“意外”生成的空格或其他不需要的内容。
包含文件本身不应该生成不需要的内容。
如果它们确实如此,那么你做错了什么,比如在“?>”之后插入空格(在 PHP 文件的末尾不应该有“?>”: https://php.net/manual/en/language.basic-syntax.phptags.php)。
如果缓冲区中还没有任何输出,然后实现 ob_clean(),则会生成(软)错误通知,例如以下内容
Notice: ob_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete. in [file-path]
你可以使用“ob_get_contents()”进行简单的检查,以确保缓冲区中存在任何内容。