jQuery ajax 在 Chrome 和 Safari 中失败 *sometimes* (ERR_EMPTY_RESPONSE)
Posted
技术标签:
【中文标题】jQuery ajax 在 Chrome 和 Safari 中失败 *sometimes* (ERR_EMPTY_RESPONSE)【英文标题】:jQuery ajax fails *sometimes* (ERR_EMPTY_RESPONSE) in Chrome and Safari 【发布时间】:2015-12-26 17:31:51 【问题描述】:我有一个通过 jQuery ajax 提交的表单,突然间,在 OS X 上的 Chrome 和 Safari 中的 some 请求开始失败。我已经测试了 Firefox、Opera 和 ios Safari,它们似乎都工作得很好(但是我不能说我 100% 确定这一点,因为错误似乎是随机出现的,但我在每个浏览器中尝试了大约 10 个请求,没有失败)。
Chrome 在控制台中说POST http://<site url>/wp-admin/admin-ajax.php net::ERR_EMPTY_RESPONSE
,当请求失败时,在控制台中记录响应对象会给我Object readyState: 0, responseText: "", status: 0, statusText: "error"
,不是很有帮助。
然而无论响应是失败还是成功,完整的 PHP 脚本都会执行。我知道这一点,因为从表单发送的电子邮件总是会送达。此外,在 PHP 中记录所有传入的请求标头时,失败的请求和成功的请求之间没有区别。
我还使用 bash $ curl ...
检查了响应,并且找不到响应之间的任何差异,即使我使用可以从 Chrome 的网络选项卡复制的命令(右键单击请求>复制为 cURL)。
如果我省略其中一个字段(“电话”),错误似乎就消失了。但是,如果我一直单击提交按钮几次,请求最终会成功(大约 2-5 次提交后)——即使填写了“电话”,所有请求的表单数据都是相同的。
失败的请求和成功的请求之间的响应时间没有区别。 (即,我刚刚在失败时得到 1.11 秒,在成功时得到 1.16 秒)。
用于提交的代码:(this.onSuccess
和this.onError
目前只记录请求结果)
$.ajax('<url>',
action: '<url>',
method: 'POST',
data: data, // Serialized form
success: $.proxy(this.onSuccess, this), // currently just console_logs the response object
error: $.proxy(this.onError, this), // currently just console_logs the response object
always: $.proxy(this.always, this)
);
我还发现了一些关于超时和在 Chrome 中缓存的问题,所以我尝试更改它而不做任何更改:
$.ajax('<url>',
action: '<url>',
timeout:9999,
async:true,
cache:false,
method: 'POST',
data: data, // Serialized form
success: $.proxy(this.onSuccess, this), // currently just console_logs the response object
error: $.proxy(this.onError, this), // currently just console_logs the response object
always: $.proxy(this.always, this)
);
表单看起来像这样(但有很多样式模糊):
<form action="#ww_main" class="ajax-form">
<input type="text" data-min-length="3" name="main[name]" id="name" required="">
<input type="email" name="main[email]" id="email" required="">
<input type="tel" name="main[phone]" id="phone">
<textarea name="main[message]" data-min-length="5" id="message" required=""></textarea>
<button type="submit">Skicka</button>
</form>
有人知道是什么原因造成的吗?或者至少可以给我一个关于如何继续的提示?我现在的想法已经用完了......
提前致谢!
更新
Safari 突然可以正常工作了……只是 Chrome 有问题。没有对代码进行任何更改,它只是神奇地开始工作。
附:我当然知道事情不太可能“随机”发生,而且如果看起来是这样的话,故障排除很可能没有足够系统化,但在这种情况下,错误似乎确实是随机出现的。
【问题讨论】:
该错误似乎表明该错误是与接收请求的服务器有关,而不是 javascript。 ^失败和成功响应之间的响应实际上没有区别,甚至响应时间也没有。当服务器的响应相同时,我看不出它怎么可能是服务器端错误。此外,它不会在浏览器之间以不同的方式处理请求,所以对我来说,情况似乎非常不太可能。 Ajax 调用是如何调用的? 【参考方案1】:当我们从 PHP 5.4 更新到 5.6 时,这个问题得到了解决 - PHP 中似乎存在某种错误。希望它可以帮助某人!
【讨论】:
我在 5.6 并且有同样的问题 :) 到底是什么 :)【参考方案2】:仅供参考:
我最终解决了这个问题,检查响应对象是否匹配此错误并在发现此错误时触发onSuccess
。 Uuuuugly,但它成功了。
【讨论】:
【参考方案3】:您应该尝试增加服务器的 php.ini 文件中的 memory_limit ,甚至至少禁用它以进行测试。
【讨论】:
错误日志中没有任何错误。感谢您的回复,但不会出现与 memory_limit 相关的问题吗?并给出 500 个响应/部分响应?此外,该问题仅出现在 chrome 中,有时在提交与没有问题时完全相同的数据时会出现问题。我真的认为这是一个与浏览器相关的问题。 你可能是对的。但问题是我在尝试上传大文件时收到了 ERR_EMPTY_RESPONSE。但是在尝试了很多事情之后,我禁用了 memory_limit 并且错误消失了。当我试图为我的问题找到解决方案时,我实际上发现了你的问题。所以我认为最好至少让你知道。 有趣...希望它可以帮助某人解决与您类似的问题,感谢您的意见!以上是关于jQuery ajax 在 Chrome 和 Safari 中失败 *sometimes* (ERR_EMPTY_RESPONSE)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?
为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?
在chrome更新后,jQuery ajax调用无法从网页解码到utf-8字符集到Chrome扩展
jquery $.ajax 在 Chrome 或 Firefox 中调用会导致 401 未经授权的响应,但在 IE 中有效