PHP名称空间与Phalcon,Vagrant,Apache2的碰撞

时间:2015-08-20 22:07:11

标签: php apache namespaces phalcon vhosts

我有这个奇怪的问题,我可以最好地描述为"命名空间泄漏"。我已经设置了一个运行Apache2并使用VHosts设置的流浪盒,以便根据域和域复制生产服务器。子域名。我已相应地编辑了本地机器的主机文件,我的VHost工作正常。

我还创建了一个用PhalconPHP编码的骨架/基础应用程序。它是一个多模块化的应用程序,具有开发我的应用程序所需的所有通用功能(实际上重新开发了大量旧的,过时的应用程序)。骨架应用程序运行正常。

我遇到的问题是,如果我在浏览器中访问app1.dev,它就可以了。然后,如果我去app2.dev,app2显然是试图从app1加载一些组件 - 视图等,并给出错误。但是,关闭浏览器并转到app2.dev再次尝试它现在工作正常。然后转到app1.dev,现在已经坏了,并尝试从app2加载组件!我设法跟踪这个奇怪的行为,直到命名空间冲突。

它必须是命名空间冲突,因为我的应用程序都基于骨架应用程序并使用它的名称空间,这对于应用程序的通用部分显然是相同的 - 例如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是否是问题,但我认为我已经排除了这一点。它正在做它应该做的事情。

这是我在apache中建立VHost之一的一个例子 - 它们都遵循这种模式。

<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&amp; WHM,但这有点担心!

显然,名称空间不应该跨越不同的文档路径和VHosts对吗?我错过了什么?

1 个答案:

答案 0 :(得分:0)

我在Apache中使用不同的本地IP解决了类似的问题:

的/ etc /主机

127.1.0.1   edu.l
127.1.1.1   tech.l
...

/etc/apache2/sites-available/001-blogs.conf

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

    ServerAdmin webmaster@localhost
    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 webmaster@localhost
    DocumentRoot /var/www/blog/tech

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

</VirtualHost>
...

您可以忽略在主机中配置名称并使用 .conf 中的IP。

它的工作原理是因为如果你在相同的IP和端口上定义很少的应用程序,Apache似乎记得它正在处理的目录和不匹配的文件。