PHP - chdir并要求失败

时间:2016-06-17 09:53:36

标签: php require ezpublish chdir

我有一个简单的chdir和require的问题。

来自第一个文件:web / index_cluster.php

我正在尝试加载第二个:ezpublish_legacy / index_cluster.php

我的所需文件没有加载,但我不知道为什么......

这是我的配置。

  • PHP 5.4.16
  • 从eZ Publish 4.7升级到eZ Pubslih 5.90.0alpa1(基于SF2)
  • 红帽企业Linux服务器版本6.4(圣地亚哥)

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个字节)

2 个答案:

答案 0 :(得分:1)

includerequire不是以.//开头,或者在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配置。

可用解决方案(选择一个)

  • 使用require
  • 的绝对路径
  • 使用其他名称
  • 重命名2个文件中的1个
  • 搜索并更正有关include_path
  • 的php配置