Php 为什么在使用包含路径时无法创建文件内容和fopen?
用于在相对位置的文件夹中创建和填充文件 注意到一些与include路径和文件创建相关的奇怪现象 简短版本:查看迭代2和迭代3。为什么后者有效,而前者无效? 迭代1Php 为什么在使用包含路径时无法创建文件内容和fopen?,php,fopen,Php,Fopen,用于在相对位置的文件夹中创建和填充文件 注意到一些与include路径和文件创建相关的奇怪现象 简短版本:查看迭代2和迭代3。为什么后者有效,而前者无效? 迭代1 file_put_contents('../../public/remixes/screenshots/test.txt', $data); 这个很好用 第二次迭代 但是,我在这个模块的“根”中有一个公共目录,并且希望使用预设的include路径更直接地引用它。例如: echo(get_include_path()); // thi
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要么猜测您喜欢哪个路径(以便创建文件),要么完全拒绝您。我认为在这里否认可能听起来更合适;我的声明应该修改为“文件没有明确说明这应该是预期的行为”