質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1621閲覧

phpでログファイル(.php)を圧縮

SayakaxxSakura

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/10/02 05:07

編集2018/10/02 06:31

ログファイルを日付ごとに作成し、現在の日付と比較し先日のファイルはgzipで圧縮
3カ月前の物は削除するようにしたいです。

毎日日付が変わる、12時に1回更新を行い
上記の挙動を取れればOKです。

2018-10-03 00:00 に変わると
2018-10-02 00:00 のファイルがgz圧縮され
2018-07-03 00:00 (3カ月前)以下のファイルが全て削除されるような
形にしたいです。

対象拡張子は、.log .phpファイルとしています。

.phpでする理由は、.phpで書いているファイルを圧縮したい時もあると思うので
追加しています。

logファイルなどを扱うのは初めてで、よくある機能だと聞いたので
作ってみようと思ったのですが、どういう処理を入れるべきかわからなくなりました。

わかる方いらっしゃいましたら、教えて頂けると幸いです。

今回ログファイルの生成は無視するものとします。

ログファイル名のルール
log-[日付 Y-m-d].php

ディレクトリ構成

????sample_log
∟index.php
∟????log
∟log-2018-10-02.php
∟log-2018-10-01.php
etc..

php

1<?php 2 3try{ 4 5 $phar = new PharData('log-2018-10-02.php'); 6 7 $today = 'log-'.date('Y-m-d', strtotime('-1 day')).'.php'; // 昨日の日付 8 9 $filename = array(); 10 11 //ログディレクトリのファイルを全て取得 12 foreach(glob('log/*') as $file){ 13 if(is_file($file)){ 14 $filename[] = htmlspecialchars($file); 15 } 16 } 17 18 //ファイル名を整形 19 foreach($filename as $log_date) 20 { 21 list($log, $date) = explode("/", $log_date); 22 $file_date[] = $date; 23 } 24 25 //先日の日付と一致するものをgzipとして圧縮 26 if(in_array($today,$file_date)) 27 { 28 echo "先日のファイルを圧縮しました。"; 29 $phar->compress(Phar::GZ); 30 31 } 32 33 34 //3カ月以上前の処理 35 36} 37catch (Exception $e) 38{ 39 // エラーがあった場合ここに飛びます 40 echo "Exception : " . $e; 41} 42 43 44 45

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/10/02 06:11

.phpで作られるのはどのような意図があってでしょうか?
SayakaxxSakura

2018/10/02 06:20

すみません、私自身そこを理解していないので、とりあえず.logと,phpファイルで作ってみようという段階です。.phpでも展開できればログのみならず通常ファイルに対しても汎用性ができるかなと思っておりまして。。
m.ts10806

2018/10/02 06:26

現在のコードにおける問題点や、分かっていること、いないこと(できてること、できてないこと)を具体的に記載すると回答も得られやすくなります。質問者さんの考える「汎用性」と見た人の「汎用性」はまた違う気がしますし、この圧縮処理をどのくらいのスパンで実行するかなど質問者さん側で決める仕様部分が若干不明瞭にも思います。基本的によほどテクニカルなことをしない限りは実現可能なので要件、仕様部分を明確にしてみてください。
SayakaxxSakura

2018/10/02 06:31

追加してみました。。よろしくお願い致します!
take_3306

2018/10/02 08:56

PHPで実現することにこだわりはあるのでしょうか。その辺の意図がよく分かりませんでした。Linuxのlogrotate機能でやりたいことは簡単に実現できます。gzipを使っているのでLinux環境かと思いましたが違っていたらすみません。
guest

回答2

0

自己解決

セキュリティ考えないとりあえずこれで動くっていうのを置いておきます。

php

1 2<?php 3 4 5try{ 6 7 $y =date('Y-m-d', strtotime('-1 day')); // 昨日の日付 8 $t = date('Y-m-d', strtotime('-91 day')); // 91日前の日付 9 10 $file_name = array(); 11 12 //ログディレクトリのファイルを全て取得 13 foreach(glob('log/*') as $file){ 14 if(is_file($file)){ 15 $file_name[] = htmlspecialchars($file); 16 } 17 } 18 19 //先日の日付と一致するものをgzとして圧縮 20 if(preg_grep("/$y/",$file_name)) 21 { 22 $log_path = glob( "log/get*".$y."*" ); 23 24 if(preg_grep("/get/",$log_path)) 25 { 26 foreach($log_path as $item) 27 { 28 $file = file_get_contents($item, true); 29 $gzdata = gzencode($file, 9); 30 $fp = fopen("log/gz/"."get".$y.".log.gz", "w"); 31 32 fwrite($fp, $gzdata); 33 fclose($fp); 34 } 35 } 36 37 echo "昨日のファイルを圧縮。"; 38 39 } 40 41 //本日から見て3カ月以上前のファイルを削除 42 if(preg_grep("/$t/",$file_name)) 43 { 44 array_map("unlink", glob( "log/*".$t."*" )); 45 echo "3カ月以上たったファイルがあった為、".$t."のログを削除致しました。"; 46 } 47 48} 49catch (Exception $e) 50{ 51 // エラーがあった場合ここに飛びます 52 echo "Exception : " . $e; 53} 54 55 56 57

投稿2018/10/03 03:08

編集2018/10/03 03:11
SayakaxxSakura

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

汎用的にするならlog4phpを採用するべきでは?

投稿2018/10/03 03:07

tonkun4os

総合スコア321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問