2013-03-25 130 views
2

我是新來的PHP,我想控制一個PHP while循環腳本,使用按鈕(開始/停止),開始按鈕使一個AJAX調用start.php腳本定義$_SESSION['loop'] = TRUE並執行循環,停止按鈕進行ajax調用stop.php腳本,只是將$_SESSION['loop']更改爲FALSE改變SESSION變量停止「while循環」

下面是到目前爲止我的代碼,但是當我打的停止按鈕我就報警(成功停止)只有while循環結束循環,這意味着循環並沒有打破,因爲我是假設之後。

我認爲這是在循環執行時被鎖定的會話。如果是這樣,如何更改$_SESSION['loop']值並使循環讀取該值每個時間?

的index.php

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     $('#start').click(function(){ 
      $.ajax({ 
       url: "start.php" 
      }); 
     }); 

     $('#stop').click(function(){ 
      $.ajax({ 
       url: "stop.php", 
       success: function(){ 
        alert('success stop'); 
       }, 
       error: function(){ 
        alert('failure stop'); 
       } 
      }); 
     }); 
    }); 
</script> 

<button id="start">Start</button> 
<button id="stop">Stop</button> 

start.php

<?php 
    session_start(); 
    $_SESSION['loop'] = TRUE; 

    ini_set('max_execution_time', 300); 
    $i = 0; 
    while($i < 100) { 

     if ($_SESSION['loop'] == TRUE) { 

      //query to save some variables 

      // Pause 10s after saving 2 
      if ($i != 0 && $i%2 == 0) { 
       sleep(10); 
      } 

      $i++; 

     } else { 
      break; 
     } 
    } 
?> 

stop.php

<?php 
    session_start(); 

    if(isset($_SESSION['loop'])) { 
     $_SESSION['loop'] = FALSE; 
    } 
?> 
+1

是的,你的循環在完成之後不會停止,或者直到PHP執行時間結束,並且新的SESSION值在進程中間也不可用於頁面......因此,你不能類似 – 2013-03-25 13:23:48

+0

@Akam,有關如何實現這一目標的任何建議? – thesubroot 2013-03-25 13:30:00

+1

改爲使用數據庫存儲系統,並在循環內不斷重新檢查。 IE每個'if($ _ SESSION ['loop'] ..'應該是一個sql select查詢和'$ _SESSION ['loop'] = ..'應該是一個sql更新查詢 – Waygood 2013-03-25 13:34:15

回答

1

你的啓動和停止操作的在兩個不同的會話中,所以在一個會話中更改$ SESSION對另一個沒有任何影響。

+0

我可以使用類似cookies的東西來訪問同樣的會話,所以我可以改變它的變量? – thesubroot 2013-03-25 13:31:25

+2

Cookies存在於瀏覽器中,並在加載頁面時交換,因此您的循環將永遠不會看到任何更改。 – grahamj42 2013-03-25 13:34:04

+0

@ grahamj42:你怎麼知道他們在兩個不同的會話? – svirk 2013-03-25 13:51:40

0

我想,你應該使用多線程做這樣的事情。

0

請花一些時間來閱讀:

「會話數據通常會經過腳本終止,而無需調用session_write_close()存儲,但作爲會話數據被鎖定,以防止併發只寫一個腳本可以運行隨時參加一個會議。「

http://php.net/manual/en/function.session-write-close.php

因此,似乎$ _SESSION [ '循環']在結束寫入會話文件。

如果要顯式將數據寫入會話文件,請在$ _SESSION ['loop'] = TRUE後添加session_write_close。請注意,如果您需要在同一個腳本中再次讀/寫一些會話數據,則需要啓動會話,然後讀取/寫入數據。