所以我一直在尝试编写这段小代码来读取文件(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);
}
}
?>
答案 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。