From: "Dennis J." on
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
From: Ashley Sheridan on
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?

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.

Thanks,
Ash
http://www.ashleysheridan.co.uk


From: "Dennis J." on
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.

Regards,
Dennis
From: Eric Lee on
On Thu, Feb 4, 2010 at 9:20 AM, Dennis J. <dennisml(a)conversis.de> 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
>
>
From: "Dennis J." on
On 02/04/2010 06:18 AM, Eric Lee wrote:
> On Thu, Feb 4, 2010 at 9:20 AM, Dennis J.<dennisml(a)conversis.de> 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;
> }
> }

This script terminates before it hits the actual problem.
The issue is that once I've hit the EOF I need to continue the loop using
the stream_select() waiting for new data.

Regards,
Dennis