长拆分 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&amp;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).

你应该查看原始脚本,我认为你删除了一些重要的东西,因为它可以正常工作。