在更新到5.4之后,fopen可以';t读取文件


After update to 5.4, fopen can't read file

我在一台主机上有一个网站,最近从PHP 5.2切换到了5.4,要求我们选择一个新的PHP.ini文件:5.4纯、5.4 solo(整个网站只使用一个PHP.ini文件)和5.4快。

我不知道在切换之前我使用的是哪一个,但当我切换时(我选择了5.4独奏),我注意到我的网站中依赖mbstring(多字节字符)的部分不再工作。

具体来说,它打开一个充满字符的文本文件,然后在加密脚本中使用,并将垃圾存储在mysql数据库中。然后,为了检索它,它再次通过脚本运行并解密,然后显示在屏幕上。

在5.4的变化之前,这一直很好。现在,它似乎无法检索(打开?)文本文件。我已经用一个非多字节字符版本进行了测试,效果很好,所以我不认为问题出在代码上,而是PHP处理多字节字符的方式。。。我怀疑,只是一种预感,这是可以通过某种方式调整PHP.ini文件来解决的。Zend.multibyte似乎是PHP的新事物。

我的问题是我不知道该调整什么。我尝试了几种不同的Zend.multibyt/bstring组合,但都不起作用。

我知道,在发送字符串进行加密之前,一切都正常。它返回为null值,而不是乱码字符串。我觉得字符串中的某些内容被PHP拒绝了,因此它失败了。。。不提供任何东西,而应该提供字符串。

有人想过可能会发生什么吗?为什么我的剧本不再适用于5.4?我已经检查并加载了mbstring模块,php.ini中有默认值。

任何建议都很好。。。我完全被难住了。即使是一些额外的报告或测试或缩小问题范围的方法也会非常棒。

谢谢!

这里有一些代码,我认为问题出在哪里:

$this->s1 = "";
$s1array = array("a1.txt", "a2.txt", "a3.txt");

foreach ($s1array as $i => $value) {
            $myFile = "../a/dir/somewhere/$s1array[$i]";
            $fh = fopen($myFile, 'r');
            $theData = fgets($fh);
            fclose($fh);
            $this->s1 .= html_entity_decode($theData, ENT_NOQUOTES, 'UTF-8');    
}

文件/a/dir/somewhere/a1.txt和/a/dir/somewhere/a2.txt(etc)是html编码字母的半逗号分隔字符串,例如:&x0fb0f&x02c97&x00436&x10833&x00514;(我添加了空格,这样它就可以显示代码而不是HTML值!)。

但我想现在,由于某种原因,上面的代码没有返回任何结果。如果我将结果分配给一个变量并回显该变量,则什么都没有。但是如果我分配$this->s1="abcde";或者一个较长的字符串,跳过"foreach"部分,它就会起作用。因此,在这个过程中,这个代码在5.4中不再有效。有人能说出这里发生了什么吗?非常感谢。

为什么在可以使用file_put_contentsfile_get_contents的情况下对文本文件使用fopen等-它们大多是fopen、freads等的包装器。我从未在使用这两个函数时遇到过任何问题。

还要确保所有内容(从php,到db(如果您正在使用它的话),以及php文件)都已编码或使用utf8。没有什么比latin2中的*.php文件和utf8中的其他文件更有趣的了。