Zend Framework 1.11.11 Проблемы с включенным путем open_basedir - PullRequest
2 голосов
/ 30 марта 2012

Я видел несколько вопросов на этом сайте, касающихся именно этой проблемы, но я вполне уверен, что мой случай немного отличается.Недавно я обновил ZF 1.9.6 до 1.11.11, и с тех пор на моем рабочем сервере перестали работать.

Мой локальный хост работает под управлением PHP 5.3.8 , а сервер работает 5.2.11 .Я не уверен, что это как-то связано с этим, но я решил упомянуть об этом на всякий случай.

Когда я впервые обновил фреймворк, я получил кучу ошибок open_basedir restriction in effect..Я решил это точно так, как упомянули несколько других, удалив get_include_path() из вызова set_include_path() в файле index.php. Как упоминалось здесь .

Это исправило ошибки open_basedir, но теперь у меня проблемы в другом месте.В несколько разных файлов по разным причинам я включаю файлы с помощью операторов include и require, используя относительные пути.

Например:

require_once 'application/models/MyModel.php';

Но теперь это внезапно перестает работать!Мне пришлось внезапно предварять все эти пути с помощью ./, например, так:

require_once './application/models/MyModel.php';

Проблема в том, что могут быть случаи, когда можно вручную пройти, найти все из них и изменитьЭто.Скорее, я хочу выяснить , почему эти пути больше не работают на сервере, но продолжают работать на моем локальном хосте.

Я склоняюсь к тому, что это как-то связано с тем, что ябольше не включать часть get_include_path() в set_include_path() в файле index.php, но я не уверен.

Может кто-нибудь пролить некоторую информацию?Спасибо!

1 Ответ

3 голосов
/ 30 марта 2012

Я подозреваю, что это связано с этой запиской об open_basedir:

Ограничение, указанное в open_basedir, является именем каталога, начиная с PHP 5.2.16 и 5.3.4. Предыдущие версии использовали его в качестве префикса.

Разница между проверкой в ​​качестве префикса и проверкой в ​​качестве каталога определенно вызовет такие проблемы.

Решение может иметь отношение к этой заметке в документации PHP:

Использование. в пути включения допускаются относительные включения, так как это означает текущий каталог. Однако более эффективно явно использовать include «./file», чем когда PHP всегда проверяет текущий каталог для каждого include.

Таким образом, при настройке пути включения, я думаю, вам следует изменить пример, на который вы ссылаетесь, следующим образом:

set_include_path(
    APPLICATION_PATH . './../library' . PATH_SEPARATOR .
    APPLICATION_PATH . './../library/Zend'
);

Обратите внимание на "." Я добавил перед первым слешем. Это должно сделать его относительным к текущему рабочему каталогу и лишить вас необходимости включать ваши включения как ./file.

Кроме того, это говорит о том, что этот метод менее эффективен, поэтому вы также можете рассмотреть возможность использования такого инструмента, как TextCrawler , чтобы найти и заменить несколько файлов.


Кроме того, вы можете включить '.' (текущий каталог - или корень документа ) в ваш путь включения при его установке. Вот так:

set_include_path(APPLICATION_PATH . '../library' 
    . PATH_SEPARATOR . APPLICATION_PATH . '../library/Zend' 
    . PATH_SEPARATOR . '.' // <-- notice this!
);
...