将PHP脚本从PHP 5.2迁移到PHP 5.3时,我偶然发现了以下问题: 该脚本的一般用途是数据挖掘。 我有一个程序,将数据添加到MySQL服务器。 由于它确实是重复的,我已经重写它(不久前)使用MySQLi,特别是准备好的语句,因为总共有3个可能的查询要执行。 无论如何,现在,在PHP 5.3服务器上,脚本崩溃在以下行:
mysqli_stmt_bind_result($prepCheck, $id1);
使用$prepCheck
创建$prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");
的位置。查询在MySQL服务器上运行正常($ checkQuery,即),并且PHP代码也在以前的服务器上运行。
使用strace
运行脚本时没有透露任何内容,因为其中的最后一件事是echo "Execute";
的系统调用,即29936 19:44:18 write(1, "Execute\n", 8) = 8
。
连接对象不是FALSE
,即使它是,它也会因另一个错误而失败,对吗?
这是最奇怪的部分: 运行脚本时,此过程不会失败,限制访问的页数并且脚本成功完成。但是,当我设置一个更高的限制时,它会在第一次调用此过程时失败,始终,并且恰好在此行上。
如果有人有任何可能导致这种情况的建议,我们将深表感谢。
如果有人需要查看更大的图片,我可以粘贴代码,但程序很长而且很无聊(这可能就是脚本失败的原因:)。
以下是脚本的启动方式:error_reporting(E_ALL); ini_set('display_errors', '1');
。
除了'魔法'Segmentation fault
之外,没有报告任何错误。我没有使用APC。
不确定它是否相关,但我使用CLI来运行脚本,而不是Web界面。
PHP版本为5.3.8,MySQL版本为5.1.56。内存限制设置为64MB。
编辑:程序失败+其他一些代码上传到此处:http://codepad.org/KkZTxttQ。整个文件庞大而丑陋,我相信无关紧要,所以我暂不发布。失败的是113。
答案 0 :(得分:1)
回答我自己的问题,因为我已经解决了这个问题,而且没有其他答案......
信用到@ jap1968指向我的函数mysqli_stmt_error(我假设我不需要,因为我有error_reporting(E_ALL)
)。
问题在于MySQL有一个非常奇怪的默认配置:特别是
connect_timeout = 10
wait_timeout = 30
这导致MySQL服务器在30秒后关闭连接(默认超过半小时,根据MySQL网站)。这反过来导致mysqli_stmt_bind_result函数失败并出现分段错误。