PHPでchmodする
※実経験の記憶を頼りに自宅の PC 環境(VMWareなど)で再現している内容もあるのでご注意下さい
2007-10-20
さて、今日はディレクトリやファイル権限(パーミッション)のお話。Windows だと、あまり意識することのない話ですが、Linux では非常に重要な話となります。一歩間違えると、やられたい放題です。
でも、今回は Linux などのシェルの話ではなく、PHP でファイルの権限を操作します(笑)PHP なので Web サーバ用のユーザーやグループ(一般的には www とか www-data とか apache)などで権限変更が可能なファイルがターゲットとなります。
なんで、こんな話になったかというと、レンサバ上の PHP で画像をアップロードしたら、ファイルのパーミッションが 600(rw-|---|---) になっちゃってたんですよねぇ・・・。ちなみに owner と group は Web サーバ用のユーザーとグループ(ここでは仮に www とします)です。
特にブラウザ経由で見る場合には何も問題はないのですが、FTP でファイルをクライアントに送信する権限がないので、画像のバックアップができないのです。例え SSH などでサーバ上のシェルが使えるようなレンサバだったとしても、これは権限的に難しいと判断し(シェルのユーザーで www ユーザーの権限を操作する権限がないだろう)、こうなったら PHP で権限変更しちゃえということで、この話に至ったわけです。
さて、前置きが長くなりましたが、実際に作った即席スクリプトです。 PHP の chmod 関数ではパーミッションを 8 進数で表現することになります。今回は 644(rw-|r--|r--)にしますので、0644 と定義します。go+r などのシェルっぽい文字列での操作はできません。 さらに、ディレクトリのファイル一覧にはカレントディレクトリなどのドットも含まれるので、画像ファイル(ここでは拡張子が jpg)のみが対象となるようにしておきます。
仮に、画像のディレクトリを /home/www/saratoga/image とします。
<?php
$targetDir = dir("/home/www/saratoga/image");
$i = 0;
while (($targetFile = $targetDir->read()) !== false) {
if (substr_count($targetFile, "jpg") > 0) {
chmod("/home/www/saratoga/image/" . $targetFile, 0644);
}
$i++;
}
$targetDir->close();
exit();
?>
それにしても、やっぱスクリプト言語って便利だなぁっと思います。
関連記事
上記の記事に関連する記事(最新の10件)です。


