いつまで経っても「CGIモード」が理解できないので、気付いたことをメモしていくエントリー

CORESERVERCGIモード

3種類

 状態:終了  閲覧数:5,738  投稿日:2010-11-15  更新日:2013-11-27
1.モジュール版
2.モジュール版(セーフモード)
3.CGIモード


仕様


1.「モジュール版」「CGI版」併用不可
・「モジュール版」「CGI版」PHPを併用してセッションを引き継ぐとエラー
・これはCGI版では、セッションファイルが、/tmp/にて、FTPユーザー権限で書きこまれ、一方モジュール版ではApacheユーザー権限で書きこまれるため
※CGI版PHPで作成されたセッションファイルをモジュール版PHPから読み込む際にパーミッションエラーとなる。逆もまたしかり

2.PHPのCGIモードでは、(PHPによる)基本認証は使用不可
Basic認証自体はHTTPリファレンスで定義済だが、PHPによるBasic認証は、Apacheモジュールとして実行した時のみ有効で、CGI版では利用できない


モジュール版モードで、セッションエラーが出る理由

 閲覧数:327 投稿日:2010-11-15 更新日:2013-11-27

お題


モジュール版モードで、セッションエラーが出る理由
Warning: session_start() [function.session-start]: open(/tmp/sess_○○, O_RDWR) failed: Permission denied in
・モジュール版モードでは、セッションファイルがApacheユーザー権限で書きこまれるが、セッションディレクトリのパーミッションがPHP実行時のユーザーと異なる場合、PHPからセッションファイルの書き込めが行えないため、読み込む際にパーミッションエラーとなる


対策A


・CGIモードにする


対策B


・セッションディレクトリ(セッションファイルの保存ディレクトリ)を作成し、パスを指定

B-1.セッションディレクトリ作成
・PHPのセッションファイルが保存されるディレクトリ(以下セッションディレクトリ)を変更
・具体的には、ユーザーディレクトリ以下にセッションディレクトリを作成することで、正常に動作するようになる
・ユーザーディレクトリ以下の非公開領域にtmpなどのディレクトリを作成し、パーミッションを書き込み可能に変更(705, 755など)
/virtual/ユーザー名/tmp 

B-2.セッションディレクトリ指定
・session.save_pathで、セッションディレクトリを指定
方法a php.iniファイル作成
 session.save_path = /virtual/ユーザー名/tmp
方法b .phpファイルでini設定
 ini_set( 'Sessions.Save_Path' , '/virtual/ユーザー名/ディレクトリー' );
 →うまくいかず 
方法c .htaccess作成
 php_value session.save_path "/virtual/アカウント/public_html/任意ディレクトリ名/tmp"
・モジュール版とCGI版のPHPを合わせて使って、セッションが引き継がれるとエラーが出る
・これはCGI版では、セッションファイルが、/tmp/にて、FTPユーザー権限で書きこまれ、一方モジュール版ではApacheユーザー権限で書きこまれるため
※CGI版PHPで作成されたセッションファイルをモジュール版PHPから読み込む際にパーミッションエラーとなる。逆もまたしかり

自分が試した状況で言うと、
セッションファイルの保存先を、「モジュール版・CGI版」双方ともに、全く同じ場所(ユーザー領域の/tmp/)にしても、
それぞれのモードを変更すると、読み込む際にパーミッションエラーとなるってことかな。
理由は、
・モジュール版 … Apacheユーザー権限で書きこまれる
・CGI版 … FTPユーザー権限で書きこまれる

久しぶりに、.htaccessで、php_value session.save_pathを作成したら、
うまくいかなかった。
tmp/以下にセッションファイルが保存されているのになんで、
と思ったら、保存時間を設定していないから?
php_value session.save_path /virtual/ユーザー名/ディレクトリー
php_value session.name SES1
php_value session.cookie_lifetime 3600
でいけた

今日の結論
.htaccessに記述する際は、「session.name」も必要
理由⇒不明

動作する例
php_value session.save_path /virtual/ユーザー名/lib/tmp
php_value session.name hoge
php_value session.cookie_lifetime 3600

動作する例
php_value session.save_path /virtual/ユーザー名/lib/tmp
php_value session.name hoge

<動作しない例>
php_value session.save_path /virtual/ユーザー名/lib/tmp

動作しない例
php_value session.save_path /virtual/ユーザー名/lib/tmp
php_value session.cookie_lifetime 3600

php.iniも試したが、エラー消えず。
PHPファイル自体にも記述してみたが、エラー消えず。

今回、PHPファイルで「session.name」の挙動を確かめたかったのだが、
モジュール版(セーフモード)で動作させようとすると、
.htaccessにセッション名を直書きする羽目に陥るため、確かめられない。

結局、いつものように、CGIモードでいくこととなった…



▼22:11追記
PHPファイルに、普通に
session_save_path( "/virtual/ユーザー名/lib/tmp" );
って書いたら、セッションデータ保存先が変更された。

ini_set とか、いらんやん!
ここら辺、いつまで経っても使い方が分からんわ。

だけど、ファイルに書いてくと、
違うところで、保存先が、デフォルトの/tmpとぶつかりそうな気がする。

ファイルに書いてる=「そのファイルのときだけ、セッションデータ保存先が変更された」
=「それ以外はデフォルトのまま」
って気もするんだけど…。

後、ネットで、CGIモードとモジュール版とで、
同じセッションでも、保存先が変わってたら、セッション情報が引き継がれない、
てのを見かけた気がするのだが、それとはちょっと違う現象に遭遇。

具体的には、同じ保存先でも、CGIモードで保存したセッション情報は、モジュール版に引き継がれない。
逆もまた然り。

こんな感じ。

<CGIモード>
・session_save_path( "/virtual/ユーザー名/lib/tmp" );で、セッションデータ保存先を変更
・.htaccessで、CGIモードを解除したら、open(/virtual/ユーザー名/lib/tmp/sess_○○, O_RDWR) failed: Permission deniedエラー

<モジュール版>
・session_save_path( "/virtual/ユーザー名/lib/tmp" );で、セッションデータ保存先を変更
・.htaccessで、CGIモードへ変更すると、open(/virtual/ユーザー名/lib/tmp/sess_○○, O_RDWR) failed: Permission deniedエラー


何れの場合も、「Permission denied」ってことで、セッションデータのパーミッションを変更しようとするも、
これが変らないんだな全く、600から。

きっと、セッションファイルが、Apacheユーザー権限で書きこまれるから、とか何か理由があるのかもしれないが、
セッションディレクトリのパーミッションをいくら上げても、ファイル自体のパーミッションは変えらないのね。

ここら辺が共有サーバの限界かな、と思ったり、
…思わなかったり…、
はっきり言って、何がどうなっているのか、よく分かりません…。

あー、そうだ。
セッションファイルの容量が0で、ダウンロードできない理由も、分からないなァー



まあ、いいや、

いずれにしても、この辺り、
共有サーバの限界ということにして、
先へ進もう



2012/4/23
CGIモードを回避したいサイトがあったので、このエントリーを見ながら再度挑戦。
1.セッション保存ディレクトリを、ユーザー領域へ作成
  /virtual/ユーザ名/lib/sessiontmp/

2.パミッション777「sessiontmp」ディレクトリ

3.「.htaccess」作成 … ドキュメントルート直下
php_value session.save_path /virtual/ユーザ名/lib/sessiontmp
php_value session.name セッション名
php_value session.cookie_lifetime 3600
※セッション名が必要な理由は、恐らく、(自分の)他サイトとの競合を避けるため。
  save_pathを変更すれば、セッション名を指定しなくても良いかどうかは、未確認

これで取りあえずうまくいったっぽいのだが、
作成されたファイル名は、「sess_6l844hakk2e2r6h2qafvaf3hr0」。
セッション名は指定した名前に変更されていないし、32文字じゃないし、
おまけに中身を確認しようにもダウロードも表示もできない。それこそ、FileZillaでもFFFTPでも…。
どゆこと?

作成されたセッションファイルが、削除は出来てもFTPダウンロード出来ない理由は、
オーナーがapacheなためらしい。

権限変更できないの?
ちょっと落として、中身を確認してみたいんだよねー。

滅多にログインしない「ファイルマネージャ」へアクセスして、権限変更したつもりが、
エラーが発生しました:
Unable to execute site command chmod 0777 /lib/sessiontmp/sess_6l844hakk2e2r6h2qafvaf3hr0. Note that the CHMOD command is only available on Unix FTP servers, not on Windows FTP servers.
だって…。

「ツール」「ファイル所有者の修正」クリック。
しばらく待ってたら、ようやくダウンロードできた。

気になる中身は、と言うと、普通にセッションの中身だった。
SCRIPTQUIZ|a:1:{s:7:"modules";a:1:{s:3:"mcq";s:15:"modules/mcq.php";}}

つまり、セッション名が変更されない理由は不明。

何れにせよ、セッション名が変更されないのなら、わざわざ書く必要ないやんね。
試しに外してみる。

今度は、「sess_leoavujtn4gc5s5nlad1ls39i4」が作成された。

で、今、
「sess_6l844hakk2e2r6h2qafvaf3hr0」
「sess_leoavujtn4gc5s5nlad1ls39i4」
があるのだが、この意味は、二つのセッションが有効、ということなのだろうか?

「セッションファイル」が作成されるタイミングが、もう一つ良く分からない。

ちょっと待って。
今、何か、目の前で、自分のイメージと全然違うコトが展開されているんだけど。

整理
<自分のイメージ>
・「php_value session.save_path」ファイル名(指定したセッション名+32文字列)のファイルが、指定ディレクリへ保存されると思っていた

<現状>
・指定ディレクリへ保存されているファイル名は、「sess_○○」

PHPファイルに直書<?=session_name()?>
・「.htaccess」に、「php_value session.name」記入 … その名前
・未記入 … デフォ(PHPSESSID)

Chromeで調べてると、
Cookiesの名前が、それぞれ「session_name」に該当している。

頭が混乱してきた。
落ち着け、オレ。

まず、「php_value session.save_path」でファイルが作成されるのは、
「session.save_handler」のデフォルトがfileなため。
つまり、/virtual/ユーザ名/lib/sessiontmp/へ作成されたファイルは、
「セッション情報を格納したセッションファイル」。

次に、「セッション情報を格納したセッションファイル」のデフォルトファイル名は、
「sess_セッションID」。
つまり、「session.nameで指定したセッション名」とは全く関係がない。

ちなみに、「変更したセッション名」がどこへ格納されているか、と言うと、

と言うか、そもそも「セッション名」とは、
セッションを開始した際にクライアントのクッキー名として利用される名前。
つまり、「セッション名」=「(特定の)クッキー名」なんだね。
だから、「セッション名」は、「セッションファイル」のファイル名にもならないし、
ましてや、その中身に記述されるわけでもない。だって、クッキーなんだもん。
マジッすか。
「セッション名」が単なる「クッキー名」だったことに、非常に驚く
※デフォルトでは「PHPSESSID」。デフォルト値はphp.iniで設定

とりあえず、下記で整理。
セッション基本用語一覧

後、セッションクッキーなのに、意味なく保存期間を設けるのもどうよ? と思い、この記述は外す
php_value session.cookie_lifetime 3600




類似度ページランキング
順位 ページタイトル抜粋
1 いつまで経っても「CGIモード」が理解できないので、気付いたことをメモしていくエントリー 82
2 「ImageMagick」を「セーフモード」で動作させようとするも、うまくいかず 33
3 バリュードメインの転送なし、ありの違い 32
4 覚えのないドメイン期限のお知らせを2つ受信。確認するも「管理者が一致しません」と表示される。他人のドメイン料金を私の口座から引き落としていませんか? 31
5 急に、FTPでファイルがアップロードできなくなった。 29
6 rsyncエラーを解決できない 27
7 CORESERVERで動作させることが出来なかったスクリプト 27
8 PHPをCGIモードで動作させる 27
9 VALUE DOMAIN経由で、eNom からドメイン名を購入した場合は、access.enom.com で自分のアカウントへログインすることが出来る 25
10 3日で出来ないPHPアプリケーション……試行錯誤メモ3 23
11 3日で出来ないPHPアプリケーション……試行錯誤メモ4 23
12 dumpデータが取得できない 21
13 「DNS ルックアップでエラーが発生」 … 特定サイト 20
14 レンタルサーバー「VALUE SERVER」PHP5.4(セーフモードなし) 20
15 ドメインを異なるユーザーへ移動させる 19
16 「XREAアカウント名以外」のデータベース名 18
17 登録できる「CRONショブ」数には上限がある 18
18 FTPアップロード不可/残り容量があるのに、 Disk quota exceededとなるのは、なぜでしょうか 18
19 XREAプラス MySQL5以上じゃないとUNICODEで保存できない 18
20 3日で作るPHPアプリケーション……試行錯誤メモ1 17
2024/4/20 14:32 更新