目前,我正在将遗留代码库迁移到PHP 7.1。 代码库使用单个数据库对象作为PHP移除的mysql函数的包装器。 因此,简单的方法似乎是简单地将所有mysql函数替换为新的mysqli函数。
没有问题......
然而,当我将重构的代码注册到生产服务器时,mysql服务器负载变得很高。
所以,当我发现mysql_connect
试图重新使用mysql连接(或类似的东西)时:
如果使用相同的参数对mysql_connect()进行第二次调用,则不会建立新的链接,而是返回已打开的链接的链接标识符。 new_link参数修改了这种行为,并使mysql_connect()始终打开一个新的链接,即使之前使用相同的参数调用了mysql_connect()。在SQL安全模式下,将忽略此参数。
mysqli_connect
没有这样的行为,所以我们确实看到了大量的mysql连接被打开。
然后我们通过实现mysqli对象缓存来解决这个问题。因此,当一个请求尝试打开与同一用户/数据库组合的另一个连接时,我们会重新使用已建立的连接。
这确实有很大的不同,但我们仍然看到更高的数据库负载(大约高出5倍)。
我还在这里遗漏一些东西吗?有什么好主意吗? 当然,这些问题可能仍然是我们的代码库所特有的,但我希望有一些我忽略的mysqli扩展名。
旁注:我们现在不想使用持久连接,因为这可能会带来其他复杂性。
答案 0 :(得分:0)
您很可能每个脚本偶尔会有一两个孤儿连接。确保您的代码每个实例只连接一次。
我们通过实现mysqli对象缓存来解决这个问题。
在PHP中,已经实现了对象缓存。您只需要确保只进行一次连接,并且只需在整个脚本执行期间使用保存该连接的单个对象。
我们现在不想使用持久连接,因为这可能会带来其他复杂性。
完全。让zillions连接在一个脚本中,持久连接将立即终止您的数据库。
答案 1 :(得分:0)
所以这是愚蠢的:昨天我检查了生产服务器上的重构代码库,几乎立即我看到mysql服务器负载提升了平均值的5倍。
所以我恢复了代码,服务器负载回落到平均水平以下。
然后我再次检查了新代码,服务器负载再次提升到平均值的4倍左右。就在那时我得出的结论是我们的代码出了问题。
今天我再次尝试,没有任何反应:服务器负载保持在平均水平以下。所以昨天我一直在寻找访客高峰。 在静态数组中缓存mysqli连接确实解决了问题。