2015-08-20 2 views
3

У меня есть эта странная проблема, которую я могу лучше всего описать как «утечку пространства имен». Я установил бродячий ящик, работающий с 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? Что мне не хватает?

+0

Вероятно, это проблема с вашим виртуальным хостом. В модульном проекте phalcon все ваши запросы отправляются в '/ app/index.php'. Способ отображения разных модулей осуществляется через маршрутизатор в приложении. По умолчанию используются команды '/ module/controller/action/params'. Трудно понять ошибку, не зная, как вы настроили ваши настройки и как все ваши ВХосты файлы установка. – honerlawd

+0

Спасибо за ваш комментарий. Нет, это не VHosts. Я отследил его до проблемы с вольт-компилятором. Похоже, что некоторые из них, когда файл phpml view еще не существует, вольт ищет путь к другому приложению. У меня не было времени, чтобы исследовать это еще. – Ally

+0

Это имеет смысл. Хотя именно поэтому я сказал, что это трудно диагностировать, не зная о вашей настройке :) – honerlawd

ответ

0

я решил подобную проблему в Apache с использованием различных локальных IP-адресов для каждого приложения:

/и т.д./хосты

127.1.0.1 edu.l 
127.1.1.1 tech.l 
... 

/и т.д./apache2/сайты Недоступные/001-блоги. Conf

<VirtualHost edu.l:80> 
    ServerName edu.l 

    ServerAdmin [email protected] 
    DocumentRoot /var/www/blog/edu 

    ErrorLog ${APACHE_LOG_DIR}/edu.error.log 
    CustomLog ${APACHE_LOG_DIR}/edu.access.log combined 

</VirtualHost> 

<VirtualHost tech.l:80> 
    ServerName tech.l 

    ServerAdmin [email protected] 
    DocumentRoot /var/www/blog/tech 

    ErrorLog ${APACHE_LOG_DIR}/tech.error.log 
    CustomLog ${APACHE_LOG_DIR}/tech.access.log combined 

</VirtualHost> 
... 

Вы можете ommit конфигурирующих имен хостов ans используют IP в .conf tho.

Это работает, потому что если вы определили несколько приложений на одном IP и порта, Apache, кажется, помнит каталог он работает над и несовпадающими файлами.

Смежные вопросы