2013-03-25 2 views
2

Я новичок в php, и я хочу управлять скриптом php while loop, используя кнопки (start/stop), кнопка запуска делает ajax-вызов для start.php сценарий, который определяет $_SESSION['loop'] = TRUE и выполняет цикл, кнопка остановки делает вызов ajax для сценария stop.php, который просто меняет $_SESSION['loop'] на FALSE.Изменить переменную SESSION для остановки «while loop»

Ниже приведен мой код, но когда я нажал кнопку остановки, я стал предупреждением (успешная остановка) только после цикла петли цикла, означающего, что цикл не сломался, как я предполагал.

Я думаю, что это что-то с сеансом, который заблокирован во время выполнения цикла. Если да, то как изменить значение $_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

+1

Вместо этого используйте систему хранения базы данных и продолжайте повторную проверку внутри цикла. IE каждый 'if ($ _ SESSION ['loop'] ..' должен быть запросом выбора sql и '$ _SESSION ['loop'] = ..' должен быть запросом обновления sql – Waygood

ответ

1

Ваш запуск и остановка операций в re в двух разных сеансах, поэтому изменение SESSION в одном не имеет значения для другого.

+0

Могу ли я использовать что-то вроде файлов cookie для доступа к что я могу изменить свою переменную? – thesubroot

+2

Cookies живут в браузере и обмениваются при загрузке страницы, поэтому ваш цикл никогда не увидит никаких изменений. – grahamj42

+0

@ grahamj42: Откуда вы знаете, что они находятся в двух разных сеансах? – svirk

0

Думаю, вы должны использовать многопоточность для таких действий.

0

Пожалуйста, потратьте немного времени, чтобы прочитать его:

«Данные сеанса обычно хранятся после вашего скрипта завершается без необходимости вызова session_write_close(), но, как данные сеанса заблокирован для предотвращения одновременных операций записи только один скрипт может работать на сеансе в любое время ».

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

Таким образом, оказывается, что $ _SESSION [ 'петля'] записывается в файл сессии в конце.

Если вы хотите явно записать данные в файл сеанса, добавьте session_write_close после $ _SESSION ['loop'] = TRUE. Обратите внимание: если вам нужно снова прочитать/записать некоторые данные сеанса в том же скрипте, вам необходимо запустить сеанс, а затем прочитать/записать данные.