У меня длинный скрипт в php из-за проблем с тайм-аутом: я пытаюсь разделить его и постоянно обновлять страницу (после выполнения любой задачи)
Я нашел сценарий в сети, позволяющий это.
Так что я экспериментирую с простой функцией цикла sleep (1)
<?php
// PRINCIPE :
// Le script est executé par tranches afin de ne pas surcharger
// le serveur.
// CONFIGURATION :
// Temps d'execution maximum d'une "tranche" en secondes
$tempsExecMax = 2;
// Temps d'attente entre chaque "tranche" en millisecondes
$tempsRepos = 100;
/* ----------------------------------------------------------
Placez dans cette fonction le script à executer
retour :
Retourne une valeur qui sera utilisée pour relancer le
script (valeur start lors de la prochaine execution de
la fonction).
Si cette valeur vaut -1, alors l'execution du
script est terminée.
start :
Valeur repérant la valeur renvoyée par l'execution
précédente de la fonction Script. Si cette valeur vaut 0,
alors il s'agit de la première execution de cette fonction.
Cette valeur n'est qu'un repère pour mémoriser
l'avancement de l'execution, elle n'est pas utilisée hors
de cette fonction. Elle peut donc représenter
n'importe quoi.
tempsExec :
Temps maximum d'execution de la fonction. Si la fonction
atteint cette limite, elle se termine et renvoie une
valeur de retour.
---------------------------------------------------------- */
function Script( $start, $tempsExec )
{
// Repère le temps d'execution de la fonction
list($usec, $sec) = explode(' ', microtime());
$start_time=(float)$usec + (float)$sec;
$new_time = $start_time;
$t = 1;
sleep(1);
while ($new_time - $start_time < $tempsExec)
{
sleep(1);
$t++;
list($usec, $sec) = explode(" ", microtime());
$new_time=(float)$usec + (float)$sec;
}
return $t;
// ----------------------------------------------------------
}
ob_start();
header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Script longue durée</title>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=iso-8859-1"/>
<meta http-equiv="CONTENT-LANGUAGE" content="FR"/>
<meta http-equiv="Cache-Control" content="no-cache/"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
</head>
<body style="font-family: Verdana; font-size: 12px">
<p style="font-size: 13px; font-weight: bold; margin-bottom: 30px">
Exécution d'un script de longue durée
par découpage et relancement automatique.
</p>
<div>
<p>
Avancement de l'exécution :
<?php
// On récupère l'avancement du script
$run = 0;
if (isset($_GET['run'])) $run = $_GET['run'];
$start = 0;
if (isset($_GET['start'])) $start = $_GET['start'];
// Affichage de l'avancement actuel
if ($run == 1)
{
echo $start;
}
else
{
echo 'Exécution non démarrée';
}
// Appel du script
$start = Script( $start, $tempsExecMax );
// Si exécution terminée
if (($run==1) and ($start == -1))
{
echo '<br><b>Exécution terminée</b>';
}
?>
</p>
<?php
// Si l'execution n'est pas démarrée ou est terminée
if (($run != 1) or ($start == -1))
{
// On propose de la démarrer
?>
<p style="font-weight: bold">
<a href="<?php echo $_SERVER["PHP_SELF"]; ?>?start=0&run=1"title="Lancer le script">
Démarrer l'exécution du script</a>
</p>
<?php
}
else
// Si l'execution est lancée, on la continue
{
// Si l'execution n'est pas terminée
if ($start > -1)
{
// Relancement du script
if ($tempsRepos != 0)
{
?>
<p>
Attente de
<?php echo $tempsRepos; ?> millisecondes
avant la reprise de l'execution.
</p>
<?php
}
echo ("<script language=\"JavaScript\"type=\"text/javascript\">window.setTimeout('location.href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\";',500+$tempsRepos);
</script>\n");
echo ("<noscript>\n");
echo ("<p><a href=\"".$_SERVER["PHP_SELF"]."?start=$start&run=1\">Cliquez ici pour continuer</a> (Activez JavaScript pour le faire automatiquement)</p>\n");
echo ("</noscript>\n");
echo ("<p><b><a href=\"".$_SERVER["PHP_SELF"]."\">Arrêter l'exécution du script</a></b></p>\n");
}
}
?>
</div>
<p style="font-size: 11px; margin-top: 50px; text-indent: 0px; text-align: center">
Par <a title="Mon site web" href="http://matthieu.napoli.free.fr/">
Matthieu Napoli<a/>
</p>
</body>
Но у меня проблема: Avancement de l’exétion: 2 останавливается на 2
Так,
Я не очень понимаю, что вы хотите сделать с этим сценарием.
Когда я выполняю это на моей стороне, у меня есть:
Avancement de l'exécution : 0
Затем это перезагрузить, и:
Avancement de l'exécution : 2
Затем это перезагрузить, и:
Avancement de l'exécution : 2
снова. И это значение останется равным 2, пока я не остановлю скрипт.
Итак, если вы хотите, чтобы скрипт автоматически останавливался, вы должны увеличить или уменьшить его значение $ start.
Когда вы впервые нажимаете на Démarrer l'exécution du script
, $ start = 0 и $ run = 1; но ваша функция неверна, параметр $ start для него не используется, поэтому он всегда будет возвращать 2 (значение $ tempsExec, определенное в части конфигурации).
Вы должны просмотреть оригинальный скрипт, я думаю, что вы удалили что-то важное, потому что он работает правильно.
Попробуйте эту первую инструкцию в вашем php-файле, которая позволит вам изменить время ожидания запроса:
ini_set('max_execution_time', XX);
С ХХ в секундах. По умолчанию PHP-скрипт отключен через 30 секунд. Вы можете изменить это значение. Установите на 0 без ограничений, но ВНИМАНИЕ это не рекомендуется. Вы можете установить это значение равным 0, затем рассчитать количество времени, необходимое для выполнения этого сценария, а затем изменить это значение на максимальное время, в течение которого вы должны выполнить сценарий + 10%.
Будьте осторожны с while loops
, это может застрять. Проблема в вашем while loops
, Попробуйте изменить это: $new_time - $start_time < $tempsExec
, Похоже $new_time - $start_time
никогда не будет больше чем $tempsExec
,