чдир и требует провал

У меня проблемы с простым чдиром и требуют.

Из первого файла: 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

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: требуется (/index_cluster.php): не удалось открыть поток: нет такого файла или каталога в /path/to/my/www/web/index_cluster.php в строке 11

require "index_cluster.php" => trying loading for 10 seconds then fail

Неустранимая ошибка PHP: допустимый объем памяти 536870912 байт исчерпан (попытка выделить 240 байт) в /path/to/my/www/web/index_cluster.php в строке 11


1

Решение

include или же require который не начинается с ./, / или в 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 плохо, потому что некоторые системы настроены неправильно и пропускают . и это занимает больше времени. Кроме того, и это то, что вас поражает, для обработки требуется немного больше памяти, поэтому в этом случае вы превышаете ограничение памяти. Чтобы исправить это на более длительный срок, вы должны проанализировать код, если вы можете уменьшить использование памяти и, если нет, возможно, увеличить memory_limit в php.ini,

1

Другие решения

Конфигурация PHP об «include_path» создает «цикл» и ограничение памяти, потому что мои 2 файла имеют одинаковое имя.

Таким образом, web / index_cluster.php загружается бесконечно сам вместо загрузки ezpublish_legacy / index_cluster.php

какая конфигурация мне не подходит, потому что это конфигурация iso-production, которую я не могу изменить.

Доступное решение (выберите одно)

  • Используйте абсолютный путь для require
  • Переименуйте 1 из 2 файлов с другим именем
  • Найдите и исправьте ваш PHP-конфиг с помощью include_path
0