PHP | feof 函数
怎样判断函数指针是否结束
最近更新时间 2020-12-31 13:27:24
feof 函数测试文件指针是否到了文件结束的位置。
如果已到达文件末尾或发生错误,fclose() 函数则返回 true,否则返回 false。
函数定义
feof(resource $handle):bool
// 源文件位于:ext/standard/file.c
# 函数定义
PHPAPI PHP_FUNCTION(feof)
{
zval *res;
php_stream *stream;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_RESOURCE(res)
ZEND_PARSE_PARAMETERS_END();
PHP_STREAM_TO_ZVAL(stream, res);
if (php_stream_eof(stream)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
}
参数
- checkhandle -文件指针。文件指针必须有效,并且是通过 fopen() 或 fsockopen() 函数成功打开的文件(并还未由 fclose() 关闭)。
返回值
- checkbool - 如果文件指针到了 EOF 或者出错时则返回 true,否则返回 false。
示例1: - 使用 feof() 函数测试文件指针是否到了文件结束的位置。
<?php
/**
* PHP 使用 feof() 函数测试文件指针是否到了文件结束的位置。
*
* @since Version 1.0.0
* @filesource
*/
// 打开一个文件
$handle = fopen('foo.txt', 'r');
// 读取一行
$line = fgets($handle);
// 读取文件
while (!feof($handle)) {
$line = fgets($handle);
}
// 关闭文件
fclose($handle);
示例2: - 使用 feof() 函数检测 fsockopen() 函数打开的连接。
如果服务器没有关闭由 fsockopen() 所打开的连接,feof() 会一直等待直到超时。
<?php
/**
* PHP 使用 feof() 函数检测 fsockopen() 函数打开的连接。
*
* @since Version 1.0.0
* @filesource
*/
// 返回测试结果和获取当前时间
function safe_feof($fp, &$start = NULL) {
$start = microtime(true);
return feof($fp);
}
/* $fp 的赋值是由之前 fsockopen() 打开 */
$start = NULL;
$timeout = ini_get('default_socket_timeout');
while(!safe_feof($fp, $start) && (microtime(true) - $start) < $timeout) {
/* Handle */
}
示例3: - 使用 feof() 函数避免陷入死循环,建议使用前使用 is_resource 函数进行判断。
<?php
/**
* PHP 使用 feof() 函数避免陷入死循环。
*
* @since Version 1.0.0
* @filesource
*/
// 如果文件不可读取或者不存在,fopen 函数返回 FALSE
$file = @fopen("no_such_file", "r");
// 来自 fopen 的 FALSE 会发出一条警告信息并在这里陷入无限循环
// while (!feof($file)) {
// }
// 建议使用前先进行判断
if(is_resource($file)) {
while (!feof($file)) {
}
}
fclose($file);