PHP開発では、ユーザーのステータスを維持するための重要な手段です。多くの場合、開発者はセッションデータの損失の問題に遭遇し、ユーザーに情報、ショッピングカートのコンテンツ、その他の重要なデータが正常に保存され、エクスペリエンスは非常に悪いです。同様の状況に遭遇しましたか?実際、問題は、session_register_shutdown()関数を正しく使用していない可能性が最も高いことです。
session_write_close()は時間内に呼び出されませんでした
PHPは、スクリプトの最後にセッションデータを自動的に保存しますが、スクリプトが早すぎる、または異常に実行された場合、セッションは時間内に記述されない場合があります。
同時リクエストにより、セッションファイルがロックされます
PHPのセッションはファイルロックメカニズムです。複数のリクエストが同じセッションを同時に操作する場合、閉塞または損失さえも引き起こす可能性があります。
セッション関数の誤った使用<br> たとえば、 session_destroy()が最初に呼ばれるか、 session_start()が呼び出された後にセッションが正しく処理されません。
session_register_shutdown()は、php 7.0.0に追加された新しい関数です。セッションを自動的に閉じるコールバックを登録し、セッションデータがスクリプトの最後にストレージに正しく書き戻されるようにします。
言い換えれば、プロジェクトでカスタムセッション処理メカニズムまたは長期にわたるスクリプトを使用している場合、 session_register_shutdown()を正しく呼び出すことで、セッションの書き込みプロセスが見逃さないようにします。
session_register_shutdown()を正しく使用する例は次のとおりです。
<?php
// 開ける session
session_start();
// 登録スクリプトが終了したときに自動的に閉じます session,データが記述されていることを確認してください
session_register_shutdown();
// 設定 session データ
$_SESSION['user'] = 'チャン・サン';
// 他のビジネスロジックはここで省略されています
// 手動電話は必要ありません session_write_close(),自動的に実行されます
?>
注:
この関数は、session_start()が呼び出された後にのみ呼び出すことができます。
競合を避けるために、同じスクリプトでsession_register_shutdown()を呼び出し、 session_write_close()を手動で呼び出すことはお勧めしません。
伝統的な執筆方法は、セッションデータを作成した後、開発者に手動で電話をかけることです。
<?php
session_start();
$_SESSION['key'] = 'value';
// 手動で閉じます session,書き込みを確認してください
session_write_close();
?>
しかし、スクリプトが長い場合、または複数の場所でセッションを書くことを伴う場合、執筆を逃す可能性があります。 session_register_shutdown()を使用して、PHPはスクリプトの最後に自動的に呼び出します。
すべての入り口でsession_start()が呼び出されていることを確認してください。
同じセッションを操作するための同時リクエストを避けたり、同時性中にロックメカニズムを合理的に設計したりします。
セッションを変更した後、 exit()を呼び出しないでください。これにより、スクリプトの最後にセッションの保存がスキップされます。
データベースやRedisなどの安定したセッションストレージメソッドを使用します。
上記は、セッションデータが失われる理由と、 session_register_shutdown()関数を使用する正しい方法です。セッションの問題に遭遇した場合は、このシンプルで効果的な機能を試して、PHPセッションをより安定して安全にすることもできます。
<?php
// セッションを開始します
session_start();
// 登録スクリプトが終了したら、自動的に書き戻します session データ
session_register_shutdown();
// 示例設定 session 価値
$_SESSION['username'] = 'demoUser';
// ビジネスコード...
?>
関連タグ:
session