WordPress:wp_filesystem->put_contents 只写最后一次调用

WordPress: wp_filesystem->put_contents only writes last call

我有一个 WordPress 问题,只想将日志消息写入文本文件。我知道 error_log 存在,但希望为不同的消息创建一个更加隔离的日志文件。

我正在使用 wp_filesystem->put_contents,它确实写入文件并成功,但它只输出最后一次调用的数据

我有以下方法:

public static function log_message($msg) {
  error_log($msg);
  require_once(ABSPATH . 'wp-admin/includes/file.php');
  global $wp_filesystem;
  if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
      $creds = request_filesystem_credentials( site_url() );
      wp_filesystem($creds);
  }

  $bt = debug_backtrace();
  $caller = array_shift($bt);
  $logStr = date("Y-m-d hh:ii A",time())." - ".$caller['file'].":".$caller['line']." - ".$msg;
  $filePathStr = SRC_DIR.DIRECTORY_SEPARATOR.$logFileName;

  $success = $wp_filesystem->put_contents(
      $filePathStr,
      $logStr,
      FS_CHMOD_FILE // predefined mode settings for WP files
  );

  if(!$success) {
      error_log("Writing to file \"".$filePathStr."\" failed.");
  } else {
      error_log("Writing to file \"".$filePathStr."\" succeeded.");
  }
}

我这样称呼它:

log_message("\nTest 1");
log_message("\nTest 2");
log_message("\nTest 3");

输出始终只有 Test 3,其他调用被忽略,它们的输出出现在 debug.log 以及所有成功消息中。

为什么会这样?

查看 WPCodex 的源代码,它在幕后使用 fwrite。该文件在此代码中关闭,我不能使用任何 "flush" 技术。

有办法解决这个问题吗?

我发现 WP_Filesystem 的来源使用 file_put_contents(顾名思义),我假设这是为了附加到文件的数据。

这是不正确的。

这个函数是取数据,然后WRITE到文件中,擦除之前的数据。 主要用于创建资源、下载文件等

如果我想附加到一个文件,我需要使用'fwrite'。

post 描述了这一点。

这是附加到文件的示例:

$filepath = '\path\to\file\';
$filename = 'out.log';
$fullpath = $filepath.$filename;

if(file_exists($fullpath)) {
  $file = fopen($filepath.$filename, "a");//a for append -- could use a+ to create the file if it doesn't exist
  $data = "test message";
  fwrite($file, "\n". $data);
  fclose($file);
} else {
  error_log("The file \'".$fullpath."\' does not exist.");
}

fopen docs 描述了此方法及其模式。