ホームページ  >  記事  >  バックエンド開発  >  PHPセッションが機能しない場合の対処方法

PHPセッションが機能しない場合の対処方法

藏色散人
藏色散人オリジナル
2020-09-28 09:04:143336ブラウズ

php セッションが機能しない場合の解決策: まず、php 構成ファイルを開き、次にセッション関連の構成項目を見つけ、次に新しいセッション ファイルを作成して権限を設定し、最後にファイルを再アップロードします。

PHPセッションが機能しない場合の対処方法

推奨: 「PHP ビデオ チュートリアル

PHP プロジェクトでのセッション エラーを解決する方法

今日、仕事が終わってシャトルバスに乗りました。駅に着こうとしたところ、前の会社のリーダーからQQメッセージが届きました。これは火事の鎮火を意味します。バスを降りた後、 , 戻ってきて、コンピューターで詳しく尋ねました。リーダーの説明は次のとおりです。

このアドレス、テスト用紙をアップロードしてタスクを公開した後、セッションがいつ消えたのかを教えてください。解答用紙の設定

このプロジェクトの背景は当初すべて私が担当し、一人で開発したため、問題はすぐに発見されました。プロセスは: ユーザーが js コンポーネントを介してテスト用紙をアップロードします。テスト用紙をアップロードする方法では、セッションを使用して、アップロードされたばかりのテスト用紙の詳細情報 (名前、サフィックス、ファイルに保存されている ID など) を保存します。アップロードが成功したら、ページ上の学校、学年、難易度などのその他のオプションをクリックし、最後に送信をクリックします。送信の処理方法では、最初に、アップロードしたばかりのセッション値が存在します。存在しない場合は、テスト用紙のホームページにジャンプします。このメソッドで $_SESSION を出力しましたが、値がありませんでした。これは奇妙でした。以前は正常に動作していました。そこで、いつから始まったのか聞いてみると、午後の仕事を終えようとしたときに先生から電話があり、テスト用紙のアップロードと解答用紙の設定が失敗し、ジャンプが続いているとのことでした。そこで、サーバー環境が変更されたかどうかを再度尋ねましたが、リーダーは「変更していません」と答えました。

問題があるので解決しましょう。この時期にたまたま「PHP Core Technology and Best Practices」という本を読んでいたのですが、セッションとCookieについて詳しく解説されており、両者についての理解も深まりました。そこで、まずphpの設定ファイルを開いてセッション関連の設定項目を探したところ、session.save_pathが/data2/sessionになっていたのですが、以前は/data1/sessionに設定されていた記憶があるのですが、どう変わったのでしょうか?そこで終了してパスを確認しました。最初はディレクトリの権限が不十分だと思いましたが、後でそのようなディレクトリがまったくないことがわかりました。各セッションがページにまたがらないのも不思議ではありません。そこで、新しいファイルを作成し、権限を設定し、再度アップロードすると、すべてが正常に戻りました。

これを書いているので、セッション関連の技術的な点についても話したいと思います。セッションはサーバー側に保存され、デフォルトではファイルに保存されます (session.save_handler = files)。では、セッションはどのように生成されるのでしょうか?セッションは session_start() 関数を通じて生成されます。この関数が実行されると、セッションが保存されているディレクトリにファイルとそれに対応する一意のセッション ID が生成されます。セッション ファイルのデータは、セッション ID を通じて取得できます。 。 session_start() が実行されるたびに新しいセッション ファイルが生成されるため、以前に生成されたセッション ファイルを使用するにはどうすればよいでしょうか? session_id($session_id) だけを使用すると、セッション ファイルは新たに生成されませんが、それに対応するセッション ID は生成されます。セッションファイルが読み取られます。デフォルトでは、セッション ID はクライアント (ブラウザ) の Cookie を使用してセッション ID を保存します (Chrome ブラウザで F12 を押し、Resources-Cookie をクリックするとわかります)。 $_COOKIE['PHPSESSID'] を使用して取得できます。その PHPSESSID はセッション ID のデフォルト名です。php.ini の session.name で設定できます。セッション ID の名前を取得するには、スクリプト内で session_name() を使用します。ブラウザがサーバーと通信するたびに、ブラウザはセッション ID をサーバーに渡し、サーバーは渡されたセッション ID に基づいて対応するセッション ファイルを見つけ、対応する情報を取得し、関連する操作を実行します。クライアント(ブラウザ)が Cookie を無効にすると、サーバーはセッション ID を受信できなくなるため、このときセッション ID を明示的に渡す必要があります。 2 つの方法: URL を通じてセッション ID を手動で渡すか、非表示のフォームを通じてセッション ID を渡します。上記の 2 つの方法では、サーバーの PHP 環境の session.use_trans_sid 値が 1 である必要があります。

これほどくどい話をした後、最終的に出たのは「話は安い、コードを見せて」というライナスの言葉でした。

<?php
session_start();
$_SESSION[&#39;arr&#39;] = array(&#39;name&#39; => &#39;molaifeng&#39;, &#39;hobby&#39; => &#39;php&#39;);
?>
<a href="testSession.php?<?php echo session_name(); ?>=<?php echo session_id()?>">testSession</a>
<?php
 
session_start($_REQUEST[session_name()]);
print_r($_SESSION);

コードは理解できると思いますので、説明は省略します。

最後に、要約すると、クロスページ セッションの失敗は通常、上記の点が原因で発生します。 1. session.save_path が正しくない (権限が不十分であるか、ディレクトリが存在しないなど) 2. サーバー PHP 構成の session.use_trans_sid 値が 0 である; 3. クライアントで Cookie が無効になっている。しかし、最初の状況の頻度はかなり高いはずだと思います。

【2018-05-21更新】

金曜日の夜にオンラインにアクセスすると、別の罠に遭遇しました。このフレームワークは CI を使用し、セッションは MySQL テーブルに書き込みます。最初は、上記の症状と全く同じだったので、sessionディレクトリをリセットし、該当する読み書き権限を与えましたが、何も起こりませんでした。その後、そのテーブルがメモリテーブルであることが分かり、メモリテーブルの最大値を超えていると思い、テーブルをクリアしましたが、問題は解決しませんでした。最後に、2 つのバージョンの違いを比較した結果、セッションを保存するときに 2 つの新しいフィールドが追加されたことがわかりました。そのため、消去法を使用し、最初に両方に注釈を付け、次にそれらを 1 つずつ開き、最終的に問題を特定しました。新しく追加された値は、型テーブルのすべての値を保存するために使用されることがわかりました。最初にテストしたときは、数個の値しかありませんでした。その後、オンラインになると、100 個以上の値が保存されました。同時に、フィールドのサイズは 3000 しかありませんでした。バーストしていたに違いありません。そこで、まずフィールドのサイズを大きくしてオンラインで検証できるようにし、次にテーブル内のすべての値が書き込まれないように関連するロジックを変更しました。

以上がPHPセッションが機能しない場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。