[PHP]PHPのCGIモードで出たエラー

Read More

ローカル環境で、とあるサイトを触ろうと思ったらSQLiteのデータをうまく読み込まない現象に遭遇した。


あれれ?


ログを見ると下記のようなエラーが出てた。
malformed database schema - unable to open a temporary database file for storing temporary tables



なんだこれ??
今まで見たことないな。

ApacheとかPHPの設定の変更を最近したっけかな~?




そう、結果から言うと
PHPの動作モードを通常のもの(Apacheモジュールモード)からCGIモードに変えたことに起因するエラーだった。
# モジュールモードとCGIモードについてわかりやすくまとめてくれてるサイトがあった。
* 小粋空間:PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
http://www.koikikukan.com/archives/2007/01/29-015501.php


どうやらCGIモードだとディレクトリを触る権限(書き込み権限)がないので、別途Apacheの設定を変更してやる必要があるぽい。


以下、それに関する記事の抜粋。
権限を持たないアカウントに対する Windows 版のインストール: Windows オペレーティングシステムでは、権限のないアカウントは デフォルトで設定される TMP 環境変数を利用できません。 
これにより SQLite は Windows ディレクトリにテンポラリファイルを作成しますが、 望まれるものではありません。 
そのため Web サーバもしくは Web サーバが動作しているユーザーアカウントに対して TMP 環境変数を設定すべきです。 
もし、Apache を使用しているなら、httpd.conf ファイル内で SetEnv ディレクティブを使用することで実現可能です。 
例えば、次のような感じです。 

SetEnv TMP c:/temp

もしサーバレベルでこの設定を行うことができないのであれば、 スクリプト内で設定することができます。

putenv('TMP=C:/temp');

この設定は Web サーバがファイルを生成した後で書き込んだり削除したりする 権限を持たせるディレクトリを指定する必要があります。
そうでない場合、次のようなエラーメッセージを受け取るでしょう。 
malformed database schema - unable to open a temporary database file for storing temporary tables 
†PHPマニュアル SQLite 関数 より
http://www.phpmanual.jp/ref.sqlite.html



CGIモードにしたのはmemcachedを勉強してたからだけど、
既にWindowsでmemcachedの環境を構築するのが無理っぽいという結論に達した。
※memcachedとmemcacheは似て非なるモノ


なので、もはやローカル環境がCGIモードである必要はない。


ってことでApacheの設定ファイル(Xampp環境なのでapache/conf/extra/httpd-xampp.conf)を触ってCGIモードからモジュールモードに戻した。


そうするとSQLiteがまた正しく動くようになった。






Linux系で動作モードを切替えた時、実行ユーザとそのパーミッションについて変化があるのはわかっていたが、
Windowsなのでついつい権限なんてあってないようなものだと考えていた。


今回の件の 問題の根本はそこにある。