For anyone interested in the answer to this problem, here's what I found out.
I ran the script through truss and looked at what was happening. It seems that when trying to use fopen("php://stdin", "r") or fopen("/dev/fd/0", "r"), that as it's reading from the file with fgets(), it does an lseek (or llseek) _to the current location_ after each read. It seems a bit strange that it would try to lseek to the current location, especially since I didn't open it "r+" or "w+", but anyway ... Since php://stdin and /dev/fd/0 are _interactive_, the man page in Solaris says that it uses non-buffered I/O -- i.e., you can't lseek/fseek it; it will return ESPIPE. However, calling popen("cat /dev/fd/0", "r") _does_ use buffered I/O, so it is possible to lseek/fseek on this file descriptor that is opened. I don't know what other OS'es do, but that's Solaris' way of handling piped data. Would it be possible for someone to look into or offer an explanation for why the code for fgets() does an lseek() after each read? Thanks. -bsh Billy S Halsey wrote: > Hi all, > > I still have been completely unable to get this to work like it > should. I have a simple script: > > #!/usr/local/bin/php -q > <?php > $fp = fopen("php://stdin", "r"); > while (($buf = fgets($fp, 512)) != false) { > $input .= $buf; > } > echo "$input"; > ?> > > So if I call this echo.php, then if I try something like > > cat /etc/hosts | ./echo.php > > It prints a # (first line of /etc/hosts) followed by two blank lines. > Then it quits. /etc/hosts does contain real data. This occurs with ANY > file that I try to cat. > > If you know what the problem might be, I would LOVE to hear your > suggestions. I didn't get any replies the first time I asked, so I'm > hoping that someone has something to contribute. > > I'm using PHP 4.1.1 on Solaris 8. > > Thanks in advance, > > -bsh > > Billy S Halsey wrote: > >> Hi all, >> >> I've been trying for the last three hours to do something like this: >> >> #!/usr/local/bin/php -q >> <?php >> $fp = fopen("php://stdin", "r"); >> while (!feof($fp)) { >> $line = fgets($fp, 4096); >> print $line; >> } >> fclose($fp); >> ?> >> >> And then calling it with something like: >> >> cat foo.txt | ./echofile.php >> >> The problem is, it will print the first line of foo.txt, and then >> exit. No matter what I do, I can't get it to read the next line. I've >> even added a test after the print command to see if it's at EOF, and >> it's not. I've also changed it to do this: >> >> while (($buf = fgets($fp, 4096)) != FALSE) { >> print $buf; >> } >> >> Still won't read more than one line of the file. The only thing I've >> been able to do that seems to work is this: >> >> $fp = fopen("/dev/fd/0", "r"); >> while (!feof($fp)) ...... >> >> [The code snippets I've quoted above are just rough sketches ... I >> really am checking the return value from fopen() to make sure I open >> the file, etc.] >> >> I'm using PHP 4.1.1 on Solaris 8. Can somebody PLEASE tell me what >> the problem is? What stupid mistake am I making? >> >> Thanks. >> >> -bsh :-) >> > -- ======================================================================= Billy S Halsey Software Problem Resolution Phone x55403/(858) 526-9403 ESP Solaris Software Email [EMAIL PROTECTED] Sun Microsystems, Inc -NO DAY BUT TODAY- ======================================================================= -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php