Php is_readable()仅当在会话开始前至少调用一次时才返回true

Php is_readable()仅当在会话开始前至少调用一次时才返回true,php,Php,我的一个PHP服务器上有一些奇怪的东西。其他服务器表现出不同的行为。但我不认为这是由环境造成的 我开始相信这是一个错误。有人听说过这个吗 is_readable()只会返回true,如果您在启动会话之前至少调用它一次 如果首先启动会话,则所有都是可读的()调用返回false。尽管您仍然可以使用readfile()读取文件 <?php // do session_start() to here and you will get BadBad error_reporting(E_ALL);

我的一个PHP服务器上有一些奇怪的东西。其他服务器表现出不同的行为。但我不认为这是由环境造成的

我开始相信这是一个错误。有人听说过这个吗

is_readable()
只会返回true,如果您在启动会话之前至少调用它一次

如果首先启动会话,则所有
都是可读的()
调用返回false。尽管您仍然可以使用
readfile()
读取文件

<?php
// do session_start() to here and you will get BadBad

error_reporting(E_ALL);
ini_set('display_errors',1);
ini_set('display_startup_errors',1);
ob_start();

// or do session_start() here and you will also get BadBad
echo is_readable("foo.bar") ? "Good" : "Bad";
// But do session_start() here and you get GoodGood
echo is_readable("foo.bar") ? "Good" : "Bad";
// or even do it here and you will still get GoodGood

echo @++$_SESSION['counter'];   // incrementing number always follow GoodGood or BadBad
readfile("foo.bar");            // the contents also always follow GoodGood or BadBad
?>

递增的数字始终显示,因此会话工作正常

此外,文件内容始终显示,因此文件是可读的

我正在Windows Server 2012上运行32位PHP版本5.3.26,使用IIS 7.5运行64位


可能是什么?

试试clearstatcache()。由于您测试的是同一个文件,您只需在第二次调用和后续调用中读取缓存项。解决此问题的方法完全不同-我使用
SplFileInfo
SPLFileObject
例程处理所有“这些类型的文件查询”,因为我怀疑它们需要正常工作?@MarcB我尝试将
clearstatcache()
在任何地方之间,但它不会改变任何东西。如果
session\u start()
是第一个,输出是坏的。如果
是可读的()
是第一个,输出是好的。输出从来都不是坏的。@RyanVincent是的,
SplFileInfo::openFile()
SplFileInfo::isReadable()
按预期工作。与之不同,
是可读的()
在这台机器上不正确。但这还不能为我解释。我怀疑你在PHP上遇到了一个“错误”。我理解这是多么令人沮丧和“浪费时间”。我在“Windows”上开发,在“linux”上部署。和你一样,我需要在两种环境下都能正常工作的“文件查询”例程。因此我使用了SplFile的例程。它们工作可靠。