http的499状态码是什么鬼?

缘由

在排查mysql锁表的情况时,发现总是出现两次相邻的同样请求。 而且第一次的事务基本都成功,第二次的失败 继续分析得出,因为代码时间比较长,超过了30s,用户无法忍受。 刷新了页面或者关闭重新提交同样的修改数据。但第一次的事务还在进行中。 结果就出现了,为了验证自己的想法,对499进行了模拟

SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction xxxxxxxx

定义

ngx_null_string, /* 499, client has closed connection */

模拟

我做了一个php的页面,代码很简单

echo '

';

print_r($_POST);

exit;

产生的日志

127.0.0.1 - - [31/Mar/2020:14:06:15 +0800] "GET /test/1.php HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-" 0.131

加上sleep后

sleep(20)

echo '

';

print_r($_POST);

exit;

然后请求页面后,2秒后关闭页面 情况出现

127.0.0.1 - - [31/Mar/2020:14:10:19 +0800] "GET /test/1.php HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36" "-" 3.861

解决

只能优化代码速度,把耗时的程序部分放到单独的队列里面除了