PHP代码在Unix正常运行,Windows 10 Apache中unset后逻辑不执行求助
unset($blocks[0])后停止执行? 首先还原你的场景:这段代码在Unix服务器运行正常,但在Windows 10的Apache环境中,echo "<hr>Reached here...<hr>";完全没输出,你已经确认$blocks数组被正确填充,但unset($blocks[0])之后的代码似乎都没执行,且无错误日志。
可能的原因及解决办法
1. PHP版本差异导致的语法不兼容
数组直接 dereferencing(比如explode(PHP_EOL, $chunk)[0]这种写法)是PHP 5.4及以上才支持的特性。如果你的Windows环境PHP版本低于5.4,这行代码会触发语法错误,直接导致脚本终止——但因为错误显示/日志未开启,你看不到任何提示,误以为是后续代码没执行。
解决办法:
- 先检查PHP版本:新建一个
phpinfo.php文件,写入<?php phpinfo(); ?>,访问后查看版本号。如果低于5.4,升级到PHP 5.4或更高版本; - 或者修改代码,拆分数组直接取值的写法:
// 把原来的 $top = explode(PHP_EOL, $chunk)[0]; 改成: $top_lines = explode(PHP_EOL, $chunk); $top = $top_lines[0];
2. 跨平台换行符差异导致数组分割失效
Unix系统中PHP_EOL是\n,而Windows中是\r\n。你下载的远程文件(来自unicode.org)换行符是Unix风格的\n,如果直接用PHP_EOL.PHP_EOL分割空行,在Windows环境下会匹配不到文件里的\n\n空行,导致$blocks数组只有一个元素——unset($blocks[0])之后数组为空,foreach循环自然不会执行,echo语句也就没机会运行。
解决办法:
不要依赖PHP_EOL,直接用远程文件固定的换行符\n来分割:
// 分割空行用 "\n\n" 而不是 PHP_EOL.PHP_EOL $blocks = explode("\n\n", file_get_contents('unicode-13.txt')); // 分割每行也用 "\n" $top_lines = explode("\n", $chunk); $top = $top_lines[0]; // 后续分割行的代码也统一用 "\n" $lines = explode("\n", $chunk);
这样不管在Unix还是Windows环境,都能正确解析远程文件的格式。
3. 输出缓冲导致echo内容未显示
Windows环境下PHP默认开启output_buffering,echo的内容会被暂存在缓冲区,直到脚本结束或者缓冲区满才会发送到浏览器——这会让你误以为代码没执行,但实际上已经运行了。
解决办法:
- 在echo语句前后添加缓冲刷新代码:
ob_flush(); flush(); echo "<hr>Reached here...<hr>"; ob_flush(); flush(); - 或者修改
php.ini中的output_buffering设置为Off,然后重启Apache服务。
额外建议:开启错误日志排查问题
因为你说Windows的PHP错误日志没有相关记录,建议先开启错误显示和日志,这样能快速定位问题:
在代码最开头添加:
error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 1); ini_set('error_log', './php_errors.log');
这样所有错误都会显示在页面上,同时记录到当前目录的php_errors.log文件中。
内容的提问来源于stack exchange,提问作者4532066

