WordPress: wp_filesystem-> put_contents записывает только последний вызов - PullRequest
0 голосов
/ 17 ноября 2018

У меня проблема с 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 за кулисами. Файл закрыт в этом коде, и я не могу использовать какую-либо технику "сброса".

Есть ли способ выяснить это?

1 Ответ

0 голосов
/ 18 ноября 2018

Я обнаружил, что источник WP_Filesystem использует file_put_contents (как следует из названия), и я предположил, что это для ПРИЛОЖЕНИЯ к данным файла.

Это неверно.

Эта функция предназначена для получения данных, а затем ЗАПИСИ их в файл, удалив предыдущие данные. В основном полезно для создания ресурсов, загрузки файла и т. Д.

Если я хочу добавить файл, мне нужно использовать «fwrite».

Этот пост описывает это.

Это пример для добавления файла:

$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 описывают этот метод и его режимы.

...