我在我的PHP网站的许多部分使用$ajax
请求,一切正常,直到前几天我所有的$ajax
请求开始给error 500 - internal server error
。 我可以看到在控制台中的错误,也用error handling程序来获取有关错误的更多信息。 这是我的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.它不是一直给这个错误,有时它工作正常,并带来了正确的响应(我看到在网站上的响应和标题信息,当我检查networking选项卡在铬控制台)。 2.没关系,如果types是GET或POST它不断给我同样的问题(我用GETtypes显示这个ajax例子,但我也有同样的问题在我的网站POSTtypes的请求)。 3.我添加了ini_set('display_errors',1);``ini_set('display_startup_errors',1);``error_reporting(-1);
到is_it_midnight.php
的开始,但没有错误显示,因为我相信没有语法或任何其他的PHP错误(因为有时它工作正常)。 4.我也检查服务器错误日志,但没有任何关系到这个文件或任何其他的Ajax文件。 5.我试图检查这是否是超时错误,但我没有从textStatus
得到任何timeout
它只是警报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
我需要任何有用的帮助或线索来理解为什么我得到这个错误是否有任何我没有尝试获得有关该错误的更多信息?
首先,你必须确定错误日志机制的配置。
为此,请添加以下代码或类似内容:
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);
res = data.res; console.log(res);
你会像这样评估它: (data.res === 1)
。
在你的情况下,你使用的是dataType: "json"
,在几乎所有的情况下,如果你的php没有返回有效的JSON,那么这种方法并不好。 也许你考虑删除它,如果你没有被期望只有有效的JSON,这里不是很重要。
你可以尝试一下,看看发生了什么。 如果错误持续存在,您可以在/tmp/php-error.log
文件中看到它。 并与您的托管公司评论。
作为一个括号,我想补充一点,你的脚本应该返回1或0,true或者false而不是1或2.这只是一个更实用的方法。
让我知道如果我的答案是有帮助的,或者如果你不能解决这个问题,我会尽力帮助你。
再见! Suerte!
我的猜测是,由于主机上有一些(错误的)配置,PHP进程被服务器杀死(我怀疑是使用了mod_fastcgi / mod_fcgid ;你可以用phpinfo()
来检查)。 此外,您每10秒钟执行一次呼叫,可能会遇到一些限制。 我会在你的情况下做什么:
mod_fastcgi
/ mod_fcgid
( phpinfo()
server API
字段)。 access_log
,查看脚本is_it_midnight.php
是否存在500
状态码的is_it_midnight.php
。 setInterval
刷新时间增加到15s,20s,25s,30s等,看是否有任何改进。 error_log (memory_get_usage());
之前echo json_encode($is_it_midnight);
看看分配给脚本的内存使用量是多少(尽管考虑到小脚本,内存使用率不太可能是个问题)。 您的主机很可能在导致问题的服务器上进行了最近的更新。
您应该建议他们查看内存消耗情况,也许尝试将Apache内存限制参数“RLimitMEM”增加到较高的值,这是这种错误的一个常见因素。
你有没有检查服务器上的文件权限? 网络服务器用户必须能够读取您要访问的文件。 另请参阅( https://stackoverflow.com/a/17626018/3972213 )
更新:如果您正在使用apache2并有权访问配置,可以打开取证日志( http://httpd.apache.org/docs/2.2/mod/mod_log_forensic.html ),获取有关每个请求的更多信息。 希望这可以帮助。
我不知道这是否会对你有所帮助,但是前一段时间我遇到了同样的问题,我做的唯一的操作就是从我的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); } }); }
为了以防万一,请仔细检查方向
那么,“脚本标题的提前结束”是相当普遍的,而且几乎没有可能。 这表明在发送任何输出之前,PHP脚本已经由于某种原因被停止了。 这与AJAX本身无关。
可能性:
1. Apache错误配置
升级或降级到不同版本的PHP可能会在httpd.conf中留下剩余的选项。 在命令行中使用php -v检查PHP的当前版本,并在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 / local / apache / logs / suphp_log
5.文件权限
脚本的权限也可能导致此错误。 CGI脚本只能访问httpd.conf中指定的用户和组所允许的资源。 在这种情况下,错误可能只是指出未经授权的用户正在尝试访问脚本。
正如你所看到的,没有什么可能。 你提到它有时只是崩溃,所以它可能是资源或配置的东西。 例如 – 如果你的服务器负载很重,Apache可以拒绝你的请求,并抛出这个通用的“脚本头过早结束”错误。
你已经尝试了什么?
如果每次脚本运行都没有发生,那么我的猜测是: