阅读与PHP文件 - 的fopen/FREAD

问题描述:

<?php 

$top = "../top.txt"; 
$middle = "../middle.txt"; 
$bottom = "../bottom.txt"; 
$end = "/st.txt"; 
$data = "/dt.txt"; 

$handle1 = fopen($top, "r"); 
$contents1 = fread($handle1, filesize($top)); 
fclose($handle1); 

$handle2 = fopen($end, "r"); 
$contents2 = fread($handle2, filesize($end)); 
fclose($handle2); 

$handle3 = fopen($middle, "r"); 
$contents3 = fread($handle3, filesize($middle)); 
fclose($handle3); 

$handle4 = fopen($data, "r"); 
$contents4 = fread($handle4, filesize($data)); 
fclose($handle4); 

$handle5 = fopen($bottom, "r"); 
$contents5 = fread($handle5, filesize($bottom)); 
fclose($handle5); 

echo $contents1; 
echo $contents2; 
echo $contents3; 
echo $contents4; 
echo $contents5; 

?> 

我得到这些错误为他们每个人:阅读与PHP文件 - 的fopen/FREAD

警告:的fopen(../ top.txt)[function.fopen]:未能打开流:没有这样的文件或目录

警告:文件大小()[function.filesize]:STAT失败../top.txt

警告:的fread():提供的参数是不是一个有效流资源

警告:FCLOSE():提供的参数是不是一个有效的流资源

文件模式中的所有文件和文件夹,并设置为777

存在于服务器上的所有文件

PHP5安装在服务器上

我在做什么错?

+0

['file_get_contents()'](http://php.net/file_get_contents)可能是你感兴趣的。 – mario 2012-08-08 22:08:05

+0

检查[include_path](http://us2.php.net/manual/en/function.get-include-path.php)和[open_basedir](http://www.php.net/manual/en/ini .core.php#ini.open-BASEDIR) – ghbarratt 2012-08-08 22:08:52

$top = "../top.txt"; 

意味着从您的当前位置是移动一个文件夹时,并搜索文件top.txt。这与$middle = "../middle.txt";$bottom = "../bottom.txt";相同。对于这两个:

$end = "/st.txt"; 
$data = "/dt.txt" 

它从根目录搜索。确保你的文件位于你引用它们的地方。我可能会认为你在最后两个变量希望这个:

$end = "./st.txt"; 
$data = "./dt.txt" 

其中./代表当前目录。

因此,给你更详细的例子。比方说,你有你的PHP文件位于/var/www/httpdocs/project/phpFile.php那么你的文件会像被链接:

$top = "/var/www/httpdocs/top.txt"; 
$middle = "/var/www/httpdocs/middle.txt"; 
$bottom = "/var/www/httpdocs/bottom.txt"; 

$end = "/st.txt"; 
$data = "/dt.txt" 

所以现在注意到,在过去的两个变量的区别 - 它们保持不变,因为你已经将它设置为寻找从根目录(/)。在哪里,如果你会使用联用./,那么路径将是:

$end = "/var/www/httpdocs/project/st.txt"; 
$data = "/var/www/httpdocs/project/dt.txt" 

希望这可以解释它。是的,看看答案中提到的其他人的职能。

使用全路径,而不是 ../top.txt 使用 /path/to/top.txt

OR

你一个也使用 $top = $_SERVER['DOCUMENT_ROOT'] . "/../top.txt";

PHP manual

如果PHP认为filename指定一个本地文件,那么它会 试图打开该文件的流。该文件必须可供PHP, 访问,因此您需要确保文件访问权限允许访问此 。如果您启用了安全模式,或者open_basedir进一步 限制可能适用。

我建议你检查open_basedirinclude path

下面是一些代码来帮助你做到这一点:

echo 'open_basedir: '.ini_get('open_basedir')."\n"; 
echo 'Include path: '.get_include_path()."\n"; 
echo 'Current path: '.__DIR__."\n"; 

有了,你应该能够确认您是能够达到的范围内或下的open_basedir的目录的文件。如果open_basedir是“空白”,那么PHP不应该强制执行任何限制。

如果你真正需要的是怎样的文件路径通常是由PHP处理(如一些其他的答案似乎表明),那么read this(也由手动)的解释:

文件包括基于给定的文件路径,或者如果没有给出,则指定include_path。如果文件在 include_path中找不到,include将最终在失败之前检入调用脚本自己的 目录和当前工作目录。包含构造的 如果找不到文件将发出警告;这个 与require的行为不同,它会发出致命错误。

如果路径定义 - 无论是绝对的(从驱动器盘符 或\ Windows上,或/在Unix/Linux系统),或相对于 当前目录(开始或...) - include_path中将完全忽略 。例如,如果文件名以../开头,则解析器将在父目录中查找以查找所请求的文件。

我假设你没有使用安全模式,因为它是now deprecated