 |
file (PHP 3, PHP 4, PHP 5) file -- 把整个文件读入一个数组中 说明array file ( string filename [, int use_include_path [, resource context]] )
和 readfile() 一样,只除了 file()
将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败
file() 返回 FALSE。
如果也想在 include_path
中搜寻文件的话,可以将可选参数 use_include_path 设为 "1"。
注:
返回的数组中每一行都包括了行结束符,因此如果不需要行结束符时还需要使用
rtrim() 函数。
警告 | 当使用
SSL 时,Microsoft IIS 将违反协议不发送 close_notify 标记就关闭连接。PHP
将在到达数据尾端时报告 "SSL: Fatal Protocol Error"。要绕过此问题,应将
error_reporting 级别降低为不包括警告。PHP
4.3.7 及更高版本可以在当使用 https:// 封装协议打开流的时候检测出有此问题的
IIS 服务器并抑制警告。如果使用 fsockopen()
来创建一个 ssl:// 套接字,则需要自己检测并抑制警告信息。 |
参见 readfile(),fopen(),fsockopen(),popen(),file_get_contents()
和 include()。
jonathan dot gotti at free dot fr
01-Feb-2006 06:52
you can use
$file = array_map('rtrim',file('myfile.txt'));
to remove annoying ending lines of the resulting array.
Nuts
19-Jan-2006 07: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.
redzia
08-Feb-2005 11: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);
?>
Jason dot haymer at Haymer dot co dot uk
14-Jan-2005 12:58
Beware of using file() to call a URL from a remote server on a live Web site, as there is no way to set a maximum connection time.
To exemplify this I cite the circumstance of a Web site which receives content from a remote server in the form of an XML feed. If the remote server does not respond, the Web page will hang and if this is a regular occurance, the parts of the Web site which use the feed may often prove inaccessible to search engine robots, possibly resulting in their removal from the search engine indices.
Here is an alternative function which like file() can be used to retrieve a remote feed, but which imposes a maximum connection time, after which the page will be displayed without the feed.
<?
function fetchUrlWithoutHanging($url)
{
// Set maximum number of seconds (can have floating-point) to wait for feed before displaying page without feed
$numberOfSeconds=4;
// Suppress error reporting so Web site visitors are unaware if the feed fails
error_reporting(0);
// Extract resource path and domain from URL ready for fsockopen
$url = str_replace("http://","",$url);
$urlComponents = explode("/",$url);
$domain = $urlComponents[0];
$resourcePath = str_replace($domain,"",$url);
// Establish a connection
$socketConnection = fsockopen($domain, 80, $errno, $errstr, $numberOfSeconds);
if (!$socketConnection)
{
// You may wish to remove the following debugging line on a live Web site
print("<!-- Network error: $errstr ($errno) -->");
} // end if
else {
$xml = '';
fputs($socketConnection, "GET /$resourcePath HTTP/1.0\r\nHost: $domain\r\n\r\n");
// Loop until end of file
while (!feof($socketConnection))
{
$xml .= fgets($socketConnection, 128);
} // end while
fclose ($socketConnection);
} // end else
return($xml);
} // end function
?>
andyg at stingrayboats dot com
22-Jul-2004 04: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));
kangaroo232002 at yahoo dot co dot uk
18-Jun-2004 08: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.
J at TIPPELL dot com
12-Jun-2004 10: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
}
?>
skipjack at skipjack dot info
12-Feb-2004 06: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;
}
}
mvanbeek at supporting-role dot co dot uk
01-Jan-2004 01: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.
dir @ badblue com
13-Sep-2003 05: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
hhw
23-Aug-2003 11: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;
}
John
21-Jul-2003 07: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.
webmaster AT the-afterburner DOT de
25-Mar-2003 08: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
justin at visunet dot ie
21-Mar-2003 01: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().
akaylaa at yahoo dot com
06-Dec-2002 03: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);
e dot maccarthy at csuohio dot edu
03-Jun-2002 06: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...
andrea at brancatelli dot it
17-Mar-2002 03: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.
php@don't_spam_me
10-Feb-2002 04: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().
|  |