все из приведенных ниже основано на Linux, недавнем Apache, недавнем модуле PHP для Apache.
Я испытываю неожиданное поведение для моего веб-приложения на основе AJAX + PHP. Это довольно простой подход AJAX, в основном связанный с запросом на PHP-скрипт (execute.php), который выполняется некоторое время (от нескольких секунд до нескольких минут). Как тестовая настройка, PHP-скрипт (execute.php) в основном просто спит в течение определенного времени. Когда это количество составляет 899 секунд, оно работает, но когда я устанавливаю его на 900, ответ PHP-скрипта (простой echo ()), кажется, истекает или что-то вроде этого (что именно причина или причина на самом деле неизвестны me), поскольку запрос не обращает на это внимания и, таким образом, не отвечает, и соответствующий innerHTML не обновляется, как ожидалось. Пожалуйста, найдите код ниже.
Теперь мне интересно, откуда этот «тайм-аут» в 900 секунд, и что еще важнее, как я могу предотвратить это? В конце концов, я думал, что это была, по крайней мере, одна общая идея AJAX обрабатывать асинхронные вызовы и уведомлять клиента, как только запрос изменил свое состояние ?!
process.php
<?php session_start(); include("functions.php"); include("env.php"); html_head("Processing..."); $sid = $_SESSION['my_sid']; ?> <script type="text/javascript"> function run_analyses(params){ <?php print "var sid = \"". $sid ."\"; "; ?> // Use AJAX to execute the programs independenantly in the background // Allows for the user to close the process-page and come back at a later point to the results-link, w/o need to wait. if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); } else { //Fallback for IE5 and IE6, as these don't support the above writing/code http_request = new ActiveXObject("Microsoft.XMLHTTP"); } //Is http_request still false if (!http_request) { alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen'); } http_request.onreadystatechange=function(){ if (http_request.readyState==4 && http_request.status==200){ // Maybe used to display the progress of the execution document.getElementById("output").innerHTML=http_request.responseText; } }; http_request.open("POST","execute.php",true); //Send the proper header information along with the request http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http_request.setRequestHeader("Content-length", params.length); http_request.setRequestHeader("Connection", "close"); http_request.send(params); }; </script> <?php $params "some_params"; print " Starting AJAX-call<br> <div style=\"width:400px; border: 1px black solid;\" id=\"output\">Use this to display an information about the progress</div> <script type=\"text/javascript\"> run_analyses('".$params."'); </script> <form action=\"./usersets/". $sid ."/results.html\" id=\"go_to_results\" method=\"POST\"> <input type='hidden' name=\"session_id\" value=\"" .$sid. "\"> </form> "; html_foot(); ?>
и execute.php:
<?php session_start(); include("functions.php"); include("env.php"); $sid = $_SESSION['my_sid']; // Used to get the time at start of processing $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $start = $time; session_write_close(); sleep(900); //899 here works session_start(); $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $finish = $time; $total_time = round(($finish - $start), 3); //echo 'Page generated in '.$total_time.' seconds.'."\n"; // Make it accessible for the results $_SESSION['process_time'] = $total_time; echo("none"); ?>
в<?php session_start(); include("functions.php"); include("env.php"); $sid = $_SESSION['my_sid']; // Used to get the time at start of processing $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $start = $time; session_write_close(); sleep(900); //899 here works session_start(); $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $finish = $time; $total_time = round(($finish - $start), 3); //echo 'Page generated in '.$total_time.' seconds.'."\n"; // Make it accessible for the results $_SESSION['process_time'] = $total_time; echo("none"); ?>
в<?php session_start(); include("functions.php"); include("env.php"); $sid = $_SESSION['my_sid']; // Used to get the time at start of processing $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $start = $time; session_write_close(); sleep(900); //899 here works session_start(); $time = microtime(); $time = explode(' ', $time); $time = $time[1] + $time[0]; $finish = $time; $total_time = round(($finish - $start), 3); //echo 'Page generated in '.$total_time.' seconds.'."\n"; // Make it accessible for the results $_SESSION['process_time'] = $total_time; echo("none"); ?>
Таким образом, текст после «Запуск вызова AJAX» обновляется до «none», когда PHP-скрипт спит в течение 899 секунд, но остается «Использовать это, чтобы отображать информацию о ходе», если это значение составляет 900 секунд.
Я с нетерпением жду ваших предложений.
Лучший,
Тень
РЕДАКТИРОВАТЬ
Выполнение grep max_execution $(locate php.ini )
дает:
/etc/php5/apache2/php.ini:max_execution_time = 30 /usr/share/doc/php5-common/examples/php.ini-development:max_execution_time = 30 /usr/share/doc/php5-common/examples/php.ini-production:max_execution_time = 30 /usr/share/php5/php.ini-production:max_execution_time = 30 /usr/share/php5/php.ini-production-dist:max_execution_time = 30 /usr/share/php5/php.ini-production.cli:max_execution_time = 30
EDIT2 При вызове скриптов локально (веб-сервер apache, запущенный на моей локальной машине Linux) в моем браузере интересно, что он ведет себя так, как ожидалось, и уважает возвращение запроса. Но это проявляет неожиданное поведение при запуске на веб-сервере, запущенном на другой машине. Какие-нибудь подсказки? Потому что у меня их нет … Извините.
В вашем php.ini есть max_execution_time
, значение по умолчанию – 30 секунд, поэтому кажется, что где-то он был установлен в 900. Поэтому я сначала проверю его. Информация: http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time
Что касается его решения, вы можете отредактировать php.ini, чтобы установить это значение действительно высоким (или 0 для неограниченного числа), или, альтернативно, вы можете использовать эту функцию: http://php.net/manual/en/function. set-time-limit.php, чтобы сбросить его после 300 секунд.
Надеюсь это поможет!
Изменить: добавлено предложение Ли о 0 значение max_execution_time
Изменить 2:
Просто нашел что-то интересное здесь http://www.php.net/manual/en/function.set-time-limit.php#75557
Обратите внимание, что в Linux время сна игнорируется, но под Windows оно считается временем выполнения.
Таким образом, это может быть причиной того, что его разрешено выполнять дольше 30 секунд, но в конечном итоге все же разрезает его.
Я попробовал ваш пример и поместил его на другой хост (а не на localhost). В моем случае он прошел нормально и получил значение «none» после 900 секунд. Я удалил вызовы SESSION, чтобы упростить пример …
Попробуйте это без сеанса. Если это что-то изменит, возможно, значение «session.cookie_lifetime» может быть связано.
Найдите значение 900 во всех ваших php.ini
и .htaccess
:
grep -HR 900 $(locate php.ini ) $(locate -e .htaccess )
также ищите 900 и доли 900 в исходном коде:
cd /var/www/ #path_to_yoursite grep --color=auto -HR "=\s*900\b" grep --color=auto -HR "=\s*20\s*\*\s*45\b" grep --color=auto -HR "=\s*15\s*\*\s*60\b" ...