This note applies to PHP 5.1.6 under Windows (although may apply to other versions).
It appears that the 'FILE_IGNORE_NEW_LINES' flag doesn't remove newlines properly when reading Windows-style text files, i.e. files whose lines end in '\r\n'.
Solution: Always use 'rtrim()' in preference to 'FILE_IGNORE_NEW_LINES'.
file
(PHP 4, PHP 5)
file — Liest eine komplette Datei in ein Array
Beschreibung
$filename
[, int $flags = 0
[, resource $context
]] )Liest eine komplette Datei in ein Array
Hinweis:
Sie können file_get_contents() benutzen, um den Inhalt einer Datei als String zurückgeliefert zu bekommen.
Parameter-Liste
-
filename -
Pfad zur Datei.
TippMit dieser Funktion können Sie eine URL als Dateinamen verwenden, falls Sie fopen wrappers ermöglicht haben. Mehr Details dazu, wie Sie den Dateinamen angeben müssen finden Sie bei fopen(). Eine Liste der unterstützten URL Protokolle, die Fähigkeiten der verschiedenen Wrapper, Hinweise zu deren Verwendung und Informationen zu den eventuell vorhandenen vordefinierten Variablen finden Sie unter Unterstützte Protokolle and Wrappers.
-
flags -
Der optionale Parameter
flagskann aus einer oder mehreren der folgenden Konstanten bestehen:-
FILE_USE_INCLUDE_PATH - Suche nach der Datei im include_path
-
FILE_IGNORE_NEW_LINES - Zeilenende nicht am Ende jedes Array-Elements einfügen
-
FILE_SKIP_EMPTY_LINES - Leere Zeilen überspringen
-
-
context -
Eine Context-Ressource, die mit der stream_context_create()-Funktion erstellt wurde.
Hinweis: Die Kontext-Unterstützung gibt es seit PHP 5.0.0. Eine Beschreibung von Kontexten finden Sie unter Streams.
Rückgabewerte
Gibt die Datei in einem Array zurück. Jedes Element des Arrays entspricht
einer Zeile in der Datei, ohne dass das Zeilenende entfernt wird. Im
Fehlerfall gibt file() FALSE zurück.
Hinweis:
Jede Zeile in dem resultierenden Array enthält das Zeilenende, außer es wird
FILE_IGNORE_NEW_LINESverwendet; daher müssen Sie trim() verwenden, falls das Zeilenende nicht vorhanden sein soll.
Hinweis: Wenn Sie Probleme damit haben, dass PHP Zeilenendezeichen nicht erkennt, entweder beim Lesen von Dateien auf einem Macintosh oder bei Dateien, die auf einem Macintosh erstellt wurden, können Sie die Option auto_detect_line_endings aktivieren.
Changelog
| Version | Beschreibung |
|---|---|
| 5.0.0 |
Der context-Parameter wurde hinzugefügt.
|
| 5.0.0 |
Prior to PHP 5.0.0 the flags parameter only
covered include_path and was
enabled with 1
|
| 4.3.0 | file() wurde binär-sicher. |
Beispiele
Beispiel #1 file()-Beispiel
<?php
// Liest eine Datei in ein Array. Hier gehen wir über HTTP, um den
// HTML-Quelltext einer URL zu bekommen
$lines = file('http://www.example.com/');
// Durchgehen des Arrays und Anzeigen des HTML-Quelltexts inkl. Zeilennummern
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br>\n";
}
// Ein weiteres Beispiel: Einlesen einer Webseite in einen String.
// Siehe auch file_get_contents().
$html = implode ('', file ('http://www.example.com/'));
// Benutzung des optionalen flags-Parameters seit PHP 5
$trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>
Anmerkungen
Bei SSL-Verbindungen zusammen mit Microsoft IIS hält sich dieser Webserver nicht an das Protokoll und schließt die Verbindung ohne ein close_notify zu senden. PHP quittiert dieses Fehlverhalten mit "SSL: Fatal Protocol Error", wenn das Ende der Daten erreicht ist. Eine mögliche Lösung besteht darin, den Level von error_reporting herabzusetzten und Warnings auszuschließen. Ab PHP 4.3.7 kann PHP fehlerhafte IIS-Serversoftware erkennen, wenn Sie einen Stream mit dem https://-Wrapper öffnen, und unterdrückt die Warnung für Sie. Falls Sie fsockopen() benutzen, um einen ssl://-Socket zu öffnen, müssen Sie selbst dafür Sorge tragen, die Warnung zu erkennen und diese zu unterdrücken.
Siehe auch
- readfile() - Gibt eine Datei aus
- fopen() - Öffnet eine Datei oder URL
- fsockopen() - Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her
- popen() - Öffnet einen Prozesszeiger
- file_get_contents() - Liest die gesamte Datei in einen String
- include - include
- stream_context_create() - Creates a stream context
file
12-Jul-2007 11:25
28-Nov-2006 09:33
Using file() for reading large text files > 10 Mb gives problems, therefore you should use this instead. It is much slower but it works fine. $lines will return an array with all the lines.
$handle = @fopen('yourfile...', "r");
if ($handle) {
while (!feof($handle)) {
$lines[] = fgets($handle, 4096);
}
fclose($handle);
}
23-Nov-2006 07:25
The Changelog for PHP5 states that there is an optional parameter that instructs file() to cut off lineendings by itself, however, on this page, there is no mention of such a parameter:
Added optional parameter to file() which makes the result array not contain the line endings and to skip empty lines. (Ilia)
11-Jul-2006 11:19
justin at visunet dot ie's note of 20-Mar-2003 states
"Note: Now that file() is binary safe it is 'much' slower than it used to be. If you are planning to read large files it may be worth your while using fgets() instead of file()."
I tested fgets(), file_get_contents(), and file() on PHP 4.3.2 and PHP 5 and timed each to be under a second with over 200,000 lines. I do not know if he was testing extremely long lines or what, but I could not duplicate the difference that he mentioned.
01-Feb-2006 11:52
you can use
$file = array_map('rtrim',file('myfile.txt'));
to remove annoying ending lines of the resulting array.
19-Jan-2006 12:16
WARNING ON WINDOWS:
file() function will add "\r\n" in to the end of the row, even if you use only "\n" char to make rows in the file!
On UNIX systems there is no such problem.
08-Feb-2005 04:55
Example usage of file to remove line containing a key string
<?
$key = "w3ty8l";
//load file into $fc array
$fc=file("some.txt");
//open same file and use "w" to clear file
$f=fopen("some.txt","w");
//loop through array using foreach
foreach($fc as $line)
{
if (!strstr($line,$key)) //look for $key in each line
fputs($f,$line); //place $line back in file
}
fclose($f);
?>
21-Jul-2004 10:27
i tried for quite sometime to get my pdf to attach right some of you may want to try reading it as binary first then base 64 it.
//this did not work for me with a pdf file it came in garbled
$data = chunk_split(base64_encode(implode("", file($filelocation))));
//but tis seemed to make it work correctly
$data = fread($file,filesize($filelocation));
fclose($file);
$data = chunk_split(base64_encode($data));
18-Jun-2004 02:03
Instead of using file() for parsing ini / conf files, as shown in mvanbeek at supporting-role dot co dot uk's example below (above?), a great function that puts all your conf info into an associative array is parse_ini_file($filename); very useful !
ian.
12-Jun-2004 04:18
heres a little script to return a random quote from a quotes file.
<?php
$textfile = "Includes/Quotes.txt"; //quotes file
if ($quotes = @file("$textfile")) { //don't display errors on file open
$quote = rand(0, sizeof($quotes)-1);
echo $quotes[$quote]; //echo a random quote
}else{
echo ("default quote"); //if quotes file wasn't found, echo out a default quote
}
?>
12-Feb-2004 11:45
this a little function I wrote that checks if two ascii files are the same.
it opens the file then removes the spaces then coverts the crc32 to base 10 and compares the results.
function fcheck($tool)
{ if(fopen("file.01", "r") != FALSE){
$fp1 = 'file.02';
$fp = 'semcond.01';
$data = implode(" ", file($fp));
$data1 = implode(" ", file($fp1));
$test1 = (dechex(crc32($data)));
$test2 = (dechex(crc32($data1)));
if($test1 == $test2)
$sfv_checksum = 'TRUE';
else
$sfv_checksum = 'FALSE';
return $sfv_checksum;
}
}
31-Dec-2003 06:39
I needed a cross platform config file for a project using both perl and php, so I used the perl script in the Perl Cookbook, and wrote the following PHP script. This going in an include file that all the PHP files reference, so the only thing that needs to be do for set up, is to set the location of the config file.
$filename = "/opt/ssis/includes/ssis-config";
$config = file($filename);
reset ($config);
foreach ($config as $line)
{
if ( $line == "" ) next($config); # Ignore blankline
elseif ( $line == "\n" ) next($config); # Ignore newline
elseif ( strstr($line,"#")) next($config); # Ignore comments
else
{
$line = rtrim($line); # Get rid of newline characters
$line = ltrim($line); # Get rid of any leading spaces
$value = preg_split("/\s*=\s*/", $line, 2); # split by "=" and removing blank space either side of it.
${Settings}["$value[0]"] = $value[1]; # Create a new array with all the values.
}
}
I am sure there is a neater way of doing it, but all the Config libaries floating arround seemed very complicated. All the config file needs is a series of lines ( key = value ) in plain text.
31-Oct-2003 04:21
If you want a more powerful tool to open files you may want to use the curllib functions. If curllib is installed on your Server it is probably the best (but not fastest) tool for opening files. More information you can find here:
http://curl.haxx.se
or on php.net:
http://de.php.net/manual/de/ref.curl.php
12-Sep-2003 11:48
Jeff's array2file function is a good start; here are a couple of improvements (no possibility of handle leak when fwrite fails, additional capability of both string2file and array2file; presumably faster performance through use of implode).
function String2File($sIn, $sFileOut) {
$rc = false;
do {
if (!($f = fopen($sFileOut, "wa+"))) {
$rc = 1; break;
}
if (!fwrite($f, $sIn)) {
$rc = 2; break;
}
$rc = true;
} while (0);
if ($f) {
fclose($f);
}
return ($rc);
}
function Array2File($aIn, $sFileOut) {
return (String2File(implode("\n", $aIn), $sFileOut));
}
If you're generating your string text using a GET or POST from a TEXTAREA (e.g., a mini-web-text-editor), remember that strip_slashes and str_replace of "/r/n" to "/n" may be necessary as well using these functions.
HTH --dir @ badblue com
23-Aug-2003 05:43
The following function can handle text files whose line endings are whatever <LF> (*nix), <CR><LF> (M$) or <CR> (Mac)
function file2($filename) {
$fp = fopen($filename, "rb");
$buffer = fread($fp, filesize($filename));
fclose($fp);
$lines = preg_split("/\r?\n|\r/", $buffer);
return $lines;
}
21-Jul-2003 01:32
after many months of confusion and frustration, i have finally figured out something that i should have noticed the first time around.
you can't file("test.txt") when that same file has been flocked. i guess i didn't have a full understanding of what i was doing when i used flock(). all i had to do was move the flock() around, and all was well.
25-Mar-2003 01:35
If you want to send a URL via GET to a script and want to open this URL via file() there are problems if there is a & sign in the URL, all after die & sign is cut.
TO fix this an get it working with the & sign in the URL
@$myopenedcontent= implode("", file ("$url"));
$myopenedcontent=eregi_replace('&','{KU}',$myopenedcontent);
so all & signs are replaced by {KU}
before use the file() function you have to rereplace it, the whole code:
$url=eregi_replace('{KU}','&,$url);
@$myopenedcontent= implode("", file ("$url"));
$myopenedcontent=eregi_replace('&','{KU}',$myopenedcontent);
echo "$myopenedcontent";
hope it is helpful ;)
Bye
Afterburner
20-Mar-2003 06:36
Note: Now that file() is binary safe it is 'much' slower than it used to be. If you are planning to read large files it may be worth your while using fgets() instead of file() For example:
$fd = fopen ("log_file.txt", "r");
while (!feof ($fd))
{
$buffer = fgets($fd, 4096);
$lines[] = $buffer;
}
fclose ($fd);
The resulting array is $lines.
I did a test on a 200,000 line file. It took seconds with fgets() compared to minutes with file().
You can use file with https if you go to:
http://ftp.proventum.net/pub/php/win32/misc/openssl/.
This is instead of using the php_openssl.dll, so be sure to comment this extension in your php.ini.
06-Dec-2002 08:01
a quick way to count the number of lines in a file is
$lines = file ('filename');
$num_lines = count ($lines);
echo ("Total lines in file: " . $num_lines);
03-Jun-2002 12:04
[[Editors note: using fopen/fgets instead of file() would be more efficient for this task as there is no need to load the entire file into memory]]
Here is a quick snippet that will read in N number of lines of a file, then print them.
$n=10
$fp = file('/path/to/your/file');
$i=0
while($i < $n){
echo "$fp[$i]";
$i++;
}
I am using this right now to display the current progress of the seti@home client working on my server, instead of displaying the whole thing, which isn't web page friendly.
Because sometimes short really is sweet...
16-Mar-2002 08:16
file() has a strange behaviour when reading file with both \n and \r as line delimitator (DOS files), since it will return an array with every single line but with just a \n in the end. It seems like \r just disappears.
This is happening with PHP 4.0.4 for OS/2. Don't know about the Windows version.
09-Feb-2002 09:56
It appears that the file() function causes file access problems for perl cgi scripts accessing the same files. I am using Perl v5.6.0 in linux with PHP/4.0.4pl1. After running a php app using the file() function, any perl cgi trying to access the same file randomly dies returning an internal server error: premature end of script headers.
The simple fix is to use fopen(), fgets() and fclose() instead of file().