【问题标题】:PHP - chdir and require failPHP - chdir 和要求失败
【发布时间】:2016-06-17 09:53:35
【问题描述】:

我对一个简单的 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)
  • Red Hat Enterprise Linux Server 6.4 版(圣地亚哥)

ezpublish 日志和 apache 中的 Allowed memory size 上没有任何内容

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

使用绝对路径加载并检查加载文件的当前目录给出预期结果

web/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

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 警告:需要(/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 字节)


【问题讨论】:

  • 您的错误信息是关于 PHP 内存限制的。这与 chdir 和 require 无关。
  • 是的,我在第一次写作时忘记了这个 apache 错误,因为它对我来说不是“相关的”......后来添加了它。尽管如此,问题仍然是由 chdir/require 组合引起的
  • * 不相关,因为我已将我的 php 内存限制强制为 2G 和更多相同的东西! PHP致命错误:允许的内存大小为2147483648字节已用尽(试图分配130968字节)
  • 升级到 alpha 版本是否有特定原因?您是否尝试过升级到最新的稳定版本?
  • 我不知道我们为什么要使用 alpha 版本,事实上它是一个基于 alpha 的“公司”分支

标签: php require ezpublish chdir


【解决方案1】:

includerequire 不是以 .// 开头的,或者在 Windows 上,驱动器号通过使用 include_path 与其他驱动器号不同。要解决您当前的问题,您可以使用

require "./index_cluster.php"

使用固定的相对路径。您尝试了绝对路径 /index_cluster.php,它会查看文件系统根目录,而不是实际位置。

当不使用这种形式而是使用普通的时候

require "index_cluster.php"

这将搜索include_path。我系统上的include_path 如下所示:

$ php -r 'echo ini_get("include_path");'
.:/usr/share/php:/usr/share/pear

所以 PHP 会按顺序查找这些文件:

./index_cluster.php
/usr/share/php/index_cluster.php
/usr/share/pear/index_cluster.php

使用 include_path 很糟糕,因为某些系统配置错误并错过了.,这需要更多时间。此外,这就是打击你的原因,因为需要处理更多的内存,这就是你在这种情况下达到内存限制的原因。要长期解决此问题,您应该分析代码,如果您可以减少内存使用量,如果不能增加php.ini 中的memory_limit

【讨论】:

  • 在我的无数测试中迷路了我没想过 /index_cluster.php 会检查 system_root 而不是文件夹,我正在寻找我的 $legacyRoot 。 “/index_cluster.php”。
  • require "./index_cluster.php" 效果很好,3个人看同一段代码没想到这一点...谢谢...但需要“index_cluster.php”也应该可以工作,所以这是一个关于 include_path 的 apache / php 配置,限制性太强。 我说的对吗?
  • 不,问题不是 include_path。这是您的应用程序需要大量内存并且接近极限。任何事情都可能达到极限。要么优化应用,要么增加memory_limit,见php.net/memory_limit
  • 事实上,我的 2 个文件具有相同的名称,它在第一个文件上循环而不是包括第二个文件......我添加了一个 error_log('test');在我的文件上,我可以看到 apache 日志添加了数百个新行 [Fri Jun 17 13:40:34 2016] [error] [client 10.146.50.128] test
  • 将我的第二个文件更改为 index_cluster_zzz.php 它正在使用“require”index_cluster_zzz.php”
【解决方案2】:

关于“include_path”的 PHP 配置会创建一个“循环”和内存限制,因为我的 2 个文件具有相同的名称。

所以 web/index_cluster.php 会无限期地自己加载,而不是加载 ezpublish_legacy/index_cluster.php

哪个配置与我无关,因为它是我无法更改的 iso 生产配置。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-01-09
    • 2016-07-12
    • 2018-01-05
    相关资源
    最近更新 更多