[PHP] ファイルに書き込む前のタイムスタンプを維持する

2018年7月27日(更新: 2018年7月27日)

通常、PHPでファイルに書き込みを行うと、ファイルのタイムスタンプが更新されます。

書き込みによるタイムスタンプの変更を防止したい場合、書き込み前のタイムスタンプを一旦変数に保持し、書き込み終了後に関数 touch によってタイムスタンプを書き換えます。

タイムスタンプを維持するサンプルスクリプト

HTMLのフォームから送信されたテキストをファイルに書き込む際のタイムスタンプの変更を防ぐスクリプトです。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>ファイルスタンプを維持するサンプル</title>
</head>
<body>

<?php

$filename = 'text.txt';
$isFileExist = file_exists($filename);

if ($isFileExist) {

	// 現在のタイムスタンプ
	$currentTimestamp = filemtime($filename);
	
	echo date("Y/m/d H:i:s", $currentTimestamp),'<br>';
}

if (!empty($_POST['text'])) {
	$text = $_POST['text'];

	$fp = fopen($filename, 'a');
	fwrite($fp, $text . PHP_EOL);
	fclose($fp);

	header("Location: " . $_SERVER['REQUEST_URI'], true, 303);
}

if ($isFileExist) {

	// タイムスタンプを更新前の値に変更
	touch($filename, $currentTimestamp);

	// 書き込まれたテキストの表示
	$lines = file($filename);
	foreach ($lines as $line) {
		echo nl2br($line);
	}
}

?>

	<form action="post.php" method="post">
		<textarea name="text"></textarea>
		<input type="submit">
	</form>
</body>
</html>

関数 file_exists でファイルの存在を確認後、関数 filemtime でそのファイルの変更日時を取得し保持します。

そして fwrite による書き込み後に touch によって変更日時を保持した値で書き換えます。

サンプルの実行結果

サンプルで実行すると、まずテキストを入力するためのフォームが表示されます。

書き込むためのテキストエリア

これにテキストを書き込み、送信ボタンを押すとファイルが作成され、その中身と更新時間が表示されます。

PHPで作られたテキストファイルとタイムスタンプ

時間を置いてから、別のテキストを書き込んでも、表示される更新時間は変わりません。

タイムスタンプの更新が行われないファイルの書き込み

Finder でファイルのプロパティ(変更日)を確認しても、変更されていないことがわかります。

以上、ファイルの書き込み時にタイムスタンプを更新しない方法についてでした。

コメントを残す

メールアドレスが公開されることはありません。