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);
rss_feed