Ubuntu下php找不到gzopen函数的BUG

gzopen是php中用于打开gz文件的函数,依赖于zlib这个扩展,zlib在Windows下的php中是默认安装的,但是在Linux下却不是,需要在编译时加上--with-zlib[=DIR]参数。如果在编译PHP的时候忘记加上这个参数,那编译出来的PHP中就没有gzopen这个方法。如果PHP中使用了gzopen函数,就会报错:“Fatal error: Call to undefined function gzope”,这时候请参考我的另一篇文章:不重新编译PHP为PHP安装zlib扩展

但本文说的不是没安zlib,而是在ubuntu软件仓库的PHP已经安装了zlib,但仍然没有gzopen这个函数。困扰了我好几个小时,以为是我自己环境哪儿搞得不对,一无所获。在Google上一搜索,发现gzopne函数未定义的问题是Ubuntu下的老问题了,我看到的很多老外反馈的帖子最早有2009年的,ubuntu论坛也有大量的相同反馈,但ubuntu官方直到现在也没有处理这个BUG。解决的办法都比较别扭:

一种是直接用第三方编译的PHP代替,不过我发现当时的一些源已经不存在了。

一种是自己编译PHP,这当然可行但是太麻烦了

最后一种是我用的办法:用gzopen64代替gzopen

说到这个gzopen64,许多php程序员肯定大吃一惊,PHP里还有这么个函数吗?没有,至少php官方的函数手册里是找不到的,但在Ubuntu的php中有。那gzopen64这个函数是从哪儿冒出来的?谁也不知道,我只是在老外的论坛帖子里找到这么个说法,亲自一试,果然能用。gzopen64与gzopen有什么区别?我也想知道,不过从我测试的结果看,二者没有任何差别。那为什么Ubuntu官方这么多年一直这么搞?我也很纳闷,可能他们想作死。

最后,我修改后的兼容这两个函数的代码如下,给大家参考。

if(function_exists('gzopen')) {
$gzp = gzopen($to.'.gz', 'rb');
} elseif(function_exists('gzopen')) {
$gzp = gzopen64($to.'.gz', 'rb');
} else {
aexit('gzopen error');
}

 评论
 发表评论
姓   名: