file()-把整个文件读入一个数组中
file(string $filename, int $flag, resource $context=?):array
参数:
- filename:文件的路径
- flags:可选参数。可以是以下一个或多个常量。
FILE_USE_INCLUDE_PATH
FILE_IGNORE_NEW_LINES省略数组中每个元素末尾的换行符
FILE_SKIP_EMPTY_LINES跳过空行 - conntext
返回值:返回数组形式的文件内容。数组的每个元素对应于文件中的一行(结尾会附加换行符)。失败时返回false。
注意:除非使用了FILE_IGNORE_NEW_LINES,否则结果数据中的每一行都将包含行尾。
错误/异常:如果文件不存在,则发出E_WARNING级错误。
file_get_contents-将整个文件读入一个字符串
file_get_contents(
string $filename,
bool $use_include_path = false,
resource $context = ?,
int $offset = 0,
int $length = ?
):string|false
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 length 的内容。如果失败,file_get_contents() 将返回 false。
file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
注意:如果要打开有特殊字符的URL(比如空格),就需要使用urlencode()进行URL编码。
参数:
- filename:要读取的文件名称
- use_include_path context:stream_context_create()创建的有效的上下文(context)资源。如果你不需要自定义context,可以用null来忽略。
- offset:读取原始数据流的开始位置偏移量。负的offset会从数据流的末尾开始统计。远程文件不支持偏移量寻址(offset)。对远程文件以较小的offset可能可以正常寻址,但是对缓冲流进行操作,所以操作结果不可预测。
- length:要读取数据的最大长度。默认情况下会读到文件末尾。注意,该参数会应用到处理stream的过滤器(filter)中。
返回值:返回读取到的数据,或者在失败时返回false。
警告:此函数可能返回布尔值false,但也可能返回等同于false的非布尔值。应使用===运算符来测试此函数的返回值。
错误/异常:E_WARNING级别错误:无法找到filename文件;length小于0;在stream中无法寻址偏移量offset。Windows 下用 file_get_contents() 读取目录会导致 E_WARNING 错误。 PHP 7.4 起,其他操作系统也会出现同样错误。
fpassthru()输出文件指针处的所有剩余数据
fpassthru(resource $handle):int
- 将给定的文件指针从当前的位置读取到EOF并把结果写到输出缓冲区。
- 如果已经向文件写入数据,就必须调用rewind()来将文件指针指向文件头。
- 如果既不修改文件也不在特定位置检索,只想将文件的内容下载到输出缓冲区,应该使用readfile(),这样可以省去fopen()调用。
参数: - handle 文件指针必须是有效的,必须指向由fopen()或fsockopen()成功打开的文件(并还未由fclose()关闭)。
返回值:从handle读取并传递到输出的字符数目。发生错误时,返回false。
$name = 'test.png';
$fp = fopen($name, 'rb');
header("Content-Type: image/png");
fpassthru($fp);
exit;
当在windows系统中将fpassthru()用于二进制文件,要确保在用fopen()打开文件时在mode中附加了b来将文件以二进制方式打开。鼓励在处理二进制文件时使用b标志,即使系统并不需要,这样可以使脚本的移植性更好。
readfile()—输出文件
readfile(string $filename, bool $use_include_path = false, resource $context = ?):int
读取文件并写入输出缓冲
参数:
- filename:要读取的文件名
- use_include_path
- context
返回值:成功时返回从文件中读入的字节数,失败时返回false
示例:使用readfile()强制下载
<?php
$file = 'test.txt';
if(file_exists($file)){
header("Content-Description: File Transfer");
header("Content-Type: application/octet-strem");
header('Content-Disposition: attachment; filename="'.basename($name).'"');
header('Expires: 0');//缓存过期时间
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($name));
ob_clean();
flush();
readfile($name);
}
exit;
fgetcsv—从文件指针中读入一行并解析CSV字段
fgetcsv(resource $handle,
int $length = 0,
string $delimiter = ',',
string $enclosure = '"',
string $escape = '\\'):array
参数:
handle:一个由fopen()、popen()、或fsockopen()产生的有效文件指针。
length:必须大于CVS文件内最长的一行。在 PHP 5 中该参数是可选的。如果忽略(在 PHP 5.0.4 以后的版本中设为 0)该参数的话,那么长度就没有限制,不过可能会影响执行效率。
delimiter:设置字段分界符(只允许一个字符)。
enclosure:设置字段环绕符(只允许一个字符)。
escape:设置转义字符(只允许一个字符)。默认是一个反斜杠
返回值:返回包含读取字段的索引数组。
注意:
- CSV文件中的空行将被返回为一个包含由单个null字段的数组,不会被当成错误。
- 如果提供了无效的文件指针,fgetcsv()会返回null。其他错误,包括碰到文件结束时返回false。
- 读取中文乱码,csv格式不是utf-8的,所以在读取和写入mysql的时候就会出现乱码,用iconv函数转换下即可。
$fp = fopen('code.csv', 'rb');
while (($list = fgetcsv($fp))!==false){
echo '<pre>';
foreach ($list as $v){
if ($v){
var_dump(iconv('gbk','utf-8',$v));
}
}
}
fgets—从文件指针中读取一行。
fgets(resource $handle, int $length = ?) : string
参数:
handle:文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
length:从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
返回值:
- 从指针 handle 指向的文件中读取了 length - 1 字节后返回字符串。如果文件指针中没有更多的数据了则返回 false。
- 错误发生时返回 false。
$file = 'test.txt';
$handle = @fopen($file,'r');
if ($handle){
while (($data = fgets($handle,40000))!==false){
var_dump($data);
echo '<br>';
}
}
如果遇到乱码,用iconv转码。
fread—读取文件(可安全用于二进制文件)
fread(resource $handle, int $length):string
fread()从文件指针handle读取最多length个字节。
参数:
- handle:文件系统指针,是典型地由fopen()创建的resource(资源)
- length:最多读取length个字节。
返回值:返回所读取的字符串,或则在失败时返回false。
$filename = 'test.txt';
//$filename = 'test.png';//也可以读取二进制文件
$fp = fopen($filename,'rb');
$contents = '';
$contents .= fread($fp,filesize($filename));
var_dump($contents);
fclose($fp);
读取远程文件返回的流时,读取会在一个包可用之后停止。可以如下方法
方法一:
$filename = 'http://www.baidu.com';
$fp = fopen($filename,'rb');
$contents = stream_get_contents($fp);
var_dump($contents);
方法二:
$filename = 'http://www.baidu.com';
$fp = fopen($filename,'rb');
$contents = '';
while (!feof($fp)){
$contents .= fread($fp,8192);
}
var_dump($contents);
fclose($fp);
注意:如果只是想将一个文件的内容读入到一个字符串中,用 file_get_contents()。
fscanf—从文件中格式化输出
fscanf('resource $handle, string $format, mixed &$... = ?'):mixed
fscanf()函数从与handle关联的文件中读取一行并根据指定的format来解释输入。
格式字符串中的任何空白会与输入流中的任何空白匹配。这意味着甚至格式字符串中的制表符\t也会与输入流中的一个空白字符匹配。
参数:
- handle:文件系统指针,由fopen()创建的resource资源。
- format:参数格式是sprintf()文档中所描述的格式。
返回值:如果只传递了两个参数,解析后的值会被作为数组返回。否则,如果提供了可选参数,此函数将返回被赋值的数目。可选参数必须用引用传递。
$fp= fopen("test.txt", "r");
while ($userinfo = fscanf($fp, "%s\t%s\t%s\n")) {
list ($name, $profession, $countrycode) = $userinfo;
}
fclose($handle);
$fp= fopen("test.txt", "r");
while ($userinfo = fscanf($fp, "%s\t%s\t%s\n",$name,$profession,$countrycode)) {
}
fclose($handle);