header 之前有输入会导致错误的原因

本文详细解析了PHP输出缓存机制与HTTP协议交互时可能导致的问题,包括输出内容与头部信息冲突的情况,以及如何通过开启输出缓存来避免错误。通过实例代码和错误日志分析,读者可以深入理解PHP输出流程及解决实际开发中遇到的类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直只知道不能有输出,具体理由还不知道。今天明白了。

 

 由于 目前对 http 协议不是很清楚,所以不能具体说明。

 

例子:test.php

echo 'test';
header('content-type:text/html;charset=utf-8');


上面的代码 在 php.ini 中

output_buffering=Off 的时候会导致一个错误(关闭php默认缓存)

test.php 在执行的时候由于php缓存被关闭,所以他直接先把 test 输出 然后在去修改 头信息。

 

http协议有2个部分,一个是头信息部分和主题(body)部分,应该要先将头信息输出后在输出主题

由于在代码中 header不再第一行,因此 在访问 test.php 的时候 已经把头信息给输出掉了。

然后输出 test 之后在试图修改 头信息 此时已经无法修改头信息了 因此我们能看到这样一段错误

Warning: Cannot modify header information - headers already sent by (output started at D:\PHPnow-1.5.6\htdocs\test.php:2) in D:\PHPnow-1.5.6\htdocs\test.php on line 4


大概意思是在说 头信息无法修改。

下面抓包的图

 

头信息 content-type 为 text/html; 因为代码的第一行不是 header 解释时可能是认为没有对头信息进行修改 所以直接先输出了默认的头信息

 

在看下面的图

正文部分 输出了 11 之后 才发现 有一段 header 代码 试图修改了头信息,因为 头信息已经输出掉了 所以无法进行修改。

这只是一个警告非错误。

如果在php关闭了默认缓存的情况下 让上面的代码不发生错误 可以使用 php 缓存函数

ob_start();
echo 'test';
header('content-type:text/html;charset=utf-8');
echo 'tests';


 

ob_start 开启环迅,将页面的所有输出都丢到缓冲区。

此时 因为页面的输出会保存到缓冲区中 所以在执行 header 之前是没有任何输出。

那么在什么时候才会把缓冲区的内容释放出来呢? 应该是 4096 字节满了就会释放(这个好像可以修改)

要么手动释放。 如何判断他们是在缓冲区而没有输出?

 

$str = ob_get_contents();


他能返回缓冲区的内容,可以把这个内容写入到一个文件中进行查看。

 

顺便将常见的 缓存函数列出来

 

ob_clean -- > 清空缓冲区

ob_end_clen()  --> 关闭缓冲同时清空缓冲区

ob_end_flush()  --> 关闭缓存并输出缓冲区的内容

ob_flush()   --> 输出缓冲区的内容 并清空缓冲区

flush();  --> 刷新程序缓存( 他是程序缓存,不是 ob缓存,php有2个缓存,一个是ob 一个是 程序)

 

for($i = 0; $i < 3; $i++) {
	echo str_repeat(' ' , 256);
	echo $i;
	sleep(1);
	flush();
}


 

这段代码如果没有flush (刷新程序缓存) 那么会等待50秒后才显示 0 - 49

因为循环没有结束时会把所有的 echo 都丢到 程序缓存中,当循环结束后 才会刷新程序缓存 把 0 - 49 一口气显示

 

但是现在每等待1秒中就刷新了程序缓存 所以 按道理 应该每过一秒就得看到一个数字被打印才对,但是使用看不到 还是和原来一样。

其实这不是 flush的问题,他确实刷新了程序缓存,只不过(如果你用的是ie) 浏览器也有自己的缓存,当页面输出的内容少于  256个字节时

是不会显示到文档中,这段代码稍微修改

for($i = 0; $i < 3; $i++) {
	echo str_repeat(' ' , 256);
	echo $i;
	sleep(1);
	flush();
}


 

在输出 $i 之前 先打印 256个空字符 之后在输出 $i 则能看到效果。
<think>好的,用户现在遇到了一个错误:“错误:Error Invalid Macro file header OK”。我需要先理解这个错误原因以及如何解决。 首先,用户可能在Tecplot中运行宏时遇到了这个问题。错误信息提到“Invalid Macro file header”,这通常意味着宏文件的头部格式不正确。Tecplot的宏文件需要以特定的文件头开始,比如版本号或者正确的注释格式。如果用户自己编写了宏,可能在文件开头缺少了必要的标识符或者格式错误。 接下来,我要考虑用户可能的操作步骤。用户可能尝试运行自己创建的宏文件,但文件开头没有正确的标识符,例如没有以“#!MC 1410”这样的版本号开头。或者,用户可能在保存宏文件时使用了错误的编码或文件扩展名,比如保存为.txt而不是.mcr。此外,宏文件中可能存在非法字符或者语法错误,比如在注释行使用了错误的符号,或者命令拼写错误。 用户可能不太清楚Tecplot宏文件的结构要求,所以需要详细解释正确的文件头应该是什么样子的。例如,有效的宏文件通常以版本声明开始,如“#!MC 1410”,或者至少有一个正确的注释行。同时,需要提醒用户检查文件的扩展名是否为.mcr,并且确保没有在文件开头添加了多余的空格或特殊字符。 另外,用户可能是在复制宏代码时不小心加了不可见的字符,或者使用了不兼容的文本编辑器,导致文件头不符合Tecplot的要求。这时候需要建议用户使用纯文本编辑器(如Notepad++或VS Code)来编辑宏文件,并确保保存时编码为UTF-8,没有BOM头。 还需要考虑用户的操作系统环境,比如是否在Windows系统下,文件路径是否有特殊字符,或者文件名是否正确。有时,文件名中的空格或特殊字符也可能导致问题,但根据错误信息,更可能的问题还是文件头格式不正确。 总结可能的解决方案步骤: 1. 检查宏文件的开头是否有正确的文件头,如“#!MC 1410”。 2. 确保文件扩展名为.mcr。 3. 使用合适的文本编辑器,避免添加非法字符。 4. 检查是否有语法错误,如拼写错误或格式问题。 5. 验证宏命令的正确性,特别是用户提供的示例宏是否有误。 同时,需要给出具体的示例,展示正确的宏文件格式,比如以版本声明开头,然后才是具体的命令。还要提醒用户如何正确保存和运行宏,例如在Tecplot中使用“宏 > 加载宏”功能,而不是直接双击文件。 可能用户之前尝试了提供的抽稀宏代码,但在保存为宏文件时没有正确设置文件头,导致无法识别。这时候需要指出问题所在,并给出修改后的正确示例,帮助用户纠正错误。</think>以下是关于 **Tecplot 宏文件头错误 `Error: Invalid Macro file header`** 的详细解释及解决方案: --- ### **错误原因** 此错误表示 Tecplot 无法识别宏文件的**文件头格式**。可能原因包括: 1. **文件头缺失**:宏文件未以 `#!MC` 或 `#!MC 版本号` 开头。 2. **版本号不兼容**:指定了 Tecplot 不支持的版本号(如 `#!MC 9999`)。 3. **编码或格式错误**:文件保存时使用了非 UTF-8 编码,或包含非法字符(如中文标点或 BOM 头)。 --- ### **修复方法** #### 1. **添加标准文件头** ```plaintext #!MC 1410 # 推荐版本号(适用于 Tecplot 360 2021R2 及以上) # 注释行(可选) ``` - **必须**以 `#!MC` 开头,后接空格和版本号(如 `1410`)。 - 版本号对应 Tecplot 版本(可通过 `Help > About Tecplot 360` 查询)。 #### 2. **检查文件保存格式** - **扩展名**:必须为 `.mcr`(如 `script.mcr`)。 - **编码**:使用 **UTF-8 无 BOM**(推荐使用 Notepad++、VS Code 等编辑器保存)。 #### 3. **验证示例** ```mcr #!MC 1410 $!RedrawAll # 示例命令:重绘界面 ``` 将此代码保存为 `test.mcr`,在 Tecplot 中加载测试是否报错。 --- ### **常见错误案例** | **错误写法** | **修正后** | |--| | 无文件头(直接写命令) | `#!MC 1410` + 命令 | | `##!MC 1410`(多一个`#`) | `#!MC 1410` | | `#!MC1410`(缺少空格) | `#!MC 1410` | --- ### **操作步骤** 1. **创建宏文件** 用文本编辑器新建文件,**首行添加 `#!MC 1410`**。 2. **编写宏命令** 在文件头下方输入 Tecplot 宏代码(如抽稀、绘图命令)。 3. **保存文件** 命名为 `xxx.mcr`,编码选择 **UTF-8 无 BOM**。 4. **加载宏** 在 Tecplot 中点击 `宏 (Macro) > 加载宏 (Load Macro)`,选择文件运行。 --- ### **进阶排查** - **检查隐藏字符**: 使用十六进制编辑器(如 Hex Editor)查看文件开头是否包含 `EF BB BF`(BOM 头),若有需删除。 - **版本兼容性**: 若仍报错,尝试替换 `#!MC 1410` 为更早版本(如 `#!MC 1200`)。 - **命令行调试**: 在 Tecplot 控制台(`View > Console`)中直接输入宏命令,验证是否语法错误。 --- ### **示例修正后的抽稀宏文件** ```mcr #!MC 1410 # 对三维区域 "fluid" 进行五倍抽稀,生成新区域并重命名为 "fluid2" $!EXTRACTSUBSET EXTRACTUSING = SUBSAMPLE SKIPX = 5 SKIPY = 5 SKIPZ = 5 ZONELIST = 'fluid' EXTRACTTO = NEWZONE $!RENAMEZONE ZONE = LASTADDEDZONE NAME = 'fluid2' ``` --- ### **总结** - **核心原则**:文件首行必须是 `#!MC 版本号`。 - **编码与扩展名**:确保 `.mcr` + UTF-8 无 BOM。 - 若需进一步帮助,请提供: 1. 完整的宏文件内容 2. Tecplot 版本号 3. 文件保存时使用的编辑器名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值