文件读取,搜索和循环问题

时间:2010-06-24 20:05:01

标签: php file

所以我一直在尝试编写这段小代码来读取文件(status.txt),搜索4个关键字中的1个并循环,直到任何一个时间用完(5分钟)或者找到其中一个话。我已经编写了一些简单的PHP脚本来将这些单词写入txt文件,但我似乎无法使这部分工作。它要么不在开头清除文件,要么挂起并且永远不会接收更改。任何建议都会非常有用。

    <?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 个答案:

答案 0 :(得分:1)

您应该在读取循环之前打开文件,并在循环之后将其关闭。如:

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

另外,如果您在阅读之前清除文件,那么每次都不会为空吗?

答案 1 :(得分:0)

您没有包含在while循环中删除文件的代码,因此它只清除文件一次。另外,我使用unlink($statusFile);删除文件。

答案 2 :(得分:0)

你应该使用循环。对于您的问题 - 您清除文件,然后从中获取数据。尝试转储此$data,您最终会得到string(0) ""。首先,保存数据,然后清除文件。

编辑:如果您正在另一个线程中更改循环中的文件,则还有另一个问题。你应该照顾解剖文件流。例如,您可以使用Nette SafeStream类。

答案 3 :(得分:0)

嗯,首先,你不需要以这种方式“清除”文件...... fopen中的“w”选项已经为你做了。 另外,我不会尝试一次读取整个文件,因为如果它非常大,那么如果没有大量的内存使用,这将无法工作。

您应该做的是按顺序读取文件,这意味着您始终读取固定数量的字节并查找关键字。为了避免丢失由您的阅读机制减半的关键字,您可以使您的读取覆盖一点(最长关键字-1的长度),以解决该问题。 然后你应该修改你的while循环,这样它也会检查你是否在文件的末尾(while(!feof($ fh)))。

PS:已经提到您在阅读之前清除文件。我的理解是你的文件很快得到很多输入,所以当你重新打开它时你会期望它再次有内容。如果不是这样,你真的需要重新考虑你的逻辑;)

PPS:您不需要通过将计数器变量递增到您定义的边界来中止while循环。您也可以使用break-keyword。