调用多个laravel项目接口导致数据库连接错乱

一、背景问题

最近接手了一个之前已经做好的产品,只是后台还有Bug需要调试。

从仓库pull下来项目代码,然后在本地配置好,就让小程序和app调用接口进行调试,因为一些特殊配置的数据没有到位,报了一些错,简单修正就好了,但是有一个问题,一直反复出现。

这个产品调用了两个laravel框架项目中的后台接口,先调用了A后台接口后,再调用B后台接口,然后就报A.xxx数据库不存在,调了B后台接口后再执行A后台接口,又报B.xxx数据库不存在,当时我一再检查被调用接口地址,但怎么看都没有问题,然后开始怀疑是不是框架底层的问题,于是上网搜索了“调用多个laravel项目接口导致数据库连接错乱”,找到下面这篇文章:

大家有没有遇到多个应用中数据库连接错乱问题?

文章中说到laravel中getenv() 和 putenv() 不是一个线程安全的函数,意味着如果两个线程同时调用这个函数,而自己php环境又是线程运行模式,那肯定会出问题。于是,我马上打印phpinfo查看我的PHP运行模式,果然:

这篇文章刚好就说清楚了我正面对的问题,感恩感恩!

二、解决办法

文章中说了3种解决办法,第3种就等不了了,第2种不合适,所以就按照第1种方式修改。

将PHP更换成非线程安全(nts)版本。

我本地是使用的集成环境wampserver3.0,该版本中带有php5.6和php7.0,但都是线程安全运行模式版本(ts版本),所以需要重新装一个nts(非线程安全)版本的php,再加上laravel5.5要求php至少是7.0以上,所以就找了php7.0.31-nts版本的php压缩包,然后经过一系列配置放在wampserver里面,但最后很悲催提示我,wampserver3.0里面的apache2.4版本不支持新添加的这个php7.0.31,实在郁闷,直接下载了一个phpstudy2018:

切换php版本为7.0.12-NTS,然后把项目整个迁移到新的项目目录里(也可以更改phpstudy项目根目录到之前的文件夹),数据库也整个迁移过来,再运行产品调用接口,一切恢复正常!!!

三、事后思考

为什么我之前的同事和产品上线后都没遇到这个问题?

我问了同事,知道他本地环境也是使用的phpstudy集成环境,php也是非线程版本,所以没问题。

那为什么产品上线后,在我们服务器里面运行也没有问题?服务器是linux系统,配置的lnmp环境,在安装php的时候直接就安装了nts版本,所以也没出现我这个情况。

之前对php各个版本不是很熟悉,经过这次过后,对windows系统下选择php版本也有了一个了解和学习,同事也对进程和线程理解加深,以下是扩展学习博文:

1.  在windows系统下如何选择PHP版本:

     PHP线程安全(TS)与非线程安全(NTS)、Apache版本选择,及详解五种运行模式

2.  了解ts和nts区别:php的ts和nts选择

3.  了解PHP的线程和进程:三分钟了解PHP的进程和线程

猜你喜欢

转载自blog.csdn.net/createNo_1/article/details/81357540