###前提
PHPで.txtのファイルをサーバーに保存したいのですが、「年/月/ファイル名.txt」というディレクトリにわけようと思っています。
しかしそのディレクトリを事前に作っておくのがどうも歯がゆいので、「ディレクトリがなければ作成」という処理を加えたいです。
調べてみたところmkdirという関数でそれが実現できました。
###実現したいこと
まず「年」を作り、次に「月」を作る、という処理を順に実行するのではなく、この処理を一括で実現できませんでしょうか?
###ソースコード
まずmkdirを使って書いた関数my_add_dirです。
php
1// ディレクトリを作成する関数 2function my_add_dir( $full_path, $permission ){ 3 $result = null; // 成功したらフルパスを返す 4 $e = null; // エラー 5 if( ! file_exists($full_path) ){ 6 if(mkdir($full_path, $permission)){ 7 chmod($full_path, $permission); 8 $result = $full_path; 9 }else{ 10 $e[] = 'ディレクトリの作成に失敗しました'; 11 } 12 } 13 14 if( $e ){ 15 $result = $e; 16 } 17 return $result; 18}
###発生している問題
上のmy_add_dirを使った流れは以下を考えているのですが、これでは「年」と「月」がいずれもない状態では作成できませんでした。「月」は「年」がある状態でしか作成できないみたいです。
php
1// ファイル保存に必要な値を取得 2define("DIR_RESPONSES", "/home/public_html/responses" ); 3$service_name = 'example'; // サービス名 4$y = '2020'; $m = '06'; // 「年」「月」 5$insert_id = 1; // データベースのレコードの主キー 6$response = '[["a"=>1]]'; // 書き出す値 7 8// ディレクトリ作成を実行 9$upload_dir = DIR_RESPONSES . '/' . $service_name . '/' . $y . '/' . $m; 10$added = my_add_dir( $upload_dir, 644 ); // できない 11 12// ファイル書き出しを実行 13file_put_contents( $upload_dir . '/' . $insert_id . '.txt', $response);
###試したこと
以下のように「年」を作成し、次に「月」を作成という順に実行していったらできると思ったのですがそうでもなく次のエラーとなりました。
mkdir(): Permission denied file_put_contents(/home/public_html/responses/example/2020/06/1.txt): failed to open stream: Permission denied
そもそもこのようにそれぞれを別に実行することを歯がゆく感じます。
php
1// ディレクトリ作成を実行 (「年」を作成し、次に「月」を作成 とそれぞれ別に実行しなければならない ) 2$upload_dir = DIR_RESPONSES . '/' . $service_name . '/' . $y; 3$added = my_add_dir( $upload_dir, 644 ); // 「年」を作成 4$upload_dir = DIR_RESPONSES . '/' . $service_name . '/' . $y . '/' . $m; 5$added = my_add_dir( $upload_dir, 644 ); // 「月」を作成
もっとこう、一括で「ディレクトリがなければ作成」を繰り返したり、または「一気に2階層先まで作成」のような効率的に処理する方法はございませんでしょうか。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/26 22:53