|
ftell
Tells file pointer read/write position
(PHP 4, PHP 5)
Example 650. ftell() example<?php Code Examples / Notes » ftellphp
When trying to determine whether or not something was piped into a command line script, it is not smart to do a fgets(STDIN), because it will wait indefenitely if nothing is piped. Instead, I found ftell on STDIN to be very handy: it will return an integer of zero when something was piped, and nothing if nothing was piped to the script. #!/usr/bin/php4 -q <? #following will hang if nothing is piped: #$sometext = fgets(STDIN, 256) $tell = ftell(STDIN); if (is_integer($tell)==true) {echo "Something was piped: ".fread(STDIN,256)."\n";} else {echo "Nothing was piped\n";} ?> missilesilo
In response to php at michielvleugel dot com: This does not seem to be the case with PHP 5.2.0 and FreeBSD 5.4. #!/usr/local/bin/php <?php $tell = ftell(STDIN); var_dump($tell); ?> root@localhost:/home/david# echo Hello World | ./test.php int(0) root@localhost:/home/david# ./test.php int(6629927) When something is piped to the script, it returns an integer value of 0, however, it also returns an integer when nothing is piped to the script. The code should be modified to this: #!/usr/local/bin/php <?php $tell = ftell(STDIN); if ($tell === 0) echo "Something was piped: " . fread(STDIN,256) . "\n"; else echo "Nothing was piped\n"; ?> And the result is: root@localhost:/home/david# echo Hello World | ./test.php Something was piped: Hello World root@localhost:/home/david# ./test.php Nothing was piped mbirth
Attention! If you open a file with the "text"-modifier (e.g. 'rt') and the file contains \r\n as line-endings, ftell() returns the position as if there were only \n as line-endings. Example: If the first line only contains 1 char followed by \r\n, the start of the second line should be position 3. (1char + \r + \n = 3 bytes) But ftell() will return 2 - ignoring one byte. If you call ftell() in line 3, the value will differ from the real value by 2 bytes. The error gets greater with every line. (Watched this behavior in PHP 5.0.4 for Windows.) BUT: fseek() works as expected - using the true byte values. mweierophinney
Actually, ftell() gives more than an undefined result for append only streams; it gives the offset from the end of the file as defined before any data was appended. So if you open a file that had 3017 characters, and append 41 characters, and then execute ftell(), the value returned will be 41.
|
Change Languagebasename chgrp chmod chown clearstatcache copy delete dirname disk_free_space disk_total_space diskfreespace fclose feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents file fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype flock fnmatch fopen fpassthru fputcsv fputs fread fscanf fseek fstat ftell ftruncate fwrite glob is_dir is_executable is_file is_link is_readable is_uploaded_file is_writable is_writeable lchgrp lchown link linkinfo lstat mkdir move_uploaded_file parse_ini_file pathinfo pclose popen readfile readlink realpath rename rewind rmdir set_file_buffer stat symlink tempnam tmpfile touch umask unlink |