PHP | file_get_contents 函数

怎样方便高效读取文件

最近更新时间 2021-01-02 12:10:09

file_get_contents 函数读取整个文件。

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。如果操作失败返回 false。

file_get_contents() 函数可用于获取网页内容,如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。

谨慎使用 offset 和 maxlen 参数,如果文件中包含中文,可能出现乱码。

函数定义

file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string
// 源文件位于:ext/standard/file.c
# 函数定义

PHP_FUNCTION(file_get_contents)
{
  ...
  if (maxlen_is_null) {
    maxlen = (ssize_t) PHP_STREAM_COPY_ALL;
  } else if (maxlen < 0) {
    zend_argument_value_error(5, "must be greater than or equal to 0");
    RETURN_THROWS();
  }

  context = php_stream_context_from_zval(zcontext, 0);

  stream = php_stream_open_wrapper_ex(filename, "rb",
        (use_include_path ? USE_PATH : 0) | REPORT_ERRORS,
        NULL, context);
  if (!stream) {
    RETURN_FALSE;
  }

  if (offset != 0 && php_stream_seek(stream, offset, ((offset > 0) ? SEEK_SET : SEEK_END)) < 0) {
    php_error_docref(NULL, E_WARNING, "Failed to seek to position " ZEND_LONG_FMT " in the stream", offset);
    php_stream_close(stream);
    RETURN_FALSE;
  }

  if (maxlen > INT_MAX) {
    php_error_docref(NULL, E_WARNING, "maxlen truncated from " ZEND_LONG_FMT " to %d bytes", maxlen, INT_MAX);
    maxlen = INT_MAX;
  }
  if ((contents = php_stream_copy_to_mem(stream, maxlen, 0)) != NULL) {
    RETVAL_STR(contents);
  } else {
    RETVAL_EMPTY_STRING();
  }

  php_stream_close(stream);
}

参数

  • checkfilename - 文件名称,包括路径。
  • checkuse_include_path - 可选参数,默认为 false。
  • checkcontext - 可选参数,自定义 context。
  • checkoffset - 可选参数,开始读取的位置,不能小于 0,默认从文件开始位置。如果文件中包含中文,可能会出现乱码。
  • checkmaxlen - 可选参数,读取文件的长度。

返回值

  • checkbool - 成功时返回字符串,失败时返回 false。需注意空字符串等与 false 的区别。

示例1: - 使用 file_get_contents() 函数读取整个文件。

<?php
/**
 * PHP 使用 file_get_contents() 函数读取整个文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 文件路径,可使用网址
$filename = 'https://docsxyz.com/wiki/news/windows-7-risk';

// 读取文件
$content = file_get_contents($filename);

示例2: - 使用 stream contexts 读取文件。

<?php
/**
 * PHP 使用 stream contexts 读取文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 网址
$filename = 'https://docsxyz.com';

// 创建 stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents($filename, false, $context);
rss_feed