Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-is_readable()返回不正确的值_Php_File_Fopen_Fread - Fatal编程技术网

PHP-is_readable()返回不正确的值

PHP-is_readable()返回不正确的值,php,file,fopen,fread,Php,File,Fopen,Fread,我使用的脚本如下: $path = dirname(__FILE__)."/folder/file.ext" if(is_readable($path)){ $file = fread(fopen($path,"r"), filesize($path)); }else{ //do something else if file can't be opened } 令人惊讶的是,它会产生以下错误: Warning: fread() [function.fread]: Lengt

我使用的脚本如下:

$path = dirname(__FILE__)."/folder/file.ext"
if(is_readable($path)){
     $file = fread(fopen($path,"r"), filesize($path));
}else{
     //do something else if file can't be opened
}
令人惊讶的是,它会产生以下错误:

Warning: fread() [function.fread]: Length parameter must be greater than 0
in /nfs/c10/h02/mnt/161920/domains/example.com/html/my-folder/file.php on line 16

我想知道为什么会这样。它只在某些服务器上发生,在其他服务器上也可以。成功使用fread的要求是什么?文件存在于该位置。

如果文件为空,则可以读取该文件。但不能使用
fread
读取0字节

空文件==文件大小为0


对于您的用例,您还可以使用PHP函数。

正如大家所说,文件大小可能为0

按照建议使用
file\u get\u contents
,或者如果您确实想要/需要使用
fread()
,您可以在php 5.3+上使用以下内容:

$path = dirname(__FILE__)."/folder/file.ext"
if(is_readable($path)){
    $file = fread(fopen($path,"r"), filesize($path) ?: 1);
}else{
    //do something else if file can't be opened
}
注意
?:1
?这叫一个。也就是说,如果计算结果为true(即大于0),则使用filesize,或者使用1


肯定不是最佳做法,但指出这一点很有趣。

查找文件\u获取\u内容(),而不是在阅读文件后不关闭文件的黑客攻击。您的
文件大小($path)
值为0或小于零,请通过打印检查该值。很好:)非常感谢!现在我明白了。太好了:)非常感谢!现在我明白了,谢谢你的这个
?:
技巧。请仔细阅读,这是一个漂亮的功能!是的,我知道这一点-我经常使用它,但我会使用
文件获取内容
,因为
?:1
看起来像是一些不安全的欺骗((1)如果文件为0,则给文件1字节是否安全?它可能会导致进一步的问题(2)为什么它有0?我的所有文件都没有0-除非它也尝试加载一些隐藏文件,因为我正在执行
scandir
,我只排除
,(3)即使文件是空的,它不应该总是有一些大小吗?);我将使用语义显式方法。但要回答您的问题:(1)是的,我相信是这样,fread只是想知道要读多少,(2)不知道,但(3)它不是无效的:也许有些服务器包含“零字节”文件,而其他服务器则不包含。我将很快在客户端服务器上用
file\u get\u contents
测试这一点,它可能会正常工作:)非常感谢您的回答!我将此标记为已接受答案,因为它包含更多信息,但此问题的两个答案都是正确的。