PHP-相同的路径,但要求获取不同的文件(localhost与服务器)

时间:2019-01-23 21:12:19

标签: php

我目前正在编写一个写得不好的旧版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。

1 个答案:

答案 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_valuehttpd.conf的{​​{1}}中查找

摘自PHP手册:

https://secure.php.net/manual/en/configuration.changes.php