2015-12-07 67 views
1

我有一個PHP腳本長,由於超時問題:我試圖分裂並不斷刷新頁面(任何任務完成後)長splited PHP腳本

我發現了一個腳本,在網上允許。 所以我用簡單的循環功能休眠(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> 

expermenting它但我發現了一個問題:Avancement DE L'EXA©cution:2輛停在2

+2

在'while'循環中,您在'$ t ++'後面缺少';' – acupajoe

+0

感謝您的注意請參閱編輯我有另一個問題 – AK47

回答

0

所以, 我真的不明白你想用這個腳本做什麼。 當我執行它在我身邊,我有:

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值,在配置部分定義)。

你應該檢查原始腳本,我認爲你刪除了一些重要的東西,它正常工作。

+0

我安排了腳本 – AK47

0

試試這個在你的PHP文件中第一個指令,將允許您更改請求超時時間:

ini_set('max_execution_time', XX); 

隨着XX單位爲秒。默認情況下,30秒後php腳本超時。你可以改變這個值。無限制設置爲0,但警告不建議。您可以將此值設置爲0,然後計算您需要執行此腳本的時間量,然後將此值更改爲您必須執行腳本的最長時間+ 10%

+0

我的腳本用於清理巨型數據庫,它需要大約1或2小時,所以我會用它作爲cron作業,但不幸的是,改變所有的超時參數並不能解決我的問題,因爲服務器的限制,我在hostgator的寶貝計劃,這就是爲什麼我正在試驗這個腳本來使用它。 – AK47

+0

PHP可能不適合清理非常大的數據庫。您應該嘗試查看您的DBMS以獲取適當的解決方案。我會在後面發佈你的具體請求的另一個答案 –

+0

謝謝請不要忘記,我會很樂意等待你的回覆 – AK47

0

請注意while loops,它可能會卡住。這個問題在你的while loops。試着改變這個:$new_time - $start_time < $tempsExec。我猜$new_time - $start_time永遠不會比$tempsExec大。

+0

我增加了$ tempsExec到29秒 – AK47

+0

我希望這會有所幫助(添加$ t條件): while((($ new_time - $ start_time)<$ tempsExec)|| $ t <50)'。這將做50個循環,然後將停止循環 –

+0

是的謝謝,但實際上,當我使用另一個腳本時,我注意到它在不改變參數的情況下每個馴服都做同樣的循環,例如sleep($ t); $ T ++; – AK47