<?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安装在服务器上
我做错了什么?
答案 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_basedir和include 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。