ロリポップでPHPを使うときにぶつかるパーミッションの壁 (2/2)

ロリポップでPHPを使うときにぶつかるパーミッションの壁(1/2)の続きです。
前回はパーミッションの基本を理解しいている範囲でということで書きました。
今回はPHP関連のパーミッションの設定について。

例を挙げたほうがわかりやすいと思うので、次のようなファイル構成を持つ簡単なアプリケーションの場合を考えます。index.phpは商品データを登録するスクリプトで、商品データをitem.csvというファイルで保存するものだとします。item.csvはdataというディレクトリに入ります。ファイル構成は次のようにします。

  • index.php
  • data
    • item.csv

ロリポップではPHPファイルは「644」または「604」で動作するようなので特に問題はありません。普通にファイルをサーバーにアップロードするだけでいいようです。ただ、できれば「604」にしたようがいいかもしれません。

ロリポップサーバーではPHPファイルパーミッションは「604」

パーミッションで引っかかるのはPHPから作成されるファイルがあるときです。例のようなものではitem.csvがこれにあたります。このファイルは商品の登録時にindex.phpから読み込みまたは書き込みをする必要があります。はじめてデータを登録するときにはスクリプトからitem.csvを作成することから始めるかもしれません。

例のようなデータファイルやログファイルなどをPHPから作成するときはそのデータを入れておくディレクトリのパーミッションにも注意しなければなりません。このときのディレクトリのパーミッションは「707」になります。そうしないとPHPからディレクトリ内のファイルにアクセスすることができません。

読み書きを必要とするファイルを収納するディレクトリは「707」

さらに書くとitem.csvのようなPHPスクリプトから作成~読み書きをするファイルのパーミッションは「606」にしないと「Permission denied」というエラーがでてしまします。

読み書きをするファイルは「606」

なぜ「Permission denied ~」といったエラーがでるかというと次のことに基づいているようです。
モジュール版のPHPは「apache権限」で動作する

ファイルには誰がそのファイルの持ち主かということを表わす「所有者」という項目があります。(ロリポップFTPではわからないのでFFFTP等で確認。)
アップロードしたファイルやディレクトリは所有者が「lolipop.jp-dp+自分のID」という英数字で表わされています。つまり自分のことです。
しかし、PHPから作成されたファイルは所有者が「apache」になります。よってパーミッションの一番右の桁に「読込み権限」+「書き込み権限」=「6」を与えないとファイルを書き換えることが出来ません。

これが「apche権限」で動作するということのようです。ディレクトリに「707」を与えるのも同じ理由だと思います。

以上をまとめると

  • PHPファイルは「604」
  • 読み書きするファイルは「606」
  • 読み書きするファイルを収納するディレクトリは「707」

となります。

PHPからファイルを作成する時の注意

最後に気づいたことを追記しておきます。

PHPからファイルを作成するときはchmod関数でパーミッションを明示する

もし、「644」や「604」でファイルを作成してしまった場合、所有者が「apache」のためFTPソフトからパーミッションを「606」等に変更することができない。削除はできるようです。

「まだまだ勉強不足で理解が間違っていたり、言葉足らずな部分もあると思うので、間違っている箇所は指摘していただけると幸いです。」

そうのひとりごと

© 2017 PAOLOG