On Thu, Feb 4, 2010 at 9:20 AM, Dennis J. <dennisml@xxxxxxxxxxxx> wrote: > On 02/04/2010 02:03 AM, Ashley Sheridan wrote: > >> On Thu, 2010-02-04 at 01:41 +0100, Dennis J. wrote: >> >>> Hi, >>> I'm trying to implement something similar to"tail -f" in php but I'm >>> running into a problem. >>> The issue occurs when I've reached the end of the file. From here I >>> basically have to loop until new lines get appended to the file but I >>> would >>> like to respond immediately when then happens. There are three options >>> that >>> I can see: >>> >>> 1. Busy-loop >>> pro: I can process new lines immediately >>> contra: Excessivley CPU intensive => not a real option >>> >>> 2. add a sleep(1) to the loop >>> pro: No longer kills the CPU >>> contra: I might get a 1 second delay until I can process new lines >>> >>> 3. stream_select(array($fh),null,null,1) >>> pro: sleeps for one second but returns earlier if new data arrives >>> contra: doesn't seem to work in files? >>> >>> Method 3 is the preferable one but doesn't seem to work: >>> >>> $fh = fopen("testfile","r"); >>> $r = array($fh); >>> while( ($n = stream_select($r,$w=null,$e=null,1)) == 1 ) { >>> echo fgets($fh); >>> } >>> >>> This program will loop forever because stream_select() will always return >>> 1 >>> even at the end of the file. >>> >>> Is there any other way to accomplish this? >>> >>> Regards, >>> Dennis >>> >>> >> I thought that once it reached the end of the file, it will return a 0 >> indicating no new activity? >> > > That's what I thought too but apparently that is not the case. > > > Although, surely you want the loop to continue forever, so that new >> entries added to the end of the file are shown as soon as they appear. >> > > Yes the loop is supposed to continue forever in the final version. In fact > I what I'm trying to get at is a "tail -F" which means I will repeatedly > reopen the file to check if it has been replaced by a new one. I just > simplified the problem above to get rid of all the additional complexity and > concentrate on the specific problem I have. > > My expectation was that once the end of the file is reached (i.e. fgets() > has consumed all lines) stream_select() should wait for 1 second (in the > above example) and if nothing happens with the file in that second it should > return 0. But that doesn't happen. > > > Dennis I have just been bulit a simple test script. It works for me with a feof call if the stream was at end of file. But I'am not sure that is that what you want ! <?php $fp = fopen('test.xml', 'r'); $arr = array($fp); $w = $e = null; while (($result = stream_select($arr, $w, $e, 1)) !== false) { $line = fgets($fp); if (!empty($line)) { echo $line; } else { if (feof($fp)) echo 'eof',"\n"; fclose($fp); $fp = null; break; } } Regards, Eric, > Regards, > Dennis > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > >