PHP | file_put_contents 函数

Lasted 2021-01-08 18:51:19

file_put_contents 函数将字符串写入文件。

file_put_contents() 函数相当于依次调用 fopen()、fwrite() 和 fclose() 函数。操作失败会返回 false。如果文件不存在,会自动创建文件,但不会自动创建目录。

可传入 flags 参数表示添加或加锁,可进行异或运算。默认为新建模式,会覆盖文件内容。

函数定义

file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int
// 源文件位于:ext/standard/file.c
# 函数定义

PHP_FUNCTION(file_put_contents)
{
  ...
  if (Z_TYPE_P(data) == IS_RESOURCE) {
    php_stream_from_zval(srcstream, data);
  }

  context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);

  if (flags & PHP_FILE_APPEND) {
    mode[0] = 'a';
  } else if (flags & LOCK_EX) {
    /* check to make sure we are dealing with a regular file */
    if (php_memnstr(filename, "://", sizeof("://") - 1, filename + filename_len)) {
      if (strncasecmp(filename, "file://", sizeof("file://") - 1)) {
        php_error_docref(NULL, E_WARNING, "Exclusive locks may only be set for regular files");
        RETURN_FALSE;
      }
    }
    mode[0] = 'c';
  }
  mode[2] = '\0';

  stream = php_stream_open_wrapper_ex(filename, mode, ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
  if (stream == NULL) {
    RETURN_FALSE;
  }

  if ((flags & LOCK_EX) && (!php_stream_supports_lock(stream) || php_stream_lock(stream, LOCK_EX))) {
    php_stream_close(stream);
    php_error_docref(NULL, E_WARNING, "Exclusive locks are not supported for this stream");
    RETURN_FALSE;
  }

  if (mode[0] == 'c') {
    php_stream_truncate_set_size(stream, 0);
  }
  ...
  php_stream_close(stream);

  if (numbytes < 0) {
    RETURN_FALSE;
  }

  RETURN_LONG(numbytes);
}

参数

  • checkfilename - 要被写入数据的文件名。
  • checkdata - 要写入的数据。类型可以是 string,array 或者是 stream。
  • checkcontext - 可选参数,自定义 context。
  • checkflags - 可选参数,flags 的值可以是 以下 flag 使用 OR (|) 运算符进行的组合。FILE_USE_INCLUDE_PATH、FILE_APPEND、LOCK_EX。
  • checkcontext - context 资源。

返回值

  • checkint - 该函数将返回写入到文件内数据的字节数,失败时返回false

示例1: - 使用 file_put_contents() 函数保存数据。

<?php
/**
 * PHP 使用 file_put_contents() 函数保存数据。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 网址
$filename = 'foo.txt';

// 写入文件
file_put_contents($filename, 'Fooooo');

// 不覆盖内容,加锁
// file_put_contents($filename, 'Fooooo', FILE_APPEND | LOCK_EX);