我目前正在编写一个写得不好的旧版Web项目,但仍在尝试了解有关它的某些怪异的东西。 假设我具有以下文件结构
- htdocs/
-- index.php
-- vendor/
--- autoload.php
-- src/
--- news2.php
--- vendor/
---- autoload.php
htdocs/index.php
文件包括htdocs/src/news2.php
文件。
并且htdocs/src/news2.php
包含一行
require 'vendor/autoload.php';
本地XAMPP副本可以正常工作,并且包含htdocs/src/vendor/autoload.php
但是,服务器版本的行为有所不同,并包含htdocs/vendor/autoload.php
。
那是正常行为吗,可能是什么原因?
我检查了是否有符号链接,也没有。否则,我一无所知。
PHP为5.6,该服务器或多或少具有常规的Ubuntu LAMP。
答案 0 :(得分:2)
PHP包含路径基于php.ini配置文件中的include_path
值进行解析。
include_path
值是由:
分隔的目录列表
include_path
的默认值类似于".:/usr/share/php"
在这种情况下,PHP将首先在当前工作目录(.
)中查找,然后在/usr/share/php
中查找。
如果在任何目录中都找不到要包含的文件,它将在require
所在的脚本目录中查找。
在本地php.ini中,include_path
设置前面可能没有点,并且包含路径始终是相对于脚本目录来解析的。
您可以在服务器上的include_path
设置中删除点,或将news2.php
中的行更改为require __DIR__ . /vendor/autoload.php
您还可以使用get_include_path
来检查当前配置,并使用set_include_path
函数以编程方式更改include_path
设置,而无需编辑php.ini
摘自PHP手册:
https://secure.php.net/manual/en/function.include.php
https://secure.php.net/manual/en/ini.core.php#ini.include-path
https://secure.php.net/manual/en/function.set-include-path.php
https://secure.php.net/manual/en/function.get-include-path.php
根据评论进行编辑:
在Windows XAMPP下,include_path
的默认值为C:\path_to_xampp\php\PEAR
,以与Linux的默认值保持一致,您需要添加.
在Windows下,您必须使用分号(;
)而不是冒号(:
)来分隔多个路径。无论如何,如果使用多路径,则必须将所有内容都用引号引起来:
include_path= ".;C:path_to_xampp\php\PEAR"
如果仍然不能解决问题,请记住,Apache的配置可以用php_value
覆盖任何设置。
您可以在php_value
和httpd.conf
的{{1}}中查找
摘自PHP手册: