通知
すべてクリア

解決済みphpの glob関数使用のバッチプログラム作成について

投稿: 5
質問投稿者
コミュニティ参加日: 2週間前

クライアント起動webサイトphpプログラム内で、「/public_html」直下に配置したディレクトリ「img-tempr」内に一時的に作成した作業用ディレクトリとファイルの利用終了時、親プログラムへの戻るボタンクリック時に作成した作業用ディレクトリとファイルをglob関数の利用により削除処理を行なっています。

 但し、親プログラムへの戻るボタンをクリックせず、ブラウザ右上の「X」などで予期せぬ終了をされた場合、一時的に作成した作業用ディレクトリとファイルの削除処理が行なわれずに残ったままとなっていました。

 これを回避する手段として、「img-tempr」のパーミッションは「777」に設定、3つのサブディレクトリと各サブディレクトリには1つのファイルをテスト配置し、以下の対応を行ないました。

 phpバッチプログラムを作成、Cron設定追加(還じい様に助けて頂きました。)で深夜帯での時刻起動を想定し、「/public_html/img-tempr」直下内に作成されたまま残存した一時的ディレクトリとファイルの削除処理を、「php 指定ディレクトリ配下削除」で検索し作成しました。

 Cron設定追加で実行させましたが、ログファイルのみ作成されたまま何も記録されませんでした。そこで、下記プログラム「img-temprl.php」を作成しました。

<?php

$files = glob("img-tempr/*");

var_dump($files);

foreach ($files as $file) {

  echo $file . “\n”;

  }

$files = glob("/img-tempr/*");

var_dump($files);

foreach ($files as $file) {

  echo $file . “\n”;

  }

?>

 Cron設定追加実行後ログファイルは4行のみの下記「logfile.log」です。

array(0) {

}

array(0) {

}

そもそもこの対応には無理が有るのか、何処をどうしたら期待される結果が得られるのか、お手上げ状態です。

何卒、宜しくお願いします。

 

対象サービス
2件の返信
投稿: 193
コミュニティ参加日: 1年前

【ご注意ください!】私が悪意を持って嘘の内容を教えている可能性、私の知識が誤っている可能性、記載ミスをしている可能性なども否定はできず、安易に実行すると致命的な状況が発生するかもしれません。記載されている内容の意味を必ずご自身で調べたうえで、自己責任で利用してください。

 

・そのPHPプログラムをCronで実行している

・実際にディレクトリ、ファイルを削除するCron(PHPプログラム)においても、同じようなパスの指定の仕方をしている

ということであれば

前者・・・カレントディレクトリが、「Cron設定追加のコマンドについて」さんが考えているディレクトリとは異なるものになっている

後者・・・フルパスの指定が誤っている

といった理由で、「img-tempr/」内にファイル、ディレクトリが存在しても、何も出力されない(対象のディレクトリ、ファイルがあっても削除されない)可能性が高そうです。

 

 

前者については、Cronでコマンドを実行する場合、カレントディレクトリはうろ覚えですが

/home/サーバーID/

だったはずで、少なくともそのPHPプログラムがあるディレクトリが自動的にカレントディレクトリになるわけではありません。

そのプログラムがあるディレクトリを起点に、相対パスで「img-tempr」ディレクトリを指定したいのであれば、事前にカレントディレクトリをそのように指定しておく必要があります。

 

もしくは、そのPHPプログラムをwgetでURLを指定して実行すると、やっていることは「Webアクセス」になるので、カレントディレクトリが「実行したプログラムがあるディレクトリ」となり、期待した結果が得られると思います。

※この方法はPHPプログラムが「Webアクセスできるディレクトリ」に設置されている必要がありますが、質問を見る限りではそのようなディレクトリに設置しているようなので、参考までに記載しました。

 

 

後者の記載はフルパスなので「/img-tempr/」とだけ指定している場合、

/home/サーバーID/ドメイン名/public_html/img-tempr/ ではなく、

/img-tempr/ に対して処理しようとします。

そのようなディレクトリはないか、あってもファイルやサブディレクトリはなさそうなので、結果が何も返ってこないのは当然だと思われます。

 

$files = glob("/home/サーバーID/ドメイン名/public_html/img-tempr/*");

などとすれば、期待する結果になるかもしれません。

サーバーIDにはご自身のサーバーIDを、ドメイン名には削除したいディレクトリがあるドメイン名を指定してください。

 

 

なお、特定のディレクトリを定期的に消したいだけであれば、PHPプログラムを設置して実行せずとも、

rm -rf /home/サーバーID/ドメイン名/public_html/img-tempr/*

のようなコマンドで実現できるのでは、とも思います。

ディレクトリの指定が誤っている場合も問答無用で削除されてしまうので、

ls -al /home/サーバーID/ドメイン名/public_html/img-tempr/ >filelist.txt

などで事前に「適切なディレクトリが指定できているか」をチェックするとよいかもしれません。この書き方であれば、出力結果は /home/サーバーID/filelist.txt に生成されます。

 

また、このような「プログラムの実際の書き方に関する質問」となってくると、エックスサーバーだからどう、といった話はあまり関係なくなってくるので、ここのコミュニティでこれ以上質問しても適切な回答は得られないかもしれません。じゃあどこに質問すればいいんだっていうと、私もよくわかっていませんが…。

返信
1件の返信
コミュニティ参加日: 2週間前

投稿: 5

Vindoさん、ありがとうございました。

ご指摘頂いた通り、Cron利用時のカレントディレクトリに対する認識が相違していました。

 Vindoさんからの投稿を頂くまでは、Cron利用でのバッチプログラム実行を断念し、対象Webサイト内のページ遷移で最適と思われるphpオブジェクト内の冒頭に「img-tempr」内のサブディレクトリとファイル削除の配置を検討しました。

 glob関数についても知見を深め何回かのテストを、自宅PCの「MAMP」上で実行した結果、下記を配置し期待通りの結果を得ることができました。

$files = glob('../img-tempr/*');

//var_dump($files);

foreach ($files as $file) {

    $filedg = glob($file .'/*.*');

    //var_dump($filedg);

    {foreach ($filedg as $filedel)

    {unlink ($filedel);}}

    rmdir($file);}

 そこで上記「$files = glob('../img-tempr/*');」を「$files = glob('/img-tempr/*');」に変更後、<?php?>で囲み「/public_html」直下に配置しCron実行させましたが従前通りの結果が帰り、Cron利用に見切りを付けていたところにVindoさんでした。

 早速、変更後、即実行したところ期待通りの結果を得ることができ歓喜です。

Cronも深夜帯での実行時刻に変更、Webサイト内のページ遷移内での削除処理はカット、一時作業ディレクトリの作成と削除の配置見直しも行ないます。

 ユーザーコミュニティ内表示名「Cron設定追加のコマンドについて」は当初自動設定されたままにつき、プロフィール編集にて就労中に付けられていた渾名に変更しました。

 Cron設定追加の利用に弾みが付き、レンタルサーバー利用方法の拡大にも弾みが付いたような感じです。ありがとうございました。

 尚、「rm -rf」や「ls -al」コマンドなどLinuxについては以前から興味が有り、廃棄予定としていたWindow7インストール済ノートに2年ぐらい前、Ubuntuインストールを実施し教本に沿って読み進めていました。

が、「コマンドライン操作を習得しよう」前で止まっていました。

なので、紹介頂いたコマンドなどは再開以降にチャレンジしたいと思います。

 

返信