Laravel Forge部署的Stripe环境变量失效,本地正常求助
针对你遇到的情况,结合Laravel 5.5的特性和Forge的部署逻辑,给你几个针对性的排查步骤:
优先清理配置缓存(别搞混缓存类型):
你提到执行了php artisan cache:clear,但这个命令只清理应用缓存,配置缓存需要单独清理。Laravel 5.5中如果运行过php artisan config:cache,系统会把所有配置(包括env变量)编译成一个缓存文件,后续不会再读取.env文件。如果之前缓存时这两个Stripe变量不存在,哪怕后来添加了.env里的内容,缓存依然是空值。
解决方法:在服务器上执行:php artisan config:clear php artisan cache:clear之后再测试Stripe功能。
确认Forge部署时的.env是否被自动覆盖:
Forge的部署流程默认会根据你在Forge面板「环境变量」页面设置的内容重新生成.env文件。如果你只在服务器上手动修改了.env文件,但没在Forge面板添加这两个Stripe变量,那么每次部署(比如git push触发的部署)都会覆盖掉服务器上的.env,导致变量丢失。
排查方法:登录Forge面板,找到你的服务器和站点,进入「环境变量」页面,检查是否存在STRIPE_API_KEY和PUB_STRIPE_API_KEY,如果没有,添加进去并保存,Forge会自动更新服务器上的.env文件。检查服务器上.env文件的语法细节:
虽然本地.env正常,但服务器上的文件可能存在隐性语法问题,比如:- 变量名或值前后有空格(比如
STRIPE_API_KEY = sk_test_xxx,等号前后的空格会导致Laravel读取失败) - 值没有正确包裹(如果Stripe键里有特殊字符,虽然概率低,但可以尝试用双引号包裹:
STRIPE_API_KEY="sk_test_xxx")
你可以直接在服务器上执行以下命令,验证变量是否能被Laravel正确读取:
php artisan tinker // 在tinker交互环境里执行: env('STRIPE_API_KEY')如果返回空,说明.env文件读取有问题;如果能返回正确的键,那可能是代码里的调用逻辑有问题。
- 变量名或值前后有空格(比如
核对配置文件的引用逻辑:
打开config/services.php,确认Stripe的配置是不是正确引用了env变量:'stripe' => [ 'model' => App\User::class, 'key' => env('PUB_STRIPE_API_KEY'), 'secret' => env('STRIPE_API_KEY'), ],确保这里没有硬编码为空值,或者没有被其他代码覆盖。
快速排除文件权限问题:
虽然其他env变量正常,但可以确认下服务器上.env文件的权限,确保web服务器用户(比如www-data)有读取权限:ls -l /path/to/your/site/.env通常权限应该是
644,所有者是web服务器用户或者能被其读取的用户。
内容的提问来源于stack exchange,提问作者Hondaman900

