データからINSERT SQLリストを作成する
/**
* データからINSERT SQLリストを作成する。
* @param array $data
* @param string $tbl_name テーブル名
* @return array SQLリスト
*/
private function createInsertSqls($tbl_name, &$data){
if(empty($data)) return array();
// 列名群文字列を組み立て
$ent0 = current($data);
$keys = array_keys($ent0);
$clms_str = implode(',', $keys); // 列名群文字列
$sqls = array(); // SQLリスト
foreach($data as &$ent){
// 値群文字列
$vals_str = "'".implode("','",$ent)."'";
// INSERT文を組み立て
$sqls[] = "INSERT INTO {$tbl_name} ({$clms_str}) VALUES ({$vals_str});";
}
unset($ent);
return $sqls;
}
データからINSERTとUPDATEのSQL文を生成する
<?php
$data = [
['id'=>2, 'tanuki_name'=>'アオダヌキ','tanuki_date'=>'2019-4-8','kemono_id'=>100],
['id'=>null, 'tanuki_name'=>'赤ダヌキ','tanuki_date'=>'2019-4-9','kemono_id'=>101],
['id'=>3, 'tanuki_name'=>'黒ダヌキ','tanuki_date'=>'2019-4-10','kemono_id'=>102],
['id'=>null, 'tanuki_name'=>'ビッグダヌキ','tanuki_date'=>'2019-4-11','kemono_id'=>103],
];
$res = getMasterDataFromDb('tanukis', $data);
echo '<pre><code>';
var_dump($res);
echo '</code></pre>';
/**
* データからINSERTとUPDATEのSQL文を生成する
* @param string $tbl_name テーブル名
* @param array $data エンティティ配列型のデータ
* @return array|string[][]
*/
private function createInsertAndUpdate($tbl_name, $data){
if(empty($data)) return array();
// 列名群文字列を組み立て
$ent0 = current($data);
$keys = array_keys($ent0);
$clms_str = implode(',', $keys); // 列名群文字列
$inserts = array(); // INSERT SQLリスト
$updates = array(); // UPDATE SQLリスト
foreach($data as &$ent){
// IDが空ならINSERT文を組み立て
if(empty($ent['id'])){
$inserts[] = $this->makeInsertSql($tbl_name, $ent); // INSERT文を作成する
}
// IDが存在すればUPDATE文を組み立て
else{
$updates[] = $this->makeUpdateSql($tbl_name, $ent); // UPDATE文を作成する
}
}
unset($ent);
$res = [
'inserts' => $inserts,
'updates' => $updates,
];
return $res;
}
/**
* INSERT文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string INSERT文
*/
private function makeInsertSql($tbl_name, &$ent){
$clms_str = '';
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$clms_str .= $field . ',';
$vals_str .= "'{$value}',";
}
// 末尾の一文字であるコンマを削る
$clms_str = mb_substr($clms_str,0,mb_strlen($clms_str)-1);
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);
$insert_sql = "INSERT INTO {$tbl_name} ({$clms_str}) VALUES ({$vals_str});";
return $insert_sql;
}
/**
* UPDATE文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string UPDATE文
*/
private function makeUpdateSql($tbl_name, &$ent){
if(empty($ent['id'])) throw new Exception('makeUpdateSql: idが空です。');
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$vals_str .= "{$field}='{$value}',";
}
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);// 末尾の一文字であるコンマを削る
$update_sql = "UPDATE {$tbl_name} SET {$vals_str} WHERE id={$ent['id']}";
return $update_sql;
}
出力
array(2) {
["inserts"]=>
array(2) {
[0]=>
string(103) "INSERT INTO tanukis (id,tanuki_name,tanuki_date,kemono_id) VALUES ('','赤ダヌキ','2019-4-9','101');"
[1]=>
string(110) "INSERT INTO tanukis (id,tanuki_name,tanuki_date,kemono_id) VALUES ('','ビッグダヌキ','2019-4-11','103');"
}
["updates"]=>
array(2) {
[0]=>
string(98) "UPDATE tanukis SET tanuki_name='アオダヌキ',tanuki_date='2019-4-8',kemono_id='100' WHERE id=2"
[1]=>
string(96) "UPDATE tanukis SET tanuki_name='黒ダヌキ',tanuki_date='2019-4-10',kemono_id='102' WHERE id=3"
}
}
エンティティからINSERT文とUPDATE文を作成する
/**
* INSERT文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string INSERT文
*/
private function makeInsertSql($tbl_name, &$ent){
$clms_str = '';
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$clms_str .= $field . ',';
$vals_str .= "'{$value}',";
}
// 末尾の一文字であるコンマを削る
$clms_str = mb_substr($clms_str,0,mb_strlen($clms_str)-1);
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);
$insert_sql = "INSERT INTO {$tbl_name} ({$clms_str}) VALUES ({$vals_str});";
return $insert_sql;
}
/**
* UPDATE文を作成する
* @param string $tbl_name テーブル名
* @param array $ent 登録データのエンティティ
* @return string UPDATE文
*/
private function makeUpdateSql($tbl_name, &$ent){
if(empty($ent['id'])) throw new Exception('makeUpdateSql: idが空です。');
$vals_str = '';
foreach($ent as $field => $value){
if($value === null) continue;
$vals_str .= "{$field}='{$value}',";
}
$vals_str = mb_substr($vals_str,0,mb_strlen($vals_str)-1);// 末尾の一文字であるコンマを削る
$update_sql = "UPDATE {$tbl_name} SET {$vals_str} WHERE id={$ent['id']}";
return $update_sql;
}
ブラウザ判定
function judgBrowser(){
// ユーザーエージェントを取得、および小文字化する。
$browser = strtolower($_SERVER['HTTP_USER_AGENT']);
// ユーザーエージェント文字列中のキーワードからブラウザを判定する
if (strstr($browser , 'edge')) {
return 'edge';
} elseif (strstr($browser , 'trident') || strstr($browser , 'msie')) {
return 'ie';
} elseif (strstr($browser , 'chrome')) {
if(strstr($browser , 'opr')){
return 'opera';
}else{
return 'chrome';
}
} elseif (strstr($browser , 'firefox')) {
return 'firefox';
} elseif (strstr($browser , 'safari')) {
return 'safari';
} else {
return 'none';
}
}
参考:
アクセスされたブラウザ名をPHPで判別する方法
画像サイズ(横幅、縦幅)を取得する
$sizeInfo = getimagesize('img/imori.jpg');
$width = $sizeInfo[0];
$height = $sizeInfo[1];
使用メモリを取得 memory_get_usage()
バイト単位で割り当てられている使用メモリを取得する
$mem1 = memory_get_usage();
~ 重たい処理 ~
$mem2 = memory_get_usage() - $mem1;
echo "使用量→{$mem2}Byte
";
ファイル容量を取得 | filesize()
$fsize = filesize ($fn);
UTF8ファイルのテキストに付いているBOMを除去する
テキストファイルから文字列を読み込んだ時、先頭に謎の文字がくっついており、それがバグを引き起こすことがある。
この謎の文字はBOMと呼ばれるものである。
以下のメソッドは文字列からBOMを除去する。
/**
* UTF8ファイルのテキストに付いているBOMを除去する
* @param string $str UTF8ファイルから取得したテキストの文字列
* @return string BOMを除去した文字列
*/
function deleteBom($str){
if (($str == NULL) || (mb_strlen($str) == 0)) {
return $str;
}
if (ord($str{0}) == 0xef && ord($str{1}) == 0xbb && ord($str{2}) == 0xbf) {
$str = substr($str, 3);
}
return $str;
}
ログ出力 error_log
error_log('ログテスト\n',3,'b_debug.txt');
ログ出力 | オリジナル
/**
* ログB
* @param mixed $val
*/
function logB($val){
if(is_array($val)){
error_log(print_r($val, true), 3, 'log_b.log');
}else{
error_log($val, 3, 'log_b.log');
}
error_log("\n", 3, 'log_b.log');
}
入力チェックバリデーション | InputCheckValid
<?php
require_once 'InputCheckValid.php';
$icv = new InputCheckValid(); // 入力チェックバリデーション
$long_str = "ウナギ(鰻[2]、うなぎ)とは、ウナギ科(Anguillidae) ウナギ属(Anguilla) に属する魚類の総称である。世界中の熱帯から温帯にかけて分布する。ニホンウナギ、オオウナギ、ヨーロッパウナギ、アメリカウナギ(英語版)など世界で19種類(うち食用となるのは4種類)が確認されている";
$data = [
['animal_name'=>'タウナギ', 'age'=>4],
['animal_name'=>'オオウナギ', 'age'=>1000],
['animal_name'=>'ドジョウ', 'age'=>-1],
['animal_name'=>'ウツボ', 'age'=>1.2],
['animal_name'=>'ウミヘビ', 'age'=>'a'],
['animal_name'=>$long_str, 'age'=>-1.2],
[],
];
// バリデーションデータ
$validData=[
'animal_name'=>['valid_type'=>'string', 'wamei'=>'動物名', 'len'=>4, 'req'=>1],
'age'=>['valid_type'=>'int', 'wamei'=>'年齢', 'req'=>0, 'max'=>1000],
];
$validData = $icv->normalizeValidData($validData); // バリデーションデータの正規化
foreach($data as $ent){
$animal_name = '';
if(!empty($ent['animal_name'])) $animal_name = $ent['animal_name'];
if(mb_strlen($animal_name) > 8){
$animal_name = mb_substr($animal_name, 0, 8);
$animal_name .= '...';
}
$age = '';
if(isset($ent['age'])) $age = $ent['age'];
$res1 = $icv->validEnt($ent, $validData);
echo "<tr>";
echo "<td>{$animal_name}</td>";
echo "<td>{$age}</td>";
echo "<td>{$res1}</td>";
echo "</tr>";
}
function debug($value){
echo '<pre>';
var_dump($value);
echo '</pre>';
}
?>
<?php
/**
* 入力チェックバリデーション | InputCheckValid
*
* @date 2019-7-11
* @version 1.0
* @license MIT
* @author k_uehara
*
*/
class InputCheckValid{
var $param;
/**
* コンストラクタ
* @param array $param
* - smp_str_len サンプル文字列長 省略可
*/
public function __construct($param = []){
$this->param = $this->setParamIfEmpty($param);
}
/**
* If Param property is empty, set a value.
* @param array $param
* @return array
*/
private function setParamIfEmpty($param){
if(empty($param)) $param = [];
if(empty($param['smp_str_len'])) $param['smp_str_len'] = 8; // サンプル文字列長
return $param;
}
/**
* バリデーションデータを正規化する
* @param array $validData バリデーションデータ
* @return array 正規化したバリデーション
*/
public function normalizeValidData(&$validData){
foreach($validData as $field => &$validEnt){
if(empty($validEnt['req'])) $validEnt['req'] = null;
if(empty($validEnt['field'])) $validEnt['field'] = $field;
if(empty($validEnt['wamei'])) $validEnt['wamei'] = $field;
$validEnt['field_name'] = "「{$validEnt['wamei']}」";
// バリデーションタイプが数値系である場合、最大値と最小値を定義する。
$valid_type = $validEnt['valid_type'];
if($valid_type == 'int' || $valid_type == 'double' || $valid_type == 'natural' ){
if(!isset($validEnt['max'])) $validEnt['max'] = null;
if(!isset($validEnt['min'])) $validEnt['min'] = null;
}
}
unset($validEnt);
return $validData;
}
/**
* エンティティのバリデーション
* @param array $ent エンティティ
* @param array $validData バリデーションデータ
* @param int $res_type レスポンスタイプ 0:文字列, 1:配列(キー:フィールド, 値:エラーメッセージ)
* @return mixed エラー情報 null:すべて正常
*/
public function validEnt(&$ent, &$validData, $res_type=0){
$errs = [];
foreach($validData as $field => &$validEnt){
$valid_type = $validEnt['valid_type'];
$err_msg = null;
switch ($valid_type){
case 'string':
$err_msg = $this->validString($ent, $validEnt); // 文字列バリデーション
break;
case 'int':
$err_msg = $this->validInt($ent, $validEnt); // 整数バリデーション
break;
case 'natural':
$err_msg = $this->validNatural($ent, $validEnt); // 自然数バリデーション
break;
case 'double':
$err_msg = $this->validDouble($ent, $validEnt); // 浮動小数バリデーション
break;
case 'date':
$err_msg = $this->validDate($ent, $validEnt); // 日付バリデーション
break;
case 'datetime':
$err_msg = $this->validDatetime($ent, $validEnt); // 日時バリデーション
break;
default:
throw new Exception("Unknown valid_type:{$valid_type}");
}
if(!empty($err_msg)) $errs[$field] = $err_msg;
}
unset($validEnt);
// エラーメッセージのレスポンス
$res = null;
if(!empty($errs)){
if($res_type == 1){
$res = $errs;
}else{
$res = implode(' | ', $errs);
}
}
return $res;
}
/**
* 文字列バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validString(&$ent, &$validEnt){
$field = $validEnt['field'];
$value = '';
if(!empty($ent[$field])) $value = $ent[$field];
// 必須入力チェック
if($validEnt['req']!=null && $value==''){
return "{$validEnt['field_name']}は必須入力です。";
}
// 長さチェック
if(!empty($validEnt['len'])){
$len = $validEnt['len'];
$smp_str = $value;
if($len < mb_strlen($smp_str)){
$smp_str_len = $this->param['smp_str_len'];
if(mb_strlen($smp_str) > $smp_str_len){
$smp_str = mb_substr($smp_str, 0, $smp_str_len);
$smp_str .= '...';
}
return "{$validEnt['field_name']}は{$len}文字以内にしてください。→'{$smp_str}'";
}
}
return "";
}
/**
* 整数バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validInt(&$ent, &$validEnt){
$field = $validEnt['field'];
// 数値用必須バリデーション
$err_msg = $this->validReqForNum($field, $ent, $validEnt);
if(!empty($err_msg)) return $err_msg;
$value = 0;
if(!empty($ent[$field])) $value = $ent[$field];
// 整数チェック
if(!preg_match('/^[-]?[0-9]+?$/', $value)){
return "{$validEnt['field_name']}は整数にしてください。→{$value}";
}
// 最大値と最小値のバリデーション
$err_msg = $this->validMaxAndMin($value, $validEnt);
if(!empty($err_msg)) return $err_msg;
return "";
}
/**
* 自然数バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validNatural(&$ent, &$validEnt){
$field = $validEnt['field'];
// 数値用必須バリデーション
$err_msg = $this->validReqForNum($field, $ent, $validEnt);
if(!empty($err_msg)) return $err_msg;
$value = 0;
if(!empty($ent[$field])) $value = $ent[$field];
// 整数チェック
if(!preg_match('/^[0-9]+?$/', $value)){
return "{$validEnt['field_name']}は自然数にしてください。→{$value}";
}
// 最大値と最小値のバリデーション
$err_msg = $this->validMaxAndMin($value, $validEnt);
if(!empty($err_msg)) return $err_msg;
return "";
}
/**
* 浮動小数バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validDouble(&$ent, &$validEnt){
$field = $validEnt['field'];
// 数値用必須バリデーション
$err_msg = $this->validReqForNum($field, $ent, $validEnt);
if(!empty($err_msg)) return $err_msg;
$value = 0;
if(!empty($ent[$field])) $value = $ent[$field];
// 浮動小数チェック
if(!preg_match('/^[+-]?[0-9]*[¥.]?[0-9]*/', $value)){
return "{$validEnt['field_name']}は数値にしてください。→{$value}";
}
// 最大値と最小値のバリデーション
$err_msg = $this->validMaxAndMin($value, $validEnt);
if(!empty($err_msg)) return $err_msg;
return "";
}
/**
* 数値用必須バリデーション
* @param string $field
* @param array $ent
* @param array $validEnt
* @return string エラーメッセージ
*/
private function validReqForNum($field, $ent, &$validEnt){
// 必須入力チェック
if($validEnt['req'] != null){
if(!isset($ent[$field])){
return "{$validEnt['field_name']}が存在しません。";
}
if(empty($ent[$field]) && $ent[$field]!==0 && $ent[$field] !=='0'){
return "{$validEnt['field_name']}は必須入力です。";
}
}
return '';
}
/**
* 最大値と最小値のバリデーション
* @param int $value
* @param array $validEnt
* @return string エラーメッセージ
*/
private function validMaxAndMin($value, &$validEnt){
// 最大値チェック
if($validEnt['max'] !== null){
$max = intval($validEnt['max']);
if($max < $value){
return "{$validEnt['field_name']}は{$max}を超えてはなりません。→{$value}";
}
}
// 最小値チェック
if($validEnt['min'] !== null){
$min = intval($validEnt['min']);
if($min > $value){
return "{$validEnt['field_name']}は{$min}を下回ってはなりません。→{$value}";
}
}
return "";
}
/**
* 日付バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validDate(&$ent, &$validEnt){
$field = $validEnt['field'];
$value = '';
if(!empty($ent[$field])) $value = $ent[$field];
// 必須入力チェック
if($value == ''){
if(empty($validEnt['req'])){
return "";
}else{
return "{$validEnt['field_name']}は必須入力です。";
}
}
//日付を年月日時分秒に分解する。
$aryA =preg_split( '|[ /:_-]|', $value );
if(count($aryA)!=3){
return "{$validEnt['field_name']}は日付型(Y-m-dもしくはY/m/d)で入力してください。→{$value}";
}
foreach ($aryA as $key => $val){
//▼正数以外が混じっているば、即座にfalseを返して処理終了
if (!preg_match("/^[0-9]+$/", $val)) {
return "{$validEnt['field_name']}は日付を入力してください。→{$value}";
}
}
//▼グレゴリオ暦と整合正が取れてるかチェック。(閏年などはエラー) ※さくらサーバーではemptyでチェックするとバグになるので注意。×→if(empty(checkdate(12,11,2012))){・・・}
if(checkdate($aryA[1], $aryA[2], $aryA[0])==false){
return "{$validEnt['field_name']}は実在する日付を入力してください。→{$value}";
}
return "";
}
/**
* 日時バリデーション
* @param array $ent データのエンティティ
* @param array $validEnt バリデーションエンティティ
* @return string エラーメッセージ
*/
private function validDatetime(&$ent, &$validEnt){
$field = $validEnt['field'];
$value = '';
if(!empty($ent[$field])) $value = $ent[$field];
// 必須入力チェック
if($value == ''){
if(empty($validEnt['req'])){
return "";
}else{
return "{$validEnt['field_name']}は必須入力です。";
}
}
//日付を年月日時分秒に分解する。
$aryA =preg_split( '|[ /:_-]|', $value );
if(count($aryA)!=6){
return "{$validEnt['field_name']}は日時型(Y-m-d h:i:sもしくはY/m/d h:i:s)で入力してください。→{$value}";
}
foreach ($aryA as $key => $val){
//▼正数以外が混じっているば、即座にfalseを返して処理終了
if (!preg_match("/^[0-9]+$/", $val)) {
return "{$validEnt['field_name']}は日時を入力してください。→{$value}";
}
}
//▼グレゴリオ暦と整合正が取れてるかチェック。(閏年などはエラー) ※さくらサーバーではemptyでチェックするとバグになるので注意。×→if(empty(checkdate(12,11,2012))){・・・}
if(checkdate($aryA[1], $aryA[2], $aryA[0])==false){
return "{$validEnt['field_name']}は実在する日付を入力してください。→{$value}";
}
//▼時刻の整合性をチェック
if($aryA[3] < 0 || $aryA[3] > 23){
return "{$validEnt['field_name']}の時間部分(時)が異常です。→{$value}";
}
if($aryA[4] < 0 || $aryA[4] > 59){
return "{$validEnt['field_name']}の時間部分(分)が異常です。→{$value}";
}
if($aryA[5] < 0 || $aryA[5] > 59){
return "{$validEnt['field_name']}の時間部分(秒)が異常です。→{$value}";
}
return "";
}
/**
* 日時入力チェックのバリデーション
* ※日付のみあるいは時刻は異常と見なす。
* @param string $strDateTime 日時文字列
* @param string $reqFlg 必須許可フラグ
* @return boolean true:正常, false:異常
* @date 2015-10-5 改良
*/
private function isDatetime($strDateTime, $reqFlg){
//空値且つ、必須入力がnullであれば、trueを返す。
if(empty($strDateTime) && empty($reqFlg)){
return true;
}
//空値且つ、必須入力がtrueであれば、falseを返す。
if(empty($strDateTime) && !empty($reqFlg)){
return false;
}
//日時を 年月日時分秒に分解する。
$aryA =preg_split( '|[ /:_-]|', $strDateTime );
if(count($aryA)!=6){
return false;
}
foreach ($aryA as $key => $val){
//▼正数以外が混じっているば、即座にfalseを返して処理終了
if (!preg_match("/^[0-9]+$/", $val)) {
return false;
}
}
//▼グレゴリオ暦と整合正が取れてるかチェック。(閏年などはエラー) ※さくらサーバーではemptyでチェックするとバグになるので注意。×→if(empty(checkdate(12,11,2012))){・・・}
if(checkdate($aryA[1],$aryA[2],$aryA[0])==false){
return false;
}
//▼時刻の整合性をチェック
if($aryA[3] < 0 || $aryA[3] > 23){
return false;
}
if($aryA[4] < 0 || $aryA[4] > 59){
return false;
}
if($aryA[5] < 0 || $aryA[5] > 59){
return false;
}
return true;
}
}
出力
動物名 |
年齢 |
エラーメッセージ |
タウナギ | 4 | |
オオウナギ | 1000 | 「動物名」は4文字以内にしてください。→'オオウナギ' |
ドジョウ | -1 | |
ウツボ | 1.2 | 「年齢」は整数にしてください。→1.2 |
ウミヘビ | a | 「年齢」は整数にしてください。→a |
ウナギ(鰻[2]... | -1.2 | 「動物名」は4文字以内にしてください。→'ウナギ(鰻[2]...' | 「年齢」は整数にしてください。→-1.2 |
| | 「動物名」は必須入力です。 |
ディレクトリごとログファイルを作成、また旧ログファイルの除去も行う | LogEx.php
テストコード
<?php
require_once ('LogEx.php');
$logEx = new LogEx();
$logEx->write('カタクチイワシ');
$logEx->write('カライワシ');
$log_text = $logEx->getLogText(); // ログのテキストを取得
echo '<pre>';
echo $log_text;
echo '</pre>';
?>
<?php
/**
* ログEXクラス
*
* @note
* ディレクトリごとログファイルを作成、また旧ログファイルの除去も行う。
* @date 2019-7-13
* @version 1.0
* @license MIT
* @author k_uehara
*
*/
class LogEx{
var $param;
/**
* コンストラクタ
* @param array $param
* - log_fp ログファイルパス
*/
public function __construct($param = []){
$this->param = $this->setParamIfEmpty($param);
$log_fp = $this->param['log_fp'];
$this->makeLogFile($log_fp); // ログファイルを作成
// 指定日数より古い更新日のファイルをすべて削除する
$pi = pathinfo($log_fp);
$log_dp = $pi['dirname'];
$this->removeFileByOldDay($log_dp, $this->param['del_file_day'], 'log');
$this->param['log_dp'] = $log_dp;
}
/**
* If Param property is empty, set a value.
* @param array $param
* @return array
*/
private function setParamIfEmpty($param){
if(empty($param)) $param = [];
if(empty($param['log_fp'])) $param['log_fp'] = 'log/a' . date('Ymdhis') . '.log';
if(empty($param['del_file_day'])) $param['del_file_day'] = 1;
return $param;
}
/**
* ログ書き出し
* @param string $text テキスト
*/
public function write($text){
$h = fopen ( $this->param['log_fp'], 'ab' ); // ファイルを追記モードで開く
flock ( $h, LOCK_EX ); // ファイルを排他ロックする
fwrite ( $h, $text . "¥n" ); // データをファイルに書き込む
fclose ( $h ); // ファイルを閉じる
}
/**
* ログファイルを作成
* @param string $log_fp
*/
private function makeLogFile($log_fp){
if(empty($log_fp)) return;
$paths = pathinfo($log_fp);
$dp = $paths['dirname']; // ディレクトリパス
$fn = $paths['basename']; // ファイル名
// ディレクトリが存在しないなら作成
if (!is_dir($dp)){
$this->makeDirEx($dp, '0755');
}
// ログファイルファイルの作成(テキストファイルの作成)
$h = fopen ( $log_fp, 'ab' ); // ファイルを追記モードで開く
flock ( $h, LOCK_EX ); // ファイルを排他ロックする
fclose ( $h ); // ファイルを閉じる
}
/**
* ディレクトリを作成する
*
* @note
* ディレクトリが既に存在しているならディレクトリを作成しない。
* パスに新しく作成せねばならないディレクトリ情報が複数含まれている場合でも、順次ディレクトリを作成する。
* 日本語ディレクトリ名にも対応。
* パスセパレータは「/」と「¥」に対応。
* ディレクトリのパーミッションの変更をを行う。(既にディレクトリが存在する場合も)
* セパレータから始まるディレクトリはホームルートパスからの始まりとみなす。
*
* @version 1.3
* @date 2014-4-13 | 2018-8-18
*
* @param string $dir_path ディレクトリパス
*/
private function makeDirEx($dir_path,$permission = 0666){
if(empty($dir_path)){return;}
$home_flg = false; // ホームディレクトリパス 1:ホーム(htdocsより以降)からのパス
$s1 = mb_substr($dir_path,0,1);
if($s1 == '/' || $s1 == DIRECTORY_SEPARATOR){
$home_flg = 1;
}
// 日本語名を含むパスに対応する
$dir_path=mb_convert_encoding($dir_path,'SJIS','UTF-8');
// ディレクトリが既に存在する場合、書込み可能にする。
if (is_dir($dir_path)){
chmod($dir_path,$permission);// 書込み可能なディレクトリとする
return;
}
// パスセパレータを取得する
$sep = DIRECTORY_SEPARATOR;
if(strpos($dir_path,"/")!==false){
$sep = "/";
}
//パスを各ディレクトリに分解し、ディレクトリ配列をして取得する。
$ary=explode($sep, $dir_path);
//ディレクトリ配列の件数分以下の処理を繰り返す。
$dd = '';
foreach ($ary as $i => $val){
if($i==0){
$dd=$val;
if($home_flg == 1){
$dd = $_SERVER['DOCUMENT_ROOT'] . $sep . $dd;
}
}else{
$dd .= $sep.$val;
}
//作成したディレクトリが存在しない場合、ディレクトリを作成
if (!is_dir($dd)){
mkdir($dd,$permission);//ディレクトリを作成
chmod($dd,$permission);// 書込み可能なディレクトリとする
}
}
}
/**
* 危険処理
* 指定日数より古い更新日のファイルをすべて削除する
*
* @note
*指定日数に2を指定した場合、二日以上前のファイルをすべて削除。
*0を指定すると、すべてのファイルを削除
*
* @param string $dp ディレクトリパス
* @param number $day_num 指定日数
* @param string $ext 削除ファイルの拡張子(小文字) null:すべてのファイルが対象
*/
public function removeFileByOldDay($dp, $day_num = 1, $ext = null){
$fps = $this->scandir3($dp); // ディレクトリ内にあるすべてのファイルのファイルパスを取得する
$today = date("Y-m-d");
foreach($fps as $fp){
$dt = date("Y-m-d", filemtime($fp));
$diff_day = $this->diffDay($today, $dt); // 2つの日付の日数差を算出する
// 日付差が指定日数以上なら、ファイル削除とする。
if($day_num <= $diff_day){
// ファイルパスから拡張子(小文字)を取得
$pi = pathinfo($fp);
$ext2 = mb_strtolower($pi['extension']);
// 拡張子が一致するなら、このファイルを削除する
if($ext == $ext2){
unlink($fp);
}
}
}
}
/**
* 2つの日付の日数差を算出する
*
* diff = d2 - d1
*
* @param date or string $d2
* @param date or string $d1
* @return int 日数差
*/
private function diffDay($d2,$d1){
$u1=strtotime($d1);
$u2=strtotime($d2);
//日数を算出
$diff=$u2-$u1;
$d_cnt=$diff/86400;
return $d_cnt;
}
/**
* scandir関数の拡張関数。
*
* @note
* 「.」「..」となっているファイル名は除外する。
*
* @param string $dp ディレクトリ名
* @param string $sep セパレータ(省略可)
* @return array ファイルパスリスト
*/
private function scandir3($dp, $sep = '/'){
$files = scandir($dp);
// ディレクトリパスの末尾にセパレータを付け足す
$dp2 = $dp;
if(mb_substr($dp2, -1) != $sep){
$dp2 .= $sep;
}
// 「.」,「..」名のファイルを除去、および日本語ファイルに対応。
$fps = [];
foreach($files as $file){
if($file=='.' || $file=='..'){
continue;
}
$fps[] = $dp2 . $file;
}
return $fps;
}
/**
* ログのテキストを取得
* @param int $limit 行制限 テキストファイルから取得するログ取得制限 nullを指定した場合、10万行になる。
* @return string ログのテキスト
*/
public function getLogText($limit = 200){
if($limit == null) $limit = 100000;
$log_text = ''; // ログテキスト
$log_fp = $this->param['log_fp'];
$i=0;
if ($h = fopen ( $log_fp, "r" )) {
while ( false !== ($line = fgets ( $h )) ) {
$log_text .= $line;
$i++;
if($limit == $i) break;
}
}
fclose ( $h );
return $log_text;
}
}
出力
カタクチイワシ
カライワシ
xxx
- ホーム
- プログラミングの覚書
- PHPの覚書