Проблемы с чтением, поиском и зацикливанием файлов - PullRequest
0 голосов
/ 25 июня 2010

Итак, я пытался написать этот маленький кусочек кода, чтобы прочитать файл (status.txt), найти его по 1 из 4 ключевых слов и выполнить цикл до тех пор, пока не истечет время (5 минут) или он не найдет одно изслова.Я уже написал несколько простых сценариев php для записи слов в текстовый файл, но я не могу заставить эту часть работать.Он либо не очищает файл в начале, либо кажется зависшим и никогда не фиксирует изменения.Любой совет был бы чрезвычайно полезен.

    <?php

    //Variables
    $stringG = "green";
    $stringR = "red";
    $stringB = "blue";
    $stringO = "orange";
    $clear = "";
    $statusFile = "status.txt";

    //erase file
    $fh = fopen($statusFile, 'w');  //clear the file with "clear"
    fwrite($fh, $clear);
    fclose($fh);

    //Insert LOOP
    $counter = 0;
    while ( $counter <= 10 ) {
    //echo "loop begun";

    // Read THE FILE
    $fh = fopen($statusFile, 'r');
    $data = fread($fh, filesize($statusFile));
    fclose($fh);


    //process the file
    if(stristr($data,$stringG)) {
    echo "Green!";                  
    $counter = $counter + 30; //stop if triggered
    } 
    elseif (stristr($data,$stringR)) {
    echo "Red";                 
    $counter = $counter + 30;  //stop if triggered
    }
    elseif (stristr($data,$stringB)) {
    echo "Blue";  
    $counter = $counter + 30;  //stop if triggered
    }
    elseif (stristr($data,$stringO)) {
    echo "Orange";  
    $counter = $counter + 30;  //stop if triggered
    }
    else {
    //increment loop counter
    $counter = $counter + 1;
    //Insert pause
    sleep(10);
    }   
    }

?>

Ответы [ 4 ]

1 голос
/ 25 июня 2010

Вам следует открыть файл перед циклом чтения и закрыть его после цикла. Как в:

open the file
loop through the lines in the file
close the file

Кроме того, если вы очистите файл перед прочтением, не будет ли он каждый раз пустым?

0 голосов
/ 25 июня 2010

Ну, во-первых, вам не нужно "очищать" файл таким образом ... Опция "w" в fopen уже сделает это за вас.Кроме того, я бы не стал читать весь файл сразу, потому что, если он очень большой, он не будет работать без интенсивного использования памяти.

Что вам нужно сделать, это прочитать файл последовательно, что означаетВы всегда читаете фиксированное количество байтов и ищете ключевые слова.Чтобы избежать потери ключевых слов, которые сокращаются пополам вашим механизмом чтения, вы можете сделать так, чтобы ваши чтения немного перекрывались (длина самого длинного ключевого слова-1), чтобы решить эту проблему.Затем вам следует изменить цикл while, чтобы он также проверял, находитесь ли вы в конце файла (while (! Feof ($ fh))).

PS: уже упоминалось, что вы очищаете свой файлпрежде чем читать это.Что я понял, так это то, что ваш файл очень быстро получает много информации, поэтому вы ожидаете, что у него уже будет содержание, когда вы снова откроете его.Если это не так, вам действительно нужно переосмыслить свою логику;)

PPS: вам не нужно прерывать цикл while, увеличивая переменную-счетчик за пределы определенных вами границ.Вы также можете использовать ключевое слово break.

0 голосов
/ 25 июня 2010

Вы должны скорее использовать для цикла.И к вашей проблеме - вы очищаете файл, а затем получаете данные из него.Попробуйте сбросить этот $data, вы обязательно получите string(0) "".Сначала сохраните данные, затем очистите файл.

Редактировать: Если вы изменяете файл в самом цикле в другом потоке, возникает другая проблема.Вы должны следить за анатомическим потоком файлов.Например, вы можете использовать Nette SafeStream class.

0 голосов
/ 25 июня 2010

Вы не включили код, который удаляет файл в цикле while, поэтому он очищает файл только один раз. Кроме того, я бы использовал unlink($statusFile); для удаления файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...