使用 PHP 读取文件 - fopen/fread


Reading files with 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;
?>

我每个人都收到这些错误:

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

警告:文件大小() [函数.文件大小]:统计失败。/顶部.txt

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

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

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

服务器上存在所有文件

PHP5 安装在服务器上

我做错了什么?

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

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

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

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

来自 PHP 手册:

如果 PHP 决定文件名指定本地文件,那么它将 尝试打开该文件上的流。该文件必须可供 PHP 访问, 所以你需要确保文件访问权限允许这样做 访问。如果您已启用安全模式,或open_basedir进一步 可能有限制。

我建议您检查open_basedir和包含路径。

以下是一些代码来帮助您执行此操作:

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通常如何处理文件路径(正如其他一些答案似乎表明的那样),那么请阅读以下内容(也来自手册):

根据给定的文件路径包含文件,如果没有给出,则包含文件, 指定的include_path。如果在 include_path,包含最终将签入调用脚本自己的 目录和失败前的当前工作目录。这 包含构造如果找不到文件将发出警告;这 与 require 的行为不同,这将发出致命错误。

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

我假设您不使用安全模式,因为它现已弃用。