Jus*_*tin 9 php apache laravel guzzle
我在本地计算机上有两个Laravel 5.2应用程序(我们称之为A和B),它们都在我本地Apache 2.4开发服务器上的两个不同的虚拟主机上配置.
这两个应用程序有时通过GuzzleHttp相互调用.
有一次我想使用加密,我开始从Laravel的Encrypter获得"mac is invalid"异常.
在调查问题时,我发现当应用A调用应用B时,应用B突然从应用A获取加密密钥(app.key)!这会导致加密中断,因为应用B上的值使用应用的B加密密钥进行加密.
在调试时,我发现Dotenv库有一些逻辑来保存现有变量(如果已设置).我发现$ _ENV和$ _SERVER都没有泄漏变量,但getenv()有它们!
我有点困惑,因为PHP putenv说:
环境变量仅在当前请求的持续时间内存在.
似乎,如果在当前请求期间我通过GuzzleHttp发出另一个请求,Dotenv在A中使用的变量putenv()突然变得可以在应用B中使用,这是由GuzzleHttp请求的!
我知道在生产服务器上这不会是一个问题,因为将使用配置缓存而不是Dotenv,并且很可能两个应用程序都将在不同的Apache服务器上运行,但这种行为正在破坏我的开发过程.
如何配置Laravel或GuzzleHttp或Apache或PHP以防止putenv()从应用程序A泄漏到应用程序B?
问题是您正在使用PHP的共享实例,因此当其中一个应用程序设置与另一个应用程序共享的环境变量时.我相信phpdotenv会将它们视为不可变的,因此一旦设置它们,其他应用程序就无法覆盖它们.
mod_php(我认为你使用的是因为你提到了apache)基本上在每个apache进程中都提供了一个php解释器.apache进程将在您的所有vhost之间共享,因此您遇到此问题的原因.如果你运行的是nginx和php-fpm,你也会得到同样的问题,但如果你运行后一个软件堆栈,它会更容易解决.
不幸的是,一个端口只能绑定到一个进程.所以坚持使用mod_php和apache的唯一方法就是将你的vhost放在单独的端口号上,这意味着你在访问它时必须将其中至少一个的端口号放在url中.我不再使用apache了,所以我不能给你这样做的具体细节,可能只是在你的vhost配置中设置不同的端口,而apache会这样做,但我不得不推迟你也是谷歌.
如果您正在运行nginx/php-fpm,那么可能只是创建第二个运行在不同端口或套接字上的php-fpm进程配置并将第二个vhost指向该php实例并远离您.
总而言之,您有一些解决方案:
对不起,我没有更好的消息,但不幸的是你的WAMP堆栈开箱即用.