今日、PHP でセッションを呼び出すと、致命的なエラー: session_start(): ストレージ モジュールの初期化に失敗しました: ファイル(session.inc.php 83 行目) が表示されました。この問題の対処方法を説明します。
元の解決策: 致命的なエラー: session_start(): ストレージ モジュールの初期化に失敗しました: ファイルの問題
以前コンパイルしてインストールした LNMP 環境 + phpmyamdin4.02 バージョンで、今日突然この問題が発生しました:
致命的なエラー: session_start(): ストレージ モジュールの初期化に失敗しました: /data/www/phpmyadmin/libraries/session.inc.php の 83 行目のファイル (パス: )
一般的な意味は、セッションの初期化時にストレージ パスが間違っているということです。最初の反応は、php.ini の設定ファイルを確認することです:
コードは次のとおりです | コードをコピー |
session.save_path = "/tmp" |
デフォルトでは、その前にセミコロンがあります。これは、以前に設定したときにすでに有効になっていることを意味します。では、なぜ依然としてエラーが報告されるのでしょうか? , そこでインターネットでいくつかの情報を探しましたが、どれも同じだと感じました:
1. error.log (Apache2.2logs) ファイルをチェックして、エラー レポートがあるかどうかを確認します。見つかりません。
2. php.ini の session.save_handler の値が files であるかどうかを確認し、そうでない場合は files に変更します
3. php.ini ファイル内で session.save_path がコメント化されているかどうかを確認し、コメント化されている場合は、先頭の「;」を削除します。
4. save_path の後のパスを「D:phptemp」などの既存のパスに変更します。
5. 一時フォルダーの属性が読み取り可能か書き込み可能かを確認します。6. APACHE サーバーを再起動します。わかりました
転載するときにその仲間たちが自分で試したかどうかは知りません(ここでスプレーしますが、私はそれが一番嫌いなので、自分で試すこともせずに広めただけです。私は責任を負いません)全部!)
上記のプロセスによると、トラブルシューティングの結果、まったく解決策がないことが判明しましたが、Puyu のサーバーは Apache ではなく nginx でした。
次に、スクリプト test.php を書きました:
$r = var_dump($r);
印刷結果は次のようになります:
警告: session_start(): SAFE MODE 制限が適用されています。uid が 501 のスクリプトは、/data/www/test.php の 3 行目で uid 0 が所有する /tmp にアクセスできません。 致命的なエラー: session_start(): 失敗しました。ストレージモジュールを初期化します: /data/www/test.php の 3 行目のファイル (パス: )
これは、php5 のセーフ モードにバグがあることを意味します。セッションのデフォルトの save_path はシステムの一時ディレクトリであり、権限の確認が必要です。そして、このスクリプトは /tmp 所有者の uid が 0 では実行できません。uid は 501 であり、www ユーザー グループの許可でもあります
この問題には 2 つの解決策があります:
1.セーフモードをオフにしてください。
2.コマンドラインで chown を使用してファイル/ディレクトリの所有者を変更します
以下は璞玉php.iniの構成ファイル:
[セッション]
;データの保存/取得に使用されるハンドラー。
; http://php.net/session.save-handler
session.save_handler = ファイル; save_handler に渡される引数。 ファイルの場合はパスです
;データファイルが保存される場所。注: Windows ユーザーはこれを変更する必要があります
; PHPのセッション関数を使用するための変数です。
;
;パスは次のように定義できます:
;
; session.save_path = "N;/パス"
;
;ここで、N は整数です。 すべてのセッションファイルを
に保存する代わりに
; /path、これは N レベルの深さのサブディレクトリを使用します、そして
;セッション データをそれらのディレクトリに保存します。 こんな方に便利です
;または、お使いの OS で 1 つのディレクトリに多数のファイルがあることに問題があり、
;多くのセッションを処理するサーバーのためのより効率的なレイアウト。
;
;注 1: PHP はこのディレクトリ構造を自動的に作成しません。
; その目的のために、ext/session ディレクトリ内のスクリプトを使用できます。
;注 2: 必要に応じて、以下のガベージ コレクションに関するセクションを参照してください
; セッションストレージにはサブディレクトリを使用します
;
;ファイル ストレージ モジュールは、デフォルトでモード 600 を使用してファイルを作成します。
;
を使用して変更できます
;
; session.save_path = "N;MODE;/パス"
;
;ここで、MODE はモードの 8 進数表現です。これに注意してください
;プロセスの umask は上書きされません。
; http://php.net/session.save-path
session.save_path = "/tmp"
; Cookieを使用するかどうか。
; http://php.net/session.use-cookies
session.use_cookies = 1
; http://php.net/session.cookie-secure
;session.cookie_secure =
;このオプションにより、PHP は保存と維持のために Cookie を取得して使用するようになります
;セッションID。戦闘に非常に役立つため、この作戦を推奨します
;独自のセッション ID を指定および管理しない場合のセッション ハイジャック。それは
;セッションハイジャック防御のすべてが終わりではありませんが、良いスタートです
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1
;セッションの名前 (Cookie 名として使用)。
; http://php.net/session.name
session.name = PHPSESSID
;リクエストの起動時にセッションを初期化します。
; http://php.net/session.auto-start
session.auto_start = 0
; Cookie の存続期間 (秒単位)、または 0 の場合はブラウザーが再起動されるまでの存続期間。
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0
; Cookie が有効なパス。
; http://php.net/session.cookie-path
session.cookie_path = /
; Cookie が有効なドメイン。
; http://php.net/session.cookie-domain
session.cookie_domain =
; httpOnly フラグを Cookie に追加するかどうか。これにより、JavaScript などのブラウザー スクリプト言語からアクセスできなくなります。
; http://php.net/session.cookie-httponly
session.cookie_httponly =
;データをシリアル化するために使用されるハンドラー。 php は PHP の標準シリアライザーです
; http://php.net/session.serialize-handler
session.serialize_handler = php
; 「ガベージコレクション」プロセスが開始される確率を定義します
;セッションの初期化ごとに。確率は
を使用して計算されます
; gc_probability/gc_divisor。ここで、session.gc_probability は分子です
; gc_divisor は方程式の分母です。この値を 1 に設定します
; session.gc_divisor の値が 100 の場合、確率は約 1% です
; gc はあらゆるリクエストで実行されます。
;デフォルト値: 1
;開発値: 1
;生産値: 1
; http://php.net/session.gc-probability
session.gc_probability = 1
; 「ガベージ コレクション」プロセスが毎回開始される確率を定義します
;セッションの初期化。確率は次の式を使用して計算されます:
; gc_probability/gc_divisor。ここで、 session.gc_probability は分子であり、
; session.gc_divisor は方程式の分母です。この値を 1 に設定します
; session.gc_divisor の値が 100 の場合、確率は約 1% です
; gc はあらゆるリクエストに対して実行されます。この値を 1000 に増やすと、次のようになります
;与えられたリクエストに対して gc が実行される確率は 0.1% です。大容量実稼働サーバーの場合、
;これはより効率的なアプローチです。
;デフォルト値: 100
;開発値: 1000
;生産価値: 1000
; http://php.net/session.gc-divisor
session.gc_divisor = 1000
;この秒数が経過すると、保存されたデータは「ゴミ」とみなされ、
;ガベージ コレクション プロセスによってクリーンアップされます。
; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime = 1440
;注意: セッションファイルの保存にサブディレクトリオプションを使用している場合
; (上記の session.save_path を参照)、ガベージ コレクションは*行われません*
; 自動的に起こります。 ゴミは自分で出す必要があります
; シェル スクリプト、cron エントリ、またはその他の方法を介して収集します。
; たとえば、次のスクリプトは
と同等です。
; session.gc_maxlifetime を 1440 に設定します (1440 秒 = 24 分):
; /path/to/sessions -cmin +24 を見つけます | xargs rm
; PHP 4.2 以前には、次のことを可能にする文書化されていない機能/バグがあります
; register_globals
の場合でも、グローバル スコープでセッション変数を初期化します。
;無効になっています。 PHP 4.3 以降では、この機能が使用されている場合に警告が表示されます。
;機能と警告を個別に無効にすることができます。このとき、
;この警告は、bug_compat_42 が有効になっている場合にのみ表示されます。この機能
;正しく処理しないと、重大なセキュリティ上の問題が発生します。それは
;運用サーバーではこの機能を使用しないことをお勧めします。でもあなた
;開発サーバーでこれを有効にし、警告も有効にする必要があります。あなたなら
;開発サーバーではこの機能を有効にしないでください。有効になっても警告は表示されません
;使用されており、これによって発生するデバッグ エラーを追跡するのは困難な場合があります。
;デフォルト値: オン
;開発値: オン
;生産価値: オフ
; http://php.net/session.bug-compat-42
session.bug_compat_42 = オフ
;この設定は、
を初期化するときに PHP によって警告されるかどうかを制御します。
;セッション値をグローバル空間にコピーします。 session.bug_compat_42 を事前に有効にする必要があります
;これらの警告は PHP によって発行できます。詳細については、上記のディレクティブを参照してください。
;デフォルト値: オン
;開発値: オン
;生産価値: オフ
; http://php.net/session.bug-compat-warn
session.bug_compat_warn = オフ
; HTTP リファラーをチェックして、ID を含む外部に保存された URL を無効にします。
;セッションが成立するには、HTTP_REFERER にこの部分文字列が含まれている必要があります
;有効とみなされます。
; http://php.net/session.referer-check
session.referer_check =
;ファイルから読み取るバイト数
; http://php.net/session.entropy-length
session.entropy_length = 0
;セッションIDを作成するためにここで指定します。
; http://php.net/session.entropy-file
; /dev/urandom がないシステムでは /dev/arandom を使用できます
; Windows では、entropy_length 設定を設定すると、
; Windows ランダム ソース (CryptoAPI を使用)
;session.entropy_file = /dev/urandom
; HTTP キャッシュの側面を決定するには、{nocache,private,public,} に設定します
;または、アンチキャッシング ヘッダーの送信を避けるために、これを空のままにしておきます。
; http://php.net/session.cache-limiter
session.cache_limiter = キャッシュなし
;ドキュメントは n 分後に期限切れになります。
; http://php.net/session.cache-expire
session.cache_expire = 180
; trans SID サポートはデフォルトでは無効になっています。
; trans sid を使用すると、ユーザーのセキュリティが危険にさらされる可能性があります。
;このオプションは注意して使用してください。
; - ユーザーはアクティブなセッション ID を含む URL を送信できます
; 経由で他の人に。メール/IRC/etc.
; - アクティブなセッションIDを含むURLが保存される可能性があります
; 公的にアクセス可能なコンピューター内。
; - ユーザーは同じセッション ID を使用してサイトにアクセスできます
; ブラウザの履歴やブックマークに保存されている URL を常に使用します。
; http://php.net/session.use-trans-sid
session.use_trans_sid = 0
;セッション ID の生成に使用するハッシュ関数を選択します。
;可能な値
; 0 (MD5 128 ビット)
; 1 (SHA-1 160 ビット)
;このオプションは、
でサポートされているハッシュ関数の名前に設定することもできます。 ;ハッシュ拡張子。利用可能なハッシュのリストは hash_algos() によって返されます
;機能
; http://php.net/session.hash-function
session.hash_function = 0
;変換時に各文字に格納されるビット数を定義します
;バイナリ ハッシュ データを読み取り可能なものに変換します。
;可能な値:
; 4 (4 ビット: 0 ~ 9、a ~ f)
; 5 (5 ビット: 0-9、a-v)
; 6 (6 ビット: 0 ~ 9、a ~ z、A ~ Z、「-」、「,」)
;デフォルト値: 4
;開発値: 5
;生産価値: 5
; http://php.net/session.hash-bits-per-character
session.hash_bits_per_character = 5
; URL リライターは、定義された HTML タグのセットで URL を検索します。
;フォーム/フィールドセットは特別です。ここにそれらを含めると、リライターは
;非表示の を追加します。それ以外の場合は追加される情報を含むフィールド
; URLに。 XHTML に準拠したい場合は、フォームのエントリを削除してください。
;たとえ値が後に続かなくても、すべての有効なエントリには「=」が必要であることに注意してください。
;デフォルト値: "a=href,area=href,frame=src,form=,fieldset="
;開発値: "a=href,area=href,frame=src,input=src,form=fakeentry"
;プロダクション値: "a=href,area=href,frame=src,input=src,form=fakeentry"
; http://php.net/url-rewriter.tags
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"故にこれは一台VPS上面に配置されており、上面には複数の项目があるため、璞玉打开一项目、発行されていますこの目的のテストコード機能は問題ありません。
以下は次の通りです:
复制幣 | |
$sessSavePath = "/data/sessions/";
// セッション保存経路 |
前述のこのコードは、session_start() の初期化の前にセッション会議が存在するかどうかを判断するためのファイルです。
これより、phpmyadmin エリアに保存されている文章/phpmyadmin/libraries/session.inc.php做了下修正:
复制幣 | |
// フェーセッションディレクトリにアクセスできません - セッションファイルが作成されていません $orig_error_count = $GLOBALS['error_handler']->countErrors(); //session_save_path('./tmp'); session_save_path("/data/www/session"); $r = セッション開始(); if ($r !== true || $orig_error_count != $GLOBALS['error_handler']->countErrors() ) { setcookie($セッション名, '', 1); /* * セッションの初期化は言語を選択する前に行われるため、 ※ここでは翻訳を使用できません。 */ PMA_fatalError('エラーなしでセッションを開始できません。PHP や Web サーバーのログ ファイルに示されたエラーを確認し、PHP インストールを適切に設定してください。また、ブラウザで Cookie が有効になっていることも確認してください。'); } unset($orig_error_count); } その他 { session_save_path("/data/www/session"); セッション開始(); } |
この問題は私たちが少しの間解決したので、翌日にこの会議が役立つと報告しました。
助けがある場合は、発言を残します。