【问题标题】:Reading files with PHP - fopen/fread使用 PHP 读取文件 - fopen/fread
【发布时间】:2012-08-06 02:46:15
【问题描述】:
<?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]:stat failed for ../top.txt

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

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

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

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

服务器上已安装PHP5

我做错了什么?

【问题讨论】:

标签: php file fread


【解决方案1】:

来自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

【讨论】:

    【解决方案2】:
    $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"
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多