Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么在使用包含路径时无法创建文件内容和fopen?_Php_Fopen - Fatal编程技术网

Php 为什么在使用包含路径时无法创建文件内容和fopen?

Php 为什么在使用包含路径时无法创建文件内容和fopen?,php,fopen,Php,Fopen,用于在相对位置的文件夹中创建和填充文件 注意到一些与include路径和文件创建相关的奇怪现象 简短版本:查看迭代2和迭代3。为什么后者有效,而前者无效? 迭代1 file_put_contents('../../public/remixes/screenshots/test.txt', $data); 这个很好用 第二次迭代 但是,我在这个模块的“根”中有一个公共目录,并且希望使用预设的include路径更直接地引用它。例如: echo(get_include_path()); // thi

用于在相对位置的文件夹中创建和填充文件

注意到一些与include路径和文件创建相关的奇怪现象

简短版本:查看迭代2和迭代3。为什么后者有效,而前者无效?

迭代1

file_put_contents('../../public/remixes/screenshots/test.txt', $data);
这个很好用

第二次迭代

但是,我在这个模块的“根”中有一个公共目录,并且希望使用预设的include路径更直接地引用它。例如:

echo(get_include_path()); // this outputs "../../"
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
错误:“无法打开流:没有这样的文件或目录”

迭代3

好吧,PHP包含路径是不可靠的,所以让我们做一些奇怪的事情,看看会发生什么。我将首先尝试使用实际创建文件

fopen('../../public/remixes/screenshots/test.txt', 'w');
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
这又起作用了。。。沃特

迭代4

有趣;我可以先使用fopen,但我希望它也使用include路径:

fopen('public/remixes/screenshots/test.txt', 'w', 1);
file_put_contents('public/remixes/screenshots/test.txt', $data, FILE_USE_INCLUDE_PATH);
这会产生两个“无法打开流”错误。情况越来越糟了

第5次迭代

我将不使用include路径“magic”,直接使用它构建路径

file_put_contents(get_include_path().'public/remixes/screenshots/test.txt', $data);
这很有效,是我能得到的最好的

结论

我想知道为什么迭代2失败了,而迭代3成功了

迭代4意味着这是fopen的问题(因为文件内容显然只是fopen/fwrite/fclose的包装器)


想法?

只是花了一些时间检查

fopen决定使用第2007行

我会让你省去那一堆

代码的以下部分(第2026行)处理文件\u USE\u INCLUDE\u PATH参数:

if (options & USE_PATH) {
    resolved_path = zend_resolve_path(path, strlen(path) TSRMLS_CC);
    if (resolved_path) {
        path = resolved_path;
        /* we've found this file, don't re-check include_path or run realpath */
        options |= STREAM_ASSUME_REALPATH;
        options &= ~USE_PATH;
    }
}
事实上,正如路人在他的评论中指出的那样,这种逻辑将试图解决这条道路。如果路径正确解析(到现有文件),则原始路径字符串将替换为“include”路径

如果包含路径不指向现有文件,则原始路径不会被替换,并且包含路径将被完全忽略

文档并没有明确说明这是预期的行为,但正如在对这个答案的评论中所指出的,它并没有那么疯狂


谜团已经解开。

如果只使用1而不使用标志,会发生什么?这可能是因为国旗没有挂好。唉——没什么区别;不过请注意,迭代4在没有标志的fopen上失败。请检查。另外,在PHP官方文档中,它说,当指定了
use\u inlude\u path
时,它“在include\u路径中搜索文件”,因此看起来文档在文字上相当准确……我认为这听起来确实“正确”,因为在
include\u路径中可能有多个路径(特别是
),因此,如果您
使用_include_path
并指向一个不存在的文件,PHP要么猜测您喜欢哪个路径(以便创建文件),要么完全拒绝您。我认为在这里否认可能听起来更合适;我的声明应该修改为“文件没有明确说明这应该是预期的行为”