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