PHPのプログラムで権限を更新したい
ということはありませんか?
そんなときは、chmodという関数を使って解決できます。
今回は、chmodを使うときのポイントを紹介します。
目次
chmodの仕様
まずは、chmodをリファレンスで確認です。
指定されたファイルのモードを
permissions
で指定したものに変更しようと試みます。
関数の引数、返り値はこのような仕様はこのようになっています。
1 |
chmod ( string $filename , int $permissions ) : bool |
引数として、ファイルパスを含めたファイル名と権限の8進数の整数型(int型)を渡し、返り値はブーリアン型(bool型)が返ってきます。
つまり、指定したファイルの権限を変更するのがchmodです。
権限の概念、考え方の解説
という人もいると思います。
chmodにおいて、権限について理解が欠かせません。
ここからは、権限について詳しく解説していきます。
サーバには「誰は何ができる」というルールが設定されています。
このルールこそが権限です。
実際に権限を確認する
百聞は一見にしかず。具体的にどのように設定されているのか、確認していきます。
ターミナルを起動して、次のコマンドを実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 |
// Desktopに移動する cd Desktop // test.txtというテキストファイルを作成する touch test.txt // ターミナルを起動して、以下のコマンドを実行する $ ls -l // 以下が表示される -rw-r--r-- 1 hoge staff 0 1 21 23:14 test.txt |
この「-rw-r–r–」がそのファイルの権限を表す部分になります。
権限は、3つに区切って読む
この「-rw-r–r–」が10文字は、具体的に何を表しているのでしょうか?
10文字のうち権限を表す部分は、最初のハイフンを除いた9文字です。
これらを3つに区切って解読するというルールになっています。
最初の3文字はそのファイルの所有者、次の3文字がそのファイルの所属グループ、最後の3文字がそれ以外のユーザについての権限を表しています。
この3つの区切りが「誰は何ができる」というルールにおける「誰は」の部分になります。
最初の3文字は、所有者
次の3文字は、所属グループ
最後の3文字は、その他
「何ができる」はアルファベットを読み、8進数で変更する
「-rw-r–r–」を3つに区切って読むことがわかりました。
次に「誰は何ができる」ルールの「何ができる」について解説していきます。
rやwは「何ができる」をアルファベットで表したものです。
そして、このアルファベットにはそれぞれ数字が割り当てられています。
w(ritable)は、書き込み可能(2)
x(executable)は、実行可能(1)
ハイフン(-)は、権限なし(0)
このように権限は「誰は何ができる」をアルファベットで表しているのです。
権限を変更するときは4,2,1という数字を使うので、ここで抑えておきましょう。
chmodの使い方
本題であるchmodを具体的にプログラムとして解説です。
次のようなファイルをPHPのプログラムを用いて、権限を書き換えてみます。
1 2 3 4 5 6 |
// ファイル(test.txt)を作成 $ touch test.txt // 権限を確認 $ ls -l -rw-r--r-- 1 root root 0 Jan 21 15:12 test.txt |
test.txtというファイルの権限は644となっているのが分かります。
以下のPHPのプログラムで、権限を書き換えます。
1 2 3 4 5 6 |
$file = 'test.txt'; // 変更前の権限を出力 echo substr(sprintf('%o', fileperms($file)), -4); // 権限を変更 echo chmod($file, 0755); |
そして、実行です。
1 2 3 4 5 6 7 |
// php を実行 $ php chmod.php 0644 // 変更される前の権限 $ ls -l -rw-r--r-- 1 root root 148 Jan 21 15:22 chmod_1.php -rwxr-xr-x 1 root root 0 Jan 21 15:12 test.txt // 755に変更される |
確かにchmodを利用して、test.txtの権限を644から755に権限を変更することができました。
これでファイルの所有者は読み込み可能、書き込み可能から、さらに実行可能の権限が追加されたことになります。
chmodや権限に関するよくあるエラー
chmodや権限について、よくあるエラーを3つ紹介します。
「Operation not permitted」というエラーが出る場合の対処法
chmodを使っていると、
というエラーが表示されて、chmodが実行されないということがあります。
このエラーは、開発においてはよくあることです。
原因はPHPを実行するユーザにファイルを更新するだけの権限がない、ということが考えられます。
一度、ターミナルからPHPの権限を確認してみましょう。
1 2 3 4 5 6 7 |
// phpの実行ファイルを確認 $ which php /usr/local/bin/php // 実行ファイルの権限を確認 $ ls -l /usr/local/bin/php -rwxr-xr-x 1 root root 13920664 Dec 11 10:57 /usr/local/bin/php |
変更するファイルに対して、PHPの権限がない場合はPHPの権限を変更する必要があります。
ファイルアップロードができないときの対処法
という現象が起こることがあります。
例えば、ファイルアップロード機能をLaravelで実装するとした場合、外部からアップロードされたファイルは、「public/storage」や「storage/app/public」というディレクトリに保存されます。
このとき、「public/storage」や「storage/app/public」というディレクトリに書き込み可能の権限があるか、を確認しましょう。
もしかすると、書き込もうとしているディレクトリに書き込み可能の権限がない場合があります。
環境を変えてプログラムを実行すると、動作しない
実際にプログラムを開発していると、
ということもよくあります。
そういうときは、テスト環境のファイルやディレクトリの権限をチェックです。
この現象の原因は、自分の開発環境とテスト環境の権限が違うことに由来していることが考えられます。
なので、権限をチェックするときは、自分の開発環境とテスト環境のファイルやディレクトリを見比べてみましょう。
ファイルの所有者を変更するchown
chownでは、所有者やグループを変更するプログラムをchmodと併せて覚えておきましょう。
ファイルには所有者と所属グループが決まっている
chownの解説の前に、簡単にファイルの所有者と所属グループについて解説です。
ファイルには権限の他に必ず、所有者と所属グループが決まっています。
以下のコマンドでファイルの権限を確認してみると、
1 2 3 |
$ ls -l // 所有者=hoge, グループ=fuga -rwxr-xr-x 1 hoge fuga 0 Jan 21 15:12 test.txt |
この場合、test.txtの所有者はhogeで、グループはfugaとなります。
chownの仕様
では、chownのリファレンスを確認です。
chown — ファイルの所有者を変更する
ファイル
filename
の所有者を(名前または番号で指定した) ユーザーuser
に変更しようと試みます。 スーパーユーザーのみがファイルの所有者を変更できます。
プログラムの仕様も併せて確認です。
1 |
chown ( string $filename , string|int $user ) : bool |
ファイル名と所有者を引数として渡し、ブーリアン型が返ってくるようになっています。
chownの使い方
実際にchownを実行して、ファイルの所有者を変更します。
例えば、test.txtというファイルの所有者を「www-data」という所有者に変更する場合、プログラムはこうです。
1 2 3 4 |
$file = 'test.txt'; // 所有者をwww-dataに変更 echo chown($file, 'www-data'); |
実際に実行してみます。
1 2 3 4 5 6 7 8 9 10 |
$ ls -l // 所有者=root, 所有者グループ=rootとなっています -rwxr-xr-x 1 root root 0 Jan 21 15:12 test.txt // プログラムを実行 $ php chown.php $ ls -l // 所有者=www-date, 所有者グループ=rootになりました -rwxr-xr-x 1 www-data root 0 Jan 21 15:12 test.txt |
確かにファイルの所有者を「www-data」に変更することができました。
まとめ
いかがでしたか?
今回は、【重要】chmodを使うときのポイントについてご紹介しました。
これで権限でうまくいかなかったプログラムのエラーも解決することができます。
ぜひ参考にしてみてくださいね。