2013-05-21 3 views
1

Я пытаюсь захватить прямые каналы из устройства для чтения карт и распечатать его с помощью PHP.Браузер заканчивает бесконечные петли PHP, а затем печатает данные

<?php 
    $i=0; 
    for(;;) 
    { 
     $subdata=file_get_contents("/home/openflow/subscribedata.txt"); 
     $subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt"); 

     if($subdata!=$subdata2) 
     { 
      copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt"); 
      $sub=file_get_contents("/home/openflow/subscribedata.txt"); 
      $i++; 
      echo "\n". $i."--".$sub; 
     } 
    } 
?> 

Я использую цикл for как бесконечный цикл. Всякий раз, когда есть новые данные, мой читатель карточки скрипт записывает в subscribedatatemp.txt файл и выше скрипт проверяет разницу между subscribedatatemp.txt (последний вход) и subscribedata.txt (предыдущая запись) , Если есть разница, он должен скопировать последнее на предыдущее и повторить последние данные.

Проблема заключается в том, что я выполняю вышеприведенный PHP-код, он ничего не показывает на какое-то время, а когда-то браузер перестает загружаться и отображает все данные, которые он получил во время загрузки.

Это означает, что выполнение цикла прекращается, и все данные печатаются после окончания цикла while, правильно? Как я могу это исправить?

+0

Ваш сценарий, вероятно, таймаут, попробуйте добавить 'set_time_limit (0)' в начало – doublesharp

+0

где я должен добавить это? Я новичок в php и не знаю, где добавить строку. не могли бы вы рассказать мне, где его добавить? –

+1

''. Также вы должны избегать запуска «жестких» циклов, которые не дают другим процессам возможности получить некоторое время процессора.Представьте 'sleep (50)' или 'sleep (100)' перед концом цикла for. –

ответ

0

В верхней части кода, добавьте следующую строку:

set_time_limit(0); 

Так весь ваш код выглядит следующим образом:

<?php 
set_time_limit(0); 
$i=0; 
for(;;) 
{ 
$subdata=file_get_contents("/home/openflow/subscribedata.txt"); 
$subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt"); 

if($subdata!=$subdata2) 
{ 
copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt"); 
$sub=file_get_contents("/home/openflow/subscribedata.txt"); 
$i++; 
echo "\n". $i."--".$sub; 
} 
} 
?> 

Подробнее о set_time_limit()here.

Также проверьте, не установлен ли max_execution_time в вашем файле php.ini.

+0

Я пробовал одно и то же, и данные не будут отображаться до тех пор, пока выполнение не закончится. Не так ли? Всякий раз, когда есть чендж, должно быть эхо. @imulsion –

+1

Убедитесь, что вы отключили буферизацию вывода (ini setting 'output_buffering') - см. Больше http://php.net/manual/en/book. outcontrol.php – Tharsan

0

Используйте set_time_limit(), чтобы предотвратить синхронизацию вашего сценария путем передачи в 0 в начале скрипта, чтобы сделать его бесконечным.

Вы также хотите добавить sleep() в свой цикл, чтобы он не потреблял все ваши циклы процессора.

Наконец, вам нужно добавить flush() в конце каждого цикла, чтобы освободить буфер и отправить его клиенту.

<?php 
// set an infinite timeout 
set_time_limit(0); 
// create an infinite loop 
while (true) { 
    // do your logic here 
    $subdata=file_get_contents("/home/openflow/subscribedata.txt"); 
    $subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt"); 
    // .... etc. 

    // flush buffer to the client 
    flush(); 

    // go to sleep to give the CPU a break 
    sleep(100); 
} 
?> 
0

Если я правильно понять вас, вы пытаетесь отобразить вывод после каждого цикла (вместо ожидания всего сценария до конца), так что эхо (flush) каждый цикл, вам нужно для добавления flush() в конце цикла.

Также мы добавим set_time_limit(0) перед циклом, поэтому наш сценарий занимает время для выполнения.

<?php 
set_time_limit(0); 
ob_end_flush(); 


$i=0; 
for(;;) 
{ 
$subdata=file_get_contents("/home/openflow/subscribedata.txt"); 
$subdata2=file_get_contents("/home/openflow/subscribedatatemp.txt"); 

if($subdata!=$subdata2) 
{ 
copy("/home/openflow/subscribedatatemp.txt","/home/openflow/subscribedata.txt"); 
$sub=file_get_contents("/home/openflow/subscribedata.txt"); 
$i++; 
echo "\n". $i."--".$sub; 
/*flush()*/ 
} 

} 
ob_start(); 
?> 
+0

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

+0

@KiranVemuri Я редактировал свой код. Посмотрите, работает ли это. – Abdulaziz

+0

Я получаю тот же пустой экран снова через некоторое время: | –

0

использование flush и sleep функции в конце вашего цикла ...

, но было бы лучше использовать AJAX вызов для этого ..

Смежные вопросы