我遇到了一个问题,我似乎无法理解涉及由于数据库连接失败而无法完成的长PHP脚本。
我正在使用PHP 5.5.25和MySQL 5.6.23,以及mysqli接口。
该脚本使用TCPDF库来创建财务报告的PDF。总的来说它运行良好。但是,当数据集变大时(报表可以迭代多个帐户以创建一个包含所有符合条件的帐户的多页报表),它将在大约30秒(不完全是30秒,有时几秒钟)后失败邮票)。它似乎在大约25-35个循环中运行正常,但不止于此导致问题。
我不认为这是一个超时的问题(虽然它当然可能)。我已经将PHP设置为相当大量的资源来处理它。
max_execution_time = 600 memory_limit = 2048M
该脚本每秒都有数百个查询,确实很难打到数据库。从数据库的某些统计信息中我可以看出,一次只有几个活动连接,所以看起来我没有接近150个最大连接的默认设置。
这是我最终因大数据集失败而得到的错误。
警告:mysqli :: mysqli():( HY000 / 2002):无法在...中分配请求的地址。
致命错误:数据库连接失败:无法在...中分配请求的地址
是否有人对可能导致脚本最终无法连接到数据库并且无法完成的内容有任何建议?我已经尝试过搜索一些答案,但到目前为止我发现的几乎所有关于数据库连接失败的内容根本无法连接,而不能通过大型脚本中途连接。
提前感谢任何建议。
答案 0 :(得分:0)
我认为这不是超时问题
你应该知道。
这个问题在执行开始后很久就出现了,这似乎很奇怪。是否很难检查超时是什么?要尝试改变吗?要在代码中添加一些日志记录吗?
您应该检查的另一件事是脚本是打开单个连接并重新使用它还是不断打开新连接。
没有看到代码,很难肯定地说,但是单个脚本每秒执行数百次查询几十秒听起来像SQL和PHP逻辑之间的分离一直很糟糕。
答案 1 :(得分:-2)
您可以使用mysqli_connect_errno方法检查连接是否已连接
也可以使用mysqli_errno方法检查您上次发送的查询是否成功
如果在较长的脚本中连接断开,我还使用-Djdk.http.auth.tunneling.disabledSchemes=""
功能再次尝试连接
connect()