我有一个简单的chdir和require的问题。
来自第一个文件:web / index_cluster.php
我正在尝试加载第二个:ezpublish_legacy / index_cluster.php
我的所需文件没有加载,但我不知道为什么......
这是我的配置。
ezpublish日志和apache中的允许内存大小
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 240 bytes) in /path/to/my/www/web/index_cluster.php on line 11
这是我的(简化)树
www
`-- ezpublish_legacy
|-- index_cluster.php
`-- web
|-- index_cluster.php
这是原始代码
$legacyRoot = '/path/to/my/www/ezpublish_legacy';
chdir( $legacyRoot );
require 'index_cluster.php';
这是我的修复
$legacyRoot = '/path/to/my/www/ezpublish_legacy';
chdir( $legacyRoot );
require '/path/to/my/www/ezpublish_legacy/index_cluster.php';
我已经尝试了我能想到的一切:
$legacyRoot = '/path/to/my/www/ezpublish_legacy';
require $legacyRoot.'/index_cluster.php';
=>的工作
$legacyRoot = '/path/to/my/www/ezpublish_legacy';
echo getcwd() . "\n";
chdir( $legacyRoot );
echo getcwd() . "\n";
die()
require 'index_cluster.php';
=> 正是我所期待的
/path/to/my/www/web
/path/to/my/www/ezpublish_legacy
使用绝对路径加载并检查已加载文件上的当前目录是否为预期结果
网/ index_cluster.php
require '/path/to/my/www/ezpublish_legacy/index_cluster.php';
ezpublish_legacy / index_cluster.php
echo getcwd() . "\n";
die();
导致(我期待的)
/path/to/my/www/web
网/ index_cluster.php
$legacyRoot = '/path/to/my/www/ezpublish_legacy';
chdir( $legacyRoot );
require '/path/to/my/www/ezpublish_legacy/index_cluster.php';
ezpublish_legacy / index_cluster.php
echo getcwd() . "\n";
die();
导致(我期待的)
/path/to/my/www/ezpublish_legacy
更新:我尝试了一些新的东西:
require "/index_cluster.php" => instant fail
PHP警告:require(/index_cluster.php):无法打开流:第11行的/path/to/my/www/web/index_cluster.php中没有此类文件或目录
require "index_cluster.php" => trying loading for 10 seconds then fail
PHP致命错误:第11行的/path/to/my/www/web/index_cluster.php中允许的内存大小为536870912字节(试图分配240个字节)
答案 0 :(得分:1)
include
或require
不是以./
,/
开头,或者在Windows上,使用{{1}驱动器号与其他驱动器号不同}。要解决您的直接问题,您可以使用
include_path
使用固定的相对路径。您尝试了绝对路径require "./index_cluster.php"
,它将查看文件系统根目录,而不是实际位置。
不使用此表格时,只需简单
/index_cluster.php
这将搜索require "index_cluster.php"
。我系统上的include_path
如下所示:
include_path
因此PHP会按顺序查找这些文件:
$ php -r 'echo ini_get("include_path");'
.:/usr/share/php:/usr/share/pear
使用include_path是错误的,因为某些系统配置错误而错过了./index_cluster.php
/usr/share/php/index_cluster.php
/usr/share/pear/index_cluster.php
,这需要更多时间。而且,这就是你的需要,因为需要处理更多的内存,这就是你在这种情况下达到内存限制的原因。要解决这个问题,您应该分析代码,如果可以减少内存使用量,如果不能增加.
中的memory_limit
。
答案 1 :(得分:0)
PHP配置" include_path"创建一个"循环"和内存限制,因为我的2个文件具有相同的名称。
所以web / index_cluster.php无限加载,而不是加载ezpublish_legacy / index_cluster.php
哪个配置对我来说并不重要,因为它是一个我无法改变的iso-production配置。
可用解决方案(选择一个)