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.onSuccessthis.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)的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax 发布请求在 Chrome 上挂起

为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?

为啥 Chrome 和 Firefox 以不同方式处理 jQuery ajax() 回调中设置的 javascript 变量?

在chrome更新后,jQuery ajax调用无法从网页解码到utf-8字符集到Chrome扩展

jquery $.ajax 在 Chrome 或 Firefox 中调用会导致 401 未经授权的响应,但在 IE 中有效

jQuery Ajax 在 IE 6/7/8 中不工作,在 FF/Safari/Chrome 中工作