我有一个Javascript客户端,它使用JQuery将Ajax POST请求发送到共享Hostgator服务器上的PHP代码。帖子数据是几百KB的JSON数据,使用file_get_contents('php://input')
读取。 PHP后期数据限制报告为64 MB,通常一切正常。
但是每隔几天就会使用非法的JSON字符串调用PHP代码,并且客户端的状态为400.可能这个状态自动来自Apache,因为我的代码没有做任何特殊的发送。昨天我放置了代码来记录帖子数据,它被截断为长度为196,269的JSON ......可疑地只有3 * 64KB。
似乎请求被截断了;因为我只从众多客户中的一个看到这个,我可以想象存在一些间歇性的网络连接问题。如果这是一个糟糕的结论,我很高兴有人纠正我,但请注意,这不是我要问的问题。
我不明白为什么在这种情况下调用PHP代码。当收到格式错误的请求时,Apache不应该打电话吗?在收到包括发布数据在内的完整请求之前,Apache无法启动PHP执行,并且在PHP代码运行之前不知道存在问题,是吗?如果这是预期的行为,我的PHP代码如何检测到这是一个格式错误的请求?目前我依赖于检查json_decode中的错误,但这似乎并不完美,例如如果数据不是JSON。我正在编写代码来检查http_response_code(),但是我对PHP文档的阅读让我怀疑这会返回200:
如果未提供response_code,则返回当前状态代码。如果在Web服务器环境中使用,这两个值都将默认为200状态代码。
我很高兴能够指出Apache / PHP文档,它描述了如何处理这种错误案例;我对在线文档的搜索没有成功。
非常感谢您的帮助。
编辑:我被要求显示我正在发送数据;它如下图所示。但同样,问题不在于如何避免错误(我有理由相信这是一个连接问题),但在错误的存在中会发生什么。
$.ajax({
url: myurl,
xhrFields: {'withCredentials': true}, // Send credentials to the server to allow CORS
dataType: 'json',
contentType: 'application/json; charset=utf-8',
type: 'POST', // Means that this changes server state (i.e. not cachable) and needed to send large amounts of data
data: JSON.stringify(dataToSend),
timeout: 120000,
async: true,
success: syncStepSucc,
error: syncAjaxErr
} );
编辑:请注意,当Apache收到乱码/截断数据时,我试图了解Apache和PHP之间的交互,而Apache决定返回HTTP状态400.后期数据限制为64 MB,远远超过196收到的KB。