用PHP读取文件 - fopen / fread

时间:2012-08-08 22:03:55

标签: php file 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;

?>

我为每一个都得到了这些错误:

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

警告:filesize()[function.filesize]:./ top.txt

的统计信息失败

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

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

所有文件和文件夹中的CHMOD并设置为777

服务器上存在所有文件

PHP5安装在服务器上

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

OR

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

答案 1 :(得分:1)

$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"

希望这能解释它。是的,请查看其他人在答案中提到的功能。

答案 2 :(得分:0)

来自PHP manual

  

如果PHP已经确定文件名指定了本地文件,那么它将会   尝试在该文件上打开一个流。该文件必须可供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将最终检入调用脚本自己的   失败前的目录和当前工作目录。该   如果找不到文件,include构造将发出警告;这个   与require不同的行为,会发出致命的错误。

     

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

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