php5.4+和 php7.0 的包含路径问题 实在找不到原因啊啊啊啊啊啊

2016-12-29 13:12:24 +08:00
 iscraft
网站根目录 index.php 中

include "/test.php";
在 5.4 以及 5.6 下正常执行
在 7.0 下则 failed to open stream: No such file or directory

include "test.php";
在 3 个版本下都正常没问题

从早上 google 到现在都没找到 php7 的哪部分新特性和遗弃功能里有讲这个的 求教!
4307 次点击
所在节点    PHP
27 条回复
batnss
2016-12-29 13:17:40 +08:00
get_include_path() 看看
iscraft
2016-12-29 13:25:28 +08:00
@batnss 5 和 7 下都是.;C:\php\pear
ncwgf
2016-12-29 13:30:28 +08:00
忘了哪時開始
我都養成習慣寫
`include implode(DIRECTORY_SEPARATOR, array(dirname(__FILE__), 'test.php'));`
因為要假設控制不了環境
短一點
`include implode(DIRECTORY_SEPARATOR, [__DIR__, 'test.php']);`
實在不知何時能找到 何時會找不到
skydiver
2016-12-29 13:38:55 +08:00
不应该是 ./test.php 吗……
harborM
2016-12-29 13:40:00 +08:00
实在不行就用绝对路径呗
Famio
2016-12-29 13:42:08 +08:00
@skydiver 我也同你一样,第一反应是./xxx.php
但是我没用过 7 ,没把握回答不敢乱写。。
iscraft
2016-12-29 13:46:02 +08:00
@ncwgf 这也是一个不错的办法 预定义根目录路径常量也行 但就是以前写的一部分代码里面使用了 /这种 想找一条捷径都支持而不必再去修改代码
@skydiver ./跟不加 /是一样的 都指向当前所在目录路径 我的疑问在 7 为什么不支持 /的根目录绝对路径用法
msg7086
2016-12-29 13:48:03 +08:00
/ 指向的是文件系统根目录吧?
iscraft
2016-12-29 13:54:34 +08:00
@msg7086 但 5.4 和 5.6 都会在 index.php 所在的 E:\desktop\www 下找到 test.php 唯独 7 会报出错误
Scholer
2016-12-29 13:56:14 +08:00
nginx 里 root 配的不一致吧
iscraft
2016-12-29 14:04:07 +08:00
@Scholer 使用的是 windows 下的 apache FreeBSD 中 Caddy+php7 下加 /报错 不加正常执行 个人感觉跟 web server 关系不大 与 php 版本有关
skydiver
2016-12-29 14:06:16 +08:00
@iscraft 这个写法本来就不对,就不应该这么写。之前能用也许是 bug ,新版修复了
yaxin
2016-12-29 14:14:23 +08:00
把 php-fpm 开成一个,然后 strace -p fpm 子进程 id ,看一下到底加载的那个文件
iscraft
2016-12-29 14:17:00 +08:00
@skydiver 后面会避免这种错误写法 只是想看看官方或者一些正式的说法 毕竟这情况至少在 5.2.10 就出现了
wesley
2016-12-29 15:02:41 +08:00
这也怪 php ?
先搞清楚 URL 路径和文件系统路劲
greatonce
2016-12-29 15:14:59 +08:00
ubuntu nginx php-7.0.13 下面没有问题
iscraft
2016-12-29 15:29:38 +08:00
@wesley
才疏学浅 不敢怪 一点小疑问 还请不吝赐教
/是作为 url 路径表示网站根目录而不能作为文件系统路径表示 DocumentRoot 的
那么 为什么 5+可以依据这个符号包含进来文件 而 7 不可以?
求相关的官方或者非官方文档解释都可以 谢谢
iscraft
2016-12-29 15:32:32 +08:00
@greatonce 谢谢 我也去 vmware 个试试
Felldeadbird
2016-12-29 15:38:22 +08:00
你想 /test.php 指向当前 运行目录的根目录,那么你就的让 apache 、 nginx 、 PHP 添加对应的配置信息。 具体配置你可以网上找一下。
一般来说,这种写法有很大问题,因为太过依赖配置的信息,一旦换了一个人或者一个服务器新的配置,那么你的程序就黄了。
greatonce
2016-12-29 15:39:25 +08:00
@iscraft ... 吓我一跳,你以为搞前端呢,/ 在 php 服务器端表示服务器上的根目录, 网页上你可以用 / 访问网站目录下的资源,服务端不可以。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/330982

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX