2016-06-17 2 views
1

У меня проблема с простым chdir и требуется.PHP - chdir и требуется сбой

С первого файла: веб/index_cluster.php

Я пытаюсь загрузить второй один: ezpublish_legacy/index_cluster.php

Мой нужный файл не загружать, но я не имею ни малейшего понятия, почему ...


Вот моя конфигурация.

  • PHP 5.4.16
  • Обновление с Ez Опубликовать 4.7 Ez Pubslih 5.90.0alpa1 (на основе SF2)
  • Red Hat Enterprise Linux Server высвобождать 6.4 (Santiago)

Eсть ничего на журнал ezpublish и допустимый размер памяти в апача

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


+0

Ваш сообщение об ошибке - ограничение памяти PHP. Речь идет не о chdir & require. – Taras

+0

true, я забыл об ошибке apache при первом написании, потому что это не «релевантно» для меня ... Потом добавлено. Тем не менее проблема по-прежнему вызвана компилятором chdir/require – Adcaelo

+0

* не имеет значения, потому что я заставил лимит памяти php на 2G и более и то же самое! PHP Неустранимая ошибка: допустимый размер памяти 2147483648 байт исчерпан (пытался выделить 130968 байт) – Adcaelo

ответ

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.

+0

Потерянная на моем многочисленном тесте, я не думал о втором, что /index_cluster.php будет проверять на system_root а не папку, я искал свой $ legacyRoot. "/index_cluster.php". – Adcaelo

+0

требуют «./index_cluster.php» ** отлично работает **, 3 человека, которые смотрят на один и тот же фрагмент кода, не думали об этом ... спасибо ... но требуют, чтобы «index_cluster.php» тоже работал, поэтому это конфигурация apache/php о include_path, которая слишком ограничительна. ** Я прав? ** – Adcaelo

+0

Нет, не include_path это проблема. Это то, что ваше приложение требует большой объем памяти и близко к пределу. Все может попасть в лимит. Либо оптимизируйте приложение, либо увеличьте memory_limit, см. Http://php.net/memory_limit – johannes

0

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

So web/index_cluster.php загружается на неопределенный срок сам по себе, вместо того, чтобы загружать ezpublish_legacy/index_cluster.php

, который точно не освобождает меня, потому что это iso-production config, который я не могу изменить.

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

  • Используйте абсолютный путь для требуют
  • Переименовать 1 из 2-х файлов с другим именем
  • Поиск и исправить PHP конфигурации о include_path
Смежные вопросы