Symfony多应用部署遇Cookie混淆、缓存问题及类加载错误求助
针对Symfony多应用部署问题的解决方案
我来帮你一步步解决遇到的这几个问题,包括类加载警告、Cookie混淆和User类缓存冲突:
一、先处理class_implements()类加载警告
这个警告大概率是Symfony自动加载或缓存异常导致的,你可以按下面的步骤排查:
- 首先清除Symfony开发环境缓存,在每个应用的根目录执行命令:
php app/console cache:clear --env=dev - 检查你的User类(或报错的类)的命名空间是否符合PSR-4规范,比如有没有写错命名空间前缀。然后在应用根目录执行
composer dump-autoload,重新生成自动加载映射文件。 - 确认Symfony的
app/cache和app/logs目录权限,Windows下可以右键这两个目录,给Apache运行用户(或者Everyone)添加读写权限,避免因为权限不足导致缓存文件生成失败。
二、解决Cookie浏览器混淆问题
同一个IP+不同端口的方式会让浏览器把Cookie绑定到IP上,导致多应用共享Cookie,切换时反复登录。最彻底的解决办法是用自定义域名的虚拟主机,而不是端口:
- 修改Windows的hosts文件:打开
C:\Windows\System32\drivers\etc\hosts(需要管理员权限),添加两行:
这里的127.0.0.1 app1.local 127.0.0.1 app2.localapp1.local、app2.local可以换成你自己喜欢的域名,每个应用对应一个。 - 配置XAMPP的虚拟主机:打开
xampp/apache/conf/extra/httpd-vhosts.conf,给每个应用添加虚拟主机配置:<VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/app1/web" ServerName app1.local <Directory "C:/xampp/htdocs/app1/web"> AllowOverride All Require all granted </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/app2/web" ServerName app2.local <Directory "C:/xampp/htdocs/app2/web"> AllowOverride All Require all granted </Directory> </VirtualHost> - 重启Apache服务,之后用
http://app1.local、http://app2.local访问不同应用,每个应用的Cookie会绑定到各自的域名,就不会互相干扰了。
三、解决User类缓存混淆问题
你提到的PHP缓存(应该是OPcache或者APC)混淆User类,主要是因为类的标识不够唯一,或者缓存配置没区分开不同应用:
- 确保每个应用的User类有唯一的命名空间,比如App1的User是
App1Bundle\Entity\User,App2的是App2Bundle\Entity\User,这样即使类名相同,PHP也能通过命名空间区分开不同的类。 - 调整PHP缓存的配置:打开XAMPP的
php.ini文件,找到OPcache相关配置(如果是APC的话找APC配置),修改以下参数:opcache.use_cwd = 1 opcache.validate_timestamps = 1 opcache.revalidate_freq = 2opcache.use_cwd会让缓存根据当前工作目录区分同名文件;opcache.validate_timestamps开启后,缓存会定期检查文件是否更新(开发环境建议开启,生产环境可以关闭提升性能);opcache.revalidate_freq设置缓存检查文件更新的间隔(单位秒)。
- 另外要保证每个应用的Symfony缓存目录是独立的,不要共享
app/cache,每个应用用自己的缓存目录即可。
按照上面的步骤操作后,应该就能解决你遇到的所有问题了。
内容的提问来源于stack exchange,提问作者kiw
相关产品推荐
相关产品推荐

