我在PHP网站的许多部分使用$ajax
个请求,一切正常,直到几天前我的所有$ajax
个请求都开始提供error 500 - internal server error
。
我可以在控制台中看到该错误,并且我还使用错误处理程序来获取有关错误的更多信息。
这是我的Ajax请求
window.setInterval(function(){
$.ajax({
type: "GET",
url: "include-ajax/is_it_midnight.php",
dataType: "json",
success: function(data)
{
if(data == 1)
{
//Reload website at midnight
location.reload();
}
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest);
alert(textStatus);
alert(errorThrown);
alert(XMLHttpRequest.responseText);
}
});
}, 10000);
这就是我在浏览器上获得的内容:
is_it_midnight.php:
<?php
$current_hour = date('H');
$current_minute = date('i');
$current_second = date('s');
//If the website was open between the 00:00:00 and 00:00:10 it will refresh automatically
//else it will not be open it will open after midnight so it will have aleardy the new day data
if($current_hour == 0 && $current_minute == 0 && ($current_second > 0 && $current_second < 10))
{
$is_it_midnight = 1;//This flag means it is midnight
}
else
{
$is_it_midnight = 2;//This flag means it is not midnight
}
echo json_encode($is_it_midnight);
?>
一些注意事项:
1.它不会一直给出这个错误,有时它工作正常并正确地给出响应(我在网站上看到响应和标题信息,当我检查chrome控制台中的网络选项卡时)。
2.如果类型是GET或POST并不重要,它一直给我同样的问题(我用GET类型显示这个ajax示例,但我在我的网站中也有类型问题的POST类型请求)。
3.我将ini_set('display_errors',1);``ini_set('display_startup_errors',1);``error_reporting(-1);
添加到is_it_midnight.php
的开头,但没有显示错误,因为我相信没有语法或任何其他php错误(因为有时它工作正常并且正确)。
4.我还查看服务器错误日志,但根本没有与此文件或任何其他ajax文件相关的内容。
5.我试图检查这是否是超时错误,但我没有从timeout
获得任何textStatus
,只是提醒error
。
更新:
我检查了apache日志,我发现了类似这样的内容:[Sat Feb 21 07:35:05 2015] [error] [client 176.40.150.195] Premature end of script headers: is_it_midnight.php, referer: http://www.example.com/index.php
我需要任何有用的帮助或线索来理解为什么我会得到这个错误有什么我没有尝试它来获取有关该错误的更多信息???
答案 0 :(得分:3)
首先,您必须确保错误日志机制配置得很好。
为此,请添加以下代码或类似代码:
ini_set("log_errors", 1);
ini_set("error_log", "/tmp/php-error.log");
error_log( "Php Errors!" );
我注意到的另一个问题是你的php脚本没有返回100%有效的JSON,我也认为你可以重构代码来返回结果,而无需创建任何变量(更好的性能,更快,更糟的代码)避免任何类型的内存分配问题。
在某些情况下,非常加载的共享服务器或不可扩展的VPS可以尝试非常低的内存,并且在尝试为变量分配内存时可能会随机生成错误。
我不知道你是否使用某种框架,但在纯php中编写脚本的方法不同,可以是这样的:
header('Content-Type: application/json');
return (date('H') == 0 AND date('i') == 0 AND (date('s') > 0 AND date('s') < 10)) ? json_encode(['res' => 1]) : json_encode(['res' => 2]);
此代码将始终返回有效的JSON格式,例如{"res":1}
或{"res":2}
,您可以像res = data.res; console.log(res);
一样轻松访问此类JS,并且您将对此进行评估:{ {1}}。
在你的情况下,你正在使用(data.res === 1)
这几乎在所有情况下,如果你的php没有返回有效的JSON,它就不会很好。也许您考虑删除它,如果您没有被期望只有有效的JSON,那么它在这里不是很重要。
您可以尝试一下,看看发生了什么。
如果错误仍然存在,您可以在dataType: "json"
文件中看到它。并与您的托管公司评论。
作为括号,我想补充一点,你的脚本应该返回1或0,真或假而不是1或2.这只是一种更实用的方法。
如果我的回答有帮助,或者如果您无法解决问题,请告诉我,我会尽力帮助您。
再见!再见! Suerte!答案 1 :(得分:1)
我的猜测是,由于主机上的某些(错误)配置,服务器会杀死PHP进程(我怀疑使用了mod_fastcgi / mod_fcgid;您可以使用{{ 1}})。此外,您每10秒执行一次可能达到某个限制的呼叫。在你的情况下我会做什么:
phpinfo()
/ mod_fastcgi
mod_fcgid
中的Server API
字段一起使用。phpinfo()
,看看脚本access_log
的{{1}}状态代码是否存在模式。500
刷新时间增加到15秒,20秒,25秒,30秒等,以确定是否有任何改进。is_it_midnight.php
之前放置setInterval
以查看分配给脚本的内存使用量是多少(尽管在给定小脚本的情况下内存使用情况不太可能出现问题)。答案 2 :(得分:1)
您的主机很可能在其服务器上进行了最新更新,从而导致问题。
您应该建议他们查看内存消耗,并尝试将Apache内存限制参数:“RLimitMEM”增加到上限值,这是此类错误的常见因素。
答案 3 :(得分:1)
我不知道这是否会对你有所帮助,但我前一段时间遇到同样的问题,我所做的唯一一个动作就是从我的jquery ajax函数中删除它
dataType: "json"
这是我做的一些功能(“mostrar_alert_ui”是一个模态警报窗口功能,与“MostrarVentanaBoton”相同,它是一个确认警报功能)
//Función ajax con alert
function Funciones_Ajax_conAlert(urlx, datax, callback, phpencode) {
var TodoBien = false;
$.ajax({
type: "POST",
url: urlx,
data: datax,
async: true,
success: function (data) {
if (phpencode == true) {
data = $.parseJSON(data);
}
console.log(data) //Solo para propositos de debug
if (data.success) {
MostrarVentanaBoton(data.titulo, data.mensaje, data.boton, callback);
} else {
mostrar_alert_ui(data.titulo, data.mensaje)
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Failed " + urlx);
alert(xhr.responseText);
alert(thrownError);
}
});
}
以防万一,仔细检查方向
答案 4 :(得分:1)
您是否检查过服务器上的文件权限? Web服务器用户必须能够读取您要访问的文件。另见(https://stackoverflow.com/a/17626018/3972213)
更新: 如果您使用的是apache2并且可以访问配置,则可以通过打开取证日志(http://httpd.apache.org/docs/2.2/mod/mod_log_forensic.html)来获取有关每个请求的更多信息。希望这会有所帮助。
答案 5 :(得分:0)
好吧,&#34;脚本标题的过早结束&#34;很常见,而且可能性很小。它表示PHP脚本在发送任何输出之前由于某种原因已停止。它与AJAX本身无关。
<强>可能性:强>
<强> 1。 Apache配置错误
升级或降级到不同版本的PHP可以离开 httpd.conf中的剩余选项。检查当前版本的PHP 在命令行上使用php -v并搜索任何提及的行 httpd.conf中的另一个版本。如果你发现它们,请将它们评论出来, 提取httpd.conf并重新启动apache。
检查您的Apache配置是否有任何更改并修改PHP的模块列表(尝试逐个禁用它们)。
<强> 2。资源限制
httpd.conf中的RLimitCPU和RLimitMEM指令也可能是 如果脚本因资源而被杀死,则负责该错误 限制。
第3。第三方扩展
suEXEC,mod_perl或其他第三方的配置问题 模块经常会干扰脚本的执行并导致脚本执行 错误。如果这些是原因,有关的其他信息 具体内容将在apache error_log中找到。
<强> 4。 SuPHP崩溃
如果suphp的日志大小达到2GB或更大,您可能会看到过早的日志 脚本结束标题错误。查看日志包含的内容 gzip它或null它。重启apache然后处理任何问题 suphp日志曝光。 suphp日志位于: 的/ usr /本地/ Apache /日志/ suphp_log
<强> 5。文件权限
脚本的权限也可能导致此错误。 CGI脚本可以 仅访问在中指定的用户和组所允许的资源 httpd.conf中。在这种情况下,错误可能只是指出了一个 未经授权的用户正在尝试访问脚本。
正如您所看到的,可能性很小。你提到它有时会崩溃,所以它可能是资源或配置的东西。例如 - 如果您的服务器负载很重,Apache可以拒绝您的请求并抛出此通用&#34;脚本标头的过早结束&#34;错误。
你有什么尝试?
答案 6 :(得分:0)
如果每次脚本运行都没有发生,那么我的猜测是: