2012-03-30 4 views
2

Я видел несколько вопросов на этом сайте относительно этой точной проблемы, но я уверен, что мое дело немного другое. Недавно я обновился с ZF 1.9.6 до 1.11.11, и с тех пор все перестало работать на моем рабочем сервере.Zend Framework 1.11.11 Include Path open_basedir issues

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

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

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

Например:

require_once 'application/models/MyModel.php'; 

Но теперь, вдруг больше не работает! Я должен был внезапно предварять все эти пути с ./ как так:

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

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

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

Может ли кто-нибудь пролить свет? Благодаря!

ответ

3

Я подозреваю, что это связано с this note о open_basedir:

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

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

Решение может иметь что-то делать с this note в документации 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! 
); 
+0

Привет, спасибо за ваш ответ, это было очень информативно! Я собираюсь попробовать, и я дам вам знать, что это за сделка. –

+0

Я решил это с решением, которое я добавил к вашему ответу. Ваш ответ был отличным, хотя в любом случае! Приветствия. –

+1

Удивительно, спасибо, что добавили этот бит в ответ, надеюсь, это поможет кому-то еще по дороге! –