我有一个通过jQuery ajax提交的表单,突然间,开始在一些请求在Chrome 和Safari OS x上失败。我已经测试了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)。
如果省略其中一个字段("phone"),错误似乎就会消失。但是,如果我连续点击几次提交按钮,请求最终会成功(在大约2-5次提交之后)——即使填写了"phone",所有请求的表单数据也是相同的。
失败请求和成功请求的响应时间没有区别。(例如,我在失败中得到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浏览器有问题。没有对代码做任何修改,它就神奇地开始工作了。
注。我当然知道这是非常不可能的事情发生"随机"和故障排除最有可能没有足够的系统,如果看起来是这样的话,但在这种情况下,错误似乎真的随机出现。
当我们从PHP 5.4升级到5.6时,这个问题已经解决了-似乎PHP中存在某种错误。希望它能帮助到别人!
仅供参考:我最终破解了这个问题,检查响应对象是否匹配此错误,并在发现此错误时触发onSuccess
。虽然很丑,但效果不错
您应该尝试在服务器的php.ini文件中增加memory_limit,甚至至少在测试时禁用它。