【重要】PHPでchmodを使うときのポイント

PHPでファイルをアップロードがうまくいかない
PHPのプログラムで権限を更新したい

ということはありませんか?

 

そんなときは、chmodという関数を使って解決できます。

今回は、chmodを使うときのポイントを紹介します。

 

chmodの仕様

まずは、chmodをリファレンスで確認です。

指定されたファイルのモードを permissions で指定したものに変更しようと試みます。

関数の引数、返り値はこのような仕様はこのようになっています。

引数として、ファイルパスを含めたファイル名と権限の8進数の整数型(int型)を渡し、返り値はブーリアン型(bool型)が返ってきます。

つまり、指定したファイルの権限を変更するのがchmodです。

権限の概念、考え方の解説

いやいや、そもそも権限ってなに?

という人もいると思います。

chmodにおいて、権限について理解が欠かせません。

ここからは、権限について詳しく解説していきます。

 

サーバには「誰は何ができる」というルールが設定されています。

このルールこそが権限です。

実際に権限を確認する

百聞は一見にしかず。具体的にどのように設定されているのか、確認していきます。

ターミナルを起動して、次のコマンドを実行してみてください。

この「-rw-r–r–」がそのファイルの権限を表す部分になります。

権限は、3つに区切って読む

この「-rw-r–r–」が10文字は、具体的に何を表しているのでしょうか?

 

10文字のうち権限を表す部分は、最初のハイフンを除いた9文字です。

これらを3つに区切って解読するというルールになっています。

最初の3文字はそのファイルの所有者、次の3文字がそのファイルの所属グループ、最後の3文字がそれ以外のユーザについての権限を表しています。

この3つの区切りが「誰は何ができる」というルールにおける「誰は」の部分になります。

権限は3つに区切って読む
最初の3文字は、所有者
次の3文字は、所属グループ
最後の3文字は、その他

「何ができる」はアルファベットを読み、8進数で変更する

「-rw-r–r–」を3つに区切って読むことがわかりました。

次に「誰は何ができる」ルールの「何ができる」について解説していきます。

rやwは「何ができる」をアルファベットで表したものです。

そして、このアルファベットにはそれぞれ数字が割り当てられています。

r(eadable)は、読み込み可能(4)
w(ritable)は、書き込み可能(2)
x(executable)は、実行可能(1)
ハイフン(-)は、権限なし(0)

このように権限は「誰は何ができる」をアルファベットで表しているのです。

権限を変更するときは4,2,1という数字を使うので、ここで抑えておきましょう。

chmodの使い方

本題であるchmodを具体的にプログラムとして解説です。

次のようなファイルをPHPのプログラムを用いて、権限を書き換えてみます。

test.txtというファイルの権限は644となっているのが分かります。

以下のPHPのプログラムで、権限を書き換えます。

そして、実行です。

 

 

確かにchmodを利用して、test.txtの権限を644から755に権限を変更することができました。

これでファイルの所有者は読み込み可能、書き込み可能から、さらに実行可能の権限が追加されたことになります。

chmodや権限に関するよくあるエラー

chmodや権限について、よくあるエラーを3つ紹介します。

「Operation not permitted」というエラーが出る場合の対処法

chmodを使っていると、

Operation not permitted

というエラーが表示されて、chmodが実行されないということがあります。

このエラーは、開発においてはよくあることです。

原因はPHPを実行するユーザにファイルを更新するだけの権限がない、ということが考えられます。

一度、ターミナルからPHPの権限を確認してみましょう。

変更するファイルに対して、PHPの権限がない場合はPHPの権限を変更する必要があります。

 

 

ファイルアップロードができないときの対処法

ファイルアップロード機能を実装したけど、うまくファイルがアップロードされない

という現象が起こることがあります。

 

例えば、ファイルアップロード機能をLaravelで実装するとした場合、外部からアップロードされたファイルは、「public/storage」や「storage/app/public」というディレクトリに保存されます。

このとき、「public/storage」や「storage/app/public」というディレクトリに書き込み可能の権限があるか、を確認しましょう。

もしかすると、書き込もうとしているディレクトリに書き込み可能の権限がない場合があります。

環境を変えてプログラムを実行すると、動作しない

実際にプログラムを開発していると、

自分の開発環境ではちゃんと動いているのに、テスト環境ではうまく動かない。

ということもよくあります。

そういうときは、テスト環境のファイルやディレクトリの権限をチェックです。

この現象の原因は、自分の開発環境とテスト環境の権限が違うことに由来していることが考えられます。

なので、権限をチェックするときは、自分の開発環境とテスト環境のファイルやディレクトリを見比べてみましょう。

ファイルの所有者を変更するchown

chownでは、所有者やグループを変更するプログラムをchmodと併せて覚えておきましょう。

ファイルには所有者と所属グループが決まっている

chownの解説の前に、簡単にファイルの所有者と所属グループについて解説です。

ファイルには権限の他に必ず、所有者と所属グループが決まっています。

以下のコマンドでファイルの権限を確認してみると、

この場合、test.txtの所有者はhogeで、グループはfugaとなります。

chownの仕様

では、chownのリファレンスを確認です。

chown — ファイルの所有者を変更する

ファイルfilenameの所有者を(名前または番号で指定した) ユーザーuserに変更しようと試みます。 スーパーユーザーのみがファイルの所有者を変更できます。

プログラムの仕様も併せて確認です。

ファイル名と所有者を引数として渡し、ブーリアン型が返ってくるようになっています。

chownの使い方

実際にchownを実行して、ファイルの所有者を変更します。

例えば、test.txtというファイルの所有者を「www-data」という所有者に変更する場合、プログラムはこうです。

実際に実行してみます。

確かにファイルの所有者を「www-data」に変更することができました。

まとめ

いかがでしたか?

今回は、【重要】chmodを使うときのポイントについてご紹介しました。

これで権限でうまくいかなかったプログラムのエラーも解決することができます。

ぜひ参考にしてみてくださいね。