У меня есть эта странная проблема, которую я могу лучше всего описать как «утечку пространства имен». Я установил бродячий ящик, работающий с Apache2 с настройкой VHosts, чтобы реплицировать производственный сервер с точки зрения доменов &. Я соответствующим образом отредактировал файл хостов моей локальной машины, и мои VHosts работают нормально.Столкновение пространства имен PHP с Phalcon, Vagrant, Apache2
Я также создал приложение скелета/базы, закодированное с помощью PhalconPHP. Это многофункциональное приложение со всеми универсальными функциями, которые мне необходимы для разработки моих приложений (на самом деле перепрограммировать загрузку очень старых, устаревших приложений). Приложение скелета работает нормально.
Проблема заключается в том, что если я перейду в app1.dev в своем браузере, он будет работать. Затем, если я перейду к app2.dev, app2 явно пытается загрузить некоторые компоненты - представления и т. Д. Из app1 и дает ошибки. Однако закройте браузер и повторите попытку, перейдя в app2.dev, и теперь он отлично работает. Затем перейдите в app1.dev, и теперь он сломан и пытается загрузить компоненты из приложения2! Мне удалось отслеживать это странное поведение вплоть до столкновения пространства имен.
Это должно быть столкновение пространства имен, потому что мои приложения основаны на приложении скелета и использовать это пространство имен, которые, очевидно, то же самое для общих частей приложения - модули, такие как App\backend
, App\frontend
и т.д. Если на сломанный приложение, я перемещаюсь в своем браузере с частью этого уникального приложения и поэтому имеет уникальное пространство имен, оно отлично работает, потому что нет столкновения! Кроме того, несколько приложений кодируются с помощью Codeigniter3, который не использует пространства имен, и эти приложения не имеют этой проблемы. Это влияет только на приложения Phalcon с пространствами имен.
Я добавлю, что каждое приложение использует .htaccess
для прямого запроса на контроллер, расположенный в каталоге public/
.
Options FollowSymLinks
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
Интересно, если .htaccess
был вопрос, но я думаю, что я решил, что из. Он делает то, что должен делать.
Вот пример одного из моих настроек VHost в apache - все они следуют этому шаблону.
<VirtualHost *:80>
ServerName app1.dev
ServerAlias www.app1.dev
DocumentRoot /vagrant/www/app1
<Directory "/vagrant/www/app1">
Options Indexes Followsymlinks
AllowOverride All
Order allow,deny
Allow from All
Require all granted
</Directory>
</VirtualHost>
Изменение всех пространств имен в течение каждого приложения будет довольно главная работа, и я не думаю, что должно быть необходимым. Я не думаю, что это должно быть проблемой на производственном сервере, так как использует CloudLinux/Centos & WHM, но это немного беспокоит!
Понятно, что пространства имен не должны сталкиваться с разными маршрутами документов и VHosts? Что мне не хватает?
Вероятно, это проблема с вашим виртуальным хостом. В модульном проекте phalcon все ваши запросы отправляются в '/ app/index.php'. Способ отображения разных модулей осуществляется через маршрутизатор в приложении. По умолчанию используются команды '/ module/controller/action/params'. Трудно понять ошибку, не зная, как вы настроили ваши настройки и как все ваши ВХосты файлы установка. – honerlawd
Спасибо за ваш комментарий. Нет, это не VHosts. Я отследил его до проблемы с вольт-компилятором. Похоже, что некоторые из них, когда файл phpml view еще не существует, вольт ищет путь к другому приложению. У меня не было времени, чтобы исследовать это еще. – Ally
Это имеет смысл. Хотя именно поэтому я сказал, что это трудно диагностировать, не зная о вашей настройке :) – honerlawd