我最近发现,早先运行良好的SQL查询现在在60秒后超时并引发错误。该查询速度很慢,但是作为日常工作的一部分运行,因此它本身不是问题(因此请不要建议我对其进行优化)。
通过运行“ select SLEEP(120);”,我能够一致地重现该错误。从PHP如下所示。但是,从MySQL客户端运行相同的语句成功(返回0)。我试过调整wait_timeout(设置为28800),但是没有运气。我还重新启动了数据库服务器和计算机本身。
它总是总是在60秒后超时的事实向我表明,这很可能是一种设置,而不是有限的资源问题。
我正在运行: Windows Server 2003 MySql 5.1.36-社区 PHP 5.3
以下是我的测试代码,SHOW VARIABLES的输出和结果
谢谢!
码:
set_error_handler("sqlErrorHandler"); set_time_limit(12000);
$link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass"); mysql_select_db($MYSQL_db, $link);
echo "mysql_ping = " . (mysql_ping($link) ? "LIVE" : "DEAD") . "
";
$sql = "SELECT SLEEP(120);";
$start = microtime(true); mysql_query($sql, $link);
echo "query done
"; allDone();
function allDone(){ global $start, $sql;
$end = microtime(true); echo "sql : $sql
"; echo "elapsed : " . ($end - $start) . "
"; echo "
"; }
function sqlErrorHandler($errno, $errstr, $errfile, $errline){ global $link; echo "Error : $errno
$errstr
"; echo "mysql_ping : " . (mysql_ping($link) ? "LIVE" : "DEAD") . "
"; echo "
";
allDone(); } 输出:
mysql_ping = LIVE
Error : 2 mysql_query() [function.mysql-query]: MySQL server has gone away mysql_ping : DEAD
sql : SELECT SLEEP(120); elapsed : 60.051116943359
Error : 2 mysql_query() [function.mysql-query]: Error reading result set's header mysql_ping : DEAD
sql : SELECT SLEEP(120); elapsed : 60.0511469841
query done sql : SELECT SLEEP(120); elapsed : 60.051155090332 显示变量:
Variable_name=Value auto_increment_increment=1 auto_increment_offset=1 autocommit=ON automatic_sp_privileges=ON back_log=50 basedir=C:\Program Files\MySQL\MySQL Server 5.1\ big_tables=OFF binlog_cache_size=32768 binlog_format=STATEMENT bulk_insert_buffer_size=8388608 character_set_client=utf8 character_set_connection=utf8 character_set_database=latin1 character_set_filesystem=binary character_set_results=utf8 character_set_server=latin1 character_set_system=utf8 character_sets_dir=C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ collation_connection=utf8_general_ci collation_database=latin1_swedish_ci collation_server=latin1_swedish_ci completion_type=0 concurrent_insert=1 connect_timeout=10 datadir=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.1\Data\ date_format=%Y-%m-%d datetime_format=%Y-%m-%d %H:%i:%s default_week_format=0 delay_key_write=ON delayed_insert_limit=100 delayed_insert_timeout=300 delayed_queue_size=1000 div_precision_increment=4 engine_condition_pushdown=ON
php选项mysql.connect_timeout是这样做的原因。它不仅用于连接超时,还用于等待服务器的第一个答案。您可以像这样增加它:
ini_set('mysql.connect_timeout', 300); ini_set('default_socket_timeout', 300); 来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。