长拆分 php 脚本
long splited php script
由于超时问题,我在 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écution : 2 停在 2
试试你的 php 文件中的第一条指令,它将允许你更改请求的超时时间:
ini_set('max_execution_time', XX);
XX 秒。默认情况下,php 脚本在 30 秒后超时。您可以更改此值。设置为 0 表示没有限制,但警告不建议这样做。您可以将此值设置为0,然后计算您需要执行此脚本的时间量,然后将此值更改为您必须执行脚本的最大时间+10%
小心 while loops
,它可能会卡住。您的 while loops
中的问题。尝试更改此设置:$new_time - $start_time < $tempsExec
。我猜 $new_time - $start_time
永远不会大于 $tempsExec
.
所以,
我真的不明白你想用这个脚本做什么。
当我在我这边执行它时,我有:
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 和 $运行 = 1 ;但是你的函数不正确,它没有使用参数$start,所以它总是return 2 ($tempsExec value, defined in configuration part).
你应该查看原始脚本,我认为你删除了一些重要的东西,因为它可以正常工作。
由于超时问题,我在 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écution : 2 停在 2
试试你的 php 文件中的第一条指令,它将允许你更改请求的超时时间:
ini_set('max_execution_time', XX);
XX 秒。默认情况下,php 脚本在 30 秒后超时。您可以更改此值。设置为 0 表示没有限制,但警告不建议这样做。您可以将此值设置为0,然后计算您需要执行此脚本的时间量,然后将此值更改为您必须执行脚本的最大时间+10%
小心 while loops
,它可能会卡住。您的 while loops
中的问题。尝试更改此设置:$new_time - $start_time < $tempsExec
。我猜 $new_time - $start_time
永远不会大于 $tempsExec
.
所以, 我真的不明白你想用这个脚本做什么。 当我在我这边执行它时,我有:
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 和 $运行 = 1 ;但是你的函数不正确,它没有使用参数$start,所以它总是return 2 ($tempsExec value, defined in configuration part).
你应该查看原始脚本,我认为你删除了一些重要的东西,因为它可以正常工作。