PHP | readfile 函数

Lasted 2021-01-19 18:00:23

readfile 函数输出文件。

读取文件并写入到输出缓冲。

函数定义

readfile ( string $filename , bool $use_include_path = false , resource $context = ? ) : int
// 源文件位于:ext/standard/file.c
# 函数定义

PHP_FUNCTION(readfile)
{
  char *filename;
  size_t filename_len;
  size_t size = 0;
  zend_bool use_include_path = 0;
  zval *zcontext = NULL;
  php_stream *stream;
  php_stream_context *context = NULL;

  ZEND_PARSE_PARAMETERS_START(1, 3)
    Z_PARAM_PATH(filename, filename_len)
    Z_PARAM_OPTIONAL
    Z_PARAM_BOOL(use_include_path)
    Z_PARAM_RESOURCE_OR_NULL(zcontext)
  ZEND_PARSE_PARAMETERS_END();

  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) {
    size = php_stream_passthru(stream);
    php_stream_close(stream);
    RETURN_LONG(size);
  }

  RETURN_FALSE;
}

参数

  • checkfilename - 要读取的文件名。
  • checkuse_include_path - 想要在 include_path 中搜索文件。可选参数,默认为 false。

返回值

  • checkint - 成功时返回从文件中读入的字节数。错误时返回 false。

示例1: - 使用 readfile() 函数输出文件。

<?php
/**
 * PHP readfile() 函数输出文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 按二进制输出 gif 文件
$filename = 'nick.gif';

// 判断文件是否存在
if(file_exists($filename)) {
  // 设置 Header
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename="'.basename($filename).'"');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($filename));
  readfile($filename);
  exit;  
}