PHP - 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)
  • 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: require(/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



person Adcaelo    schedule 17.06.2016    source источник
comment
Ваше сообщение об ошибке касается ограничения памяти PHP. Речь идет не о chdir & require.   -  person Taras    schedule 17.06.2016
comment
правда, я забыл об этой ошибке апача при первом написании, потому что она для меня не актуальна... Добавил потом. Тем не менее, проблема по-прежнему вызвана комбинацией chdir/require.   -  person Adcaelo    schedule 17.06.2016
comment
* не имеет значения, потому что я установил ограничение памяти php на 2G и т. Д. И то же самое! Неустранимая ошибка PHP: допустимый размер памяти 2147483648 байт исчерпан (попытался выделить 130968 байт)   -  person Adcaelo    schedule 17.06.2016
comment
Есть ли конкретная причина, по которой вы переходите на альфа-версию? Вы пытались вместо этого обновиться до самой последней стабильной версии?   -  person Simba    schedule 17.06.2016
comment
Я понятия не имею, почему мы используем альфа-версию, на самом деле это корпоративная вилка, основанная на альфа-версии.   -  person Adcaelo    schedule 17.06.2016


Ответы (2)


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.

person johannes    schedule 17.06.2016
comment
Потерянный в моем многочисленном тесте, я ни на секунду не подумал, что /index_cluster.php будет проверять system_root, а не папку, я искал свой $legacyRoot . /index_cluster.php. - person Adcaelo; 17.06.2016
comment
require ./index_cluster.php прекрасно работает, 3 человека, просматривающие один и тот же фрагмент кода, не подумали об этом... спасибо... но require index_cluster.php тоже должен работать, так что это Конфигурация apache/php о include_path слишком ограничительна. Я прав? - person Adcaelo; 17.06.2016
comment
Нет, проблема не в include_path. Это то, что ваше приложение требует много памяти и близко к пределу. Все может достичь предела. Либо оптимизируйте приложение, либо увеличьте memory_limit, см. php.net/memory_limit. - person johannes; 17.06.2016
comment
На самом деле, мои 2 файла с одинаковым именем зацикливаются на первом, а не на втором... Я добавил error_log('test'); в моем файле, и я вижу, что журнал Apache добавляет сотни новых строк [Пт, 17 июня, 13:40:34 2016] [ошибка] [клиент 10.146.50.128] test - person Adcaelo; 17.06.2016
comment
изменение моего второго файла на index_cluster_zzz.php, он работает с требуемым index_cluster_zzz.php - person Adcaelo; 17.06.2016
comment
Ах, так ваша проблема, вероятно, в том, что вы каким-то образом строите бесконечную рекурсию с включением? Простое решение: используйте require_once, лучшее решение: просмотрите свой код и найдите проблему с этим (php.net/inclued может помочь, но не тривиально заставить работать) - person johannes; 17.06.2016

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

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

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

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

  • Используйте абсолютный путь для запроса
  • Переименуйте 1 из 2 файлов с другим именем
  • Найдите и исправьте конфигурацию php о include_path
person Adcaelo    schedule 20.06.2016