2015-09-30 44 views
3

我有两个Laravel API在我的本地开发机器上提供AngularJS应用程序。当Angular页面调用POST到两个似乎使用错误的数据库名称的API(它使用另一个Laravel的实例数据库)时,我遇到了一个奇怪的问题。 Laravel抛出一个异常,说Table database.table未找到,其中数据库是不正确的数据库。我已经尝试使用Postman调用每个API,并且工作正常,并且我确定没有提及任何项目中的其他数据库。奇怪的Laravel 5缓存使用错误的数据库名称

对我来说,这似乎是一个缓存问题,由于某些原因,.env文件可能会在两台Laravel服务器之间缓存和共享。这两个Laravel应用程序都在Apache上托管。我试过调用php artisan config:clear,并在.htaccess文件中设置了适当的头文件来试图阻止任何缓存,但这两个文件都没有工作。我也在多个浏览器上尝试过,清除了缓存,但仍然出现相同的错误。

我希望能够使用.env文件,以便我可以为我的开发服务器配置唯一的配置,所以我宁愿在config/database.php中对数据库凭证进行硬编码。任何想法可能是什么问题?

两个database.php中的文件看起来像:

'mysql' => [ 
'driver' => 'mysql', 
'host'  => env('DB_HOST'), 
'database' => env('DB_DATABASE'), 
'username' => env('DB_USERNAME'), 
'password' => env('DB_PASSWORD'), 
'charset' => 'utf8', 
'collation' => 'utf8_unicode_ci', 
'prefix' => '', 
'strict' => false, 
], 

这里独特的设置存储在.env

+0

'.env'位于你项目的根目录中,而不是'app /'目录中。 – sebdesign

+0

对不起,这是一个错字。 – Gabriel

+0

我还没有解决这个问题,但作为临时解决方法,我现在只是在app/config/database.php中根据env('APP_ENV')的值定义数据库凭证,而不是将它们存储在.env文件中 – Gabriel

回答

1

我有相同的问题。一个网页将请求5个来自laravel的不同数据集的json响应,并且大约一半的请求会以'不正确的数据库'错误进行弹出,即使当您在自己的浏览器选项卡中重新加载确切的请求时,它们也能正常工作。看起来像一个Laravel bug,它与处理来自apache的同时web请求有关。

无论如何,我的解决方法是硬编码我的config \ database.php文件中的所有连接的主机,数据库,用户名和密码,现在我的JSON请求不再弹了。但是,它需要将密码硬编码到源代码管理中,并处理多个环境 - 在存在.env文件之前,基本上会回到黑暗时代。

4

我遇到了同样的问题,在我的情况下,它是由toddbchttps://github.com/vlucas/phpdotenv/issues/76上报告的问题引起的。

Laravel依赖于vlucas/phpdotenv,它使用PHP的putenv()来添加.env文件中的值,以便它们可以被您的应用程序访问。但是,

putenv()getenv()不需要重入或线程安全。这意味着如果两个线程同时调用它们(在不同的核心上,或者在函数中间的上下文切换中),就会发生不好的事情。

因此,两个PHP实例(在我的案例中来自不同的应用程序)能够在并发请求期间读取属于彼此的环境变量。

由于vlucas在他对问题报告的回复中有帮助地解释,这是预期的行为,解决方案是在您的web服务器配置文件中定义您的环境变量。

什么工作对我来说是删除DB_HOSTDB_DATABASE,从我.env文件DB_USERNAMEDB_PASSWORD线及以下添加到我的Apache虚拟主机配置块:

SetEnv DB_HOST db_host 
SetEnv DB_DATABASE db_name 
SetEnv DB_USERNAME db_user 
SetEnv DB_PASSWORD db_pass 

(不要忘了重新启动Apache在更改配置后)

请注意,如果您的Web根目录中有一个Laravel应用程序,并且在使用Apache Alias指令将子请求路由到正确应用程序的子目录中安装了额外的Laravel应用程序,则需要使用SetEnvIfBOTH套数据库凭据的,就像这样:

# Laravel app 1 in web root 
SetEnvIf Host ".*" DB_HOST=db1_host 
SetEnvIf Host ".*" DB_DATABASE=db1_name 
SetEnvIf Host ".*" DB_USERNAME=db1_user 
SetEnvIf Host ".*" DB_PASSWORD=db1_pass 

# Laravel app 2 in subdirectory "/subdir" 
SetEnvIf Request_URI ^/subdir DB_HOST=db2_host 
SetEnvIf Request_URI ^/subdir DB_DATABASE=db2_name 
SetEnvIf Request_URI ^/subdir DB_USERNAME=db2_user 
SetEnvIf Request_URI ^/subdir DB_PASSWORD=db2_pass 

(有关为何不能使用的SetEnvSetEnvIf组合的解释,见https://staff.washington.edu/fmf/2013/04/24/using-setenv-and-setenvif-together-in-apache/

关于这个的好处解决方案(如果它适用于您)仅仅需要在出现问题的环境中实施,即它只影响本地开发环境,则无需在生产服务器上更改任何内容。

3

什么工作对我来说是通过运行这些命令来清除一堆的Laravel设置:

php artisan config:clear 
php artisan cache:clear 
php artisan route:clear 
php artisan view:clear 
php artisan optimize 

我不知道该命令做了,但现在Laravel识别/正确读取.ENV文件为我的数据库配置。

+0

谢谢 - 尝试第一个(配置:清除),它的工作。我相信其余的可能是不必要的。 –

+0

我有一个die()在我的config/database.php中,它没有被调用 - 执行'php artisan config:clear'之后它被调用(简而言之,这对我有用) –

1

老问题,但以防万一其他人认为这是发生在他们身上(如刚刚发生在我身上),我简单的解决办法是改变的项目之一的.ENV变量的名称:

DB_X_HOST="localhost" 
DB_X_DATABASE="other_project" 
DB_X_USERNAME="homestead" 
DB_X_PASSWORD="secret" 
DB_X_PORT="3306" 

您然后更改设置\ database.php中的变量为:

'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_X_HOST', '127.0.0.1'), 
     'port' => env('DB_X_PORT', '3306'), 
     'database' => env('DB_X_DATABASE', 'forge'), 
     'username' => env('DB_X_USERNAME', 'forge'), 
     'password' => env('DB_X_PASSWORD', ''), 
     'charset' => 'utf8mb4', 
     'collation' => 'utf8mb4_unicode_ci', 
     'prefix' => '', 
     'strict' => true, 
     'engine' => null, 
    ] 

现在,你不应该有在马克的响应

1

一辑详细介绍了交叉污染与php artisan serve重新启动已修复相同的问题对我来说