外部 USB ドライブにある tar.gz アーカイブを自動的に解凍してスキャンする PHP スクリプトに取り組んでいますが、いくつかの奇妙な問題に遭遇しました。スクリプトがアーカイブを見つけると、アーカイブを解凍するための一時ディレクトリを USB ドライブに作成しようとします。一意の一時ディレクトリ名を保証するために (このスクリプトは複数回同時に実行される可能性があるため)、次のように、現在の時刻の MD5 のランダムな 5 桁の部分を使用してファイルに名前を付けます。
$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);
USB ドライブはサーバー ファイル システムにマウントされていないため、PHP の組み込みファイル管理コマンド (mkdir()、glob() など) を使用できません。 exec() または shell_exec()。したがって、上記の名前の一時ディレクトリを実際に作成するには、基本的なターミナル mkdir コマンドを使用します。
shell_exec("mkdir $temp");
次に、アーカイブを一時ディレクトリに抽出します。
shell_exec("tar -xzf $archivePath -C $temp");
最後に、アーカイブの分析が終了したら、一時ディレクトリとその内容を削除します。
shell_exec("rm -rf $temp");
ただし、2 つの奇妙な問題が発生しています。
場合によっては、5 回に 1 回の実行で、一時ディレクトリが破損した名前で作成されることがあります。で表示する
ls directory
と のようになり06191v??????.???v???
ます。cd
ただし、タブ キーを使用してコマンドを自動的に入力すると、06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/
. shell_exec() に渡す直前に文字列が問題ないことを知っています (substr() を使用して正しい長さに制限しようとしましたが、役に立ちませんでした)、最初のスラッシュに続く一連の文字(したがって、342 から始まる) は、最初の 5 文字が何であるかに関係なく、常に同じです (最初の 5 文字とスラッシュの間の文字は常に文字ですが、それ以外はランダムです)。しかし、それ以外は途方に暮れています。何らかの理由で
shell_exec("rm -rf $temp");
、スクリプトの最後にある一時ディレクトリを削除するために使用しているのは、スクリプトを 2 回実行した場合にのみ機能します。一度だけ実行すると、次のエラーが表示されます:このエラーをオーバーライドする必要があるrm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty
ため、それ自体が奇妙です。-rf
この動作は、サーバーのコマンド プロンプトでも再現できます。
オンラインでこれらの問題のいずれかに関連するものを見つけることができないようです. 助けてくれてありがとう!
編集:実際には、おそらく最初の問題に関連する3番目の問題があります。コマンドを実行しshell_exec("tar -xzf")
てアーカイブを解凍すると、結果のディレクトリには常にいくつかの奇妙な文字が追加されます。たとえば、BOOT という圧縮ディレクトリを使用して実行した場合、解凍されたディレクトリはターミナルに として表示されBOOT??w??????.???w???
、そのエコー出力は として表示されBOOT²w▀╚.∙wâ–€
ます。タブを使用しcd
てこのディレクトリにコマンドを入力すると、ほぼ同じパターンの文字列が得られます: BOOT\302\262w\342\226\200\342\225\232
2.\342\210\231w\342\226\200/
. 99% の場合、これはスクリプトの実行には影響しませんが、スクリプトがディレクトリのスキャンに失敗する場合があります。