I use $ajax
requests in many parts of my PHP website everything was working perfectly until few days ago all my $ajax
requests start giving error 500 - internal server error
.
I can see that error in the console and also I used error handler to get more information about the error.
That is my Ajax request
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);
that is what i get on my browser:
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);
?>
Some Notes:
1. It is not giving this error all the time sometimes it works fine and bring the response correctly (I see the response and header information on the website and when I check network tab in the chrome console).
2. it does not matter if the type is GET OR POST it keeps giving me the same problem (I show this ajax example with GET type but I have also POST type requests in my website with the same problem).
3. I add the ini_set('display_errors',1);``ini_set('display_startup_errors',1);``error_reporting(-1);
to the start of the is_it_midnight.php
but no errors showed because i believe there is no syntax or any other php errors (because sometimes it works fine and correctly).
4. I check also the server error log but there is nothing related to this files or any other ajax file at all.
5. I tried to check if this is a timeout error but I did not get any timeout
from textStatus
it just alert error
.
UPDATE :
I checked apache log and I found something like this: [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
I need any useful help or clue to understand why do I get this error is there anything I did not try it to get more information about that error???
It is very possible that your host has done a recent update on their servers which causes the problem.
You should advice them to look at the memory consumption, and maybe try to increase Apache memory limit parameter: "RLimitMEM" to upper value, which is a common factor for this kind of error.
I don't know if this would help you, but i had the same issue a while ago, the only action i did was removing this from my jquery ajax functions
Here is some functions i made ("mostrar_alert_ui" is a modal alert windows function, same as "MostrarVentanaBoton" wich is a confirm alert function)
And just in case, double check the directions
Well, the "Premature end of script headers" is pretty common, and there's few possibilities. It indicate that PHP script has been stopped for some reason before sending any output. It's nothing to do with AJAX itself.
Possibilities:
1. Apache misconfiguration
Check your Apache configuration for any changes and revise PHP's module list (try to disable them one by one).
2. Resource limit
3. Third party extension
4. SuPHP crashing
5. File permissions
As you can see, there's few possibilities. You mentioned that it crashes only sometimes, so it may be something with resources or configuration. For example - if your server is under heavy load, Apache can reject your request and throw this generic "Premature end of script headers" error.
What have you tried already?
Have you checked the file permissions on the server? The webserver user must be able to read the file, you want to access. See also (https://stackoverflow.com/a/17626018/3972213)
Update: If you are using apache2 and have access to the configuration, you can get more information about each request by turning on the forensic log (http://httpd.apache.org/docs/2.2/mod/mod_log_forensic.html). Hope this helps.
If it's not happening every time the script runs, then my guess is:
First of all you must be sure that the error log mechanism it's well configured.
To do that add the following code or similar:
An other issue that I notice it's that your php script it's not returning 100% valid JSON and I also think that you can refactor the code to return the result without the necessity to create any variable (better performance, faster, lees code) avoiding any kind of memory allocations problems.
In some cases very loaded shared servers or unscalable VPS can experiment very low memory and can randomly generate errors when try to allocate memory for variables.
I don't know if you use some kind of Framework or not but a different way to write your script in pure php can be something like this:
This code will always return valid JSON format like
{"res":1}
or{"res":2}
and you can easily access this trough JS like thisres = data.res; console.log(res);
and you'll evaluate this like this:(data.res === 1)
.In your case, you are using
dataType: "json"
and this in almost all cases it's not woking well if your php it's not returning valid JSON. Maybe you consider to remove it, it's not very important here if you are not enferced to expect only valid JSON.You can give it a try and see what is happening. If the error persist you can see it inside the
/tmp/php-error.log
file. and comment it with your hosting company.As a parentheses, I would like to add that your script should return 1 or 0, true or false instead of 1 or 2. It's just a more pragmatic way to doit.
Let me know if my answer was helpful or if you can't fix the problem and I will try to help you.
Bye Bye! Suerte!