1
<?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安装在服务器上

我究竟做错了什么?

4

3 回答 3

2

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

或者

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

于 2012-08-08T22:06:25.507 回答
1
$top = "../top.txt";

表示从您当前的位置向上移动一个文件夹,然后搜索文件top.txt$middle = "../middle.txt";和相同$bottom = "../bottom.txt";。对于这两个:

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

它从根目录搜索。请确保您的文件位于您引用它们的位置。我可能认为您希望在最后两个变量中使用它:

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

where./代表当前目录。

所以,给你更详细的例子。假设您的 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"

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

于 2012-08-08T22:07:53.747 回答
0

PHP 手册

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

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

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

于 2012-08-08T22:40:39.647 回答