ホームページ >バックエンド開発 >PHPチュートリアル >session_destroy() はすぐには有効になりません

session_destroy() はすぐには有効になりません

WBOY
WBOYオリジナル
2016-06-23 13:55:481344ブラウズ

PHP ページにリンクするには、HTML で 3499910bf9dac5ae3c52d5ede7383485 を使用します。PHP ページはセッションを破棄しますが、ページを開いたときにセッションを破棄するには、PHP ページを再度更新する必要があります。このページには 2 つのステートメントのみがあります: $_SESSION = array();session_destroy(); session_start() が開かれました。
状況は何ですか?


ディスカッションに返信します (解決策)

ページ B で session_destroy() を実行する前にセッションは当然存在します。それ以外の場合は session_destroy(); する必要はありません。ページ B に再度入ったときのみ (更新など)、セッションがなくなっていることがわかります

ユーザーにとって、session_destroy() は Cookie 内のセッション ID をログアウトする命令を送信するだけだからです

a.php

<?phpsession_start();$_SESSION['name'] = "kobe";?><a href="se2.php">se2</a>


b.php

<?phpsession_start();$_SESSION = array();session_destroy();var_dump($_SESSION['name']);?>


A ページ B にジャンプしてセッションを破棄し、同時にページ B はログイン ページにジャンプします この時点ではまだセッションが残っています

この状況です。

最初にアクセスすると、a.php -> b.php -> セッションが消えます。

a.php

<?phpsession_start();$_SESSION['name'] = 'fdipzone';?><a href="b.php">go b</a>

b.php
<?phpsession_start();session_destroy();?><a href="login.php">go login</a>

login.php
<?phpsession_start();echo 'name='.$_SESSION['name'];?>


その理由は破棄の問題ではないことがわかりました。ユーザーがログインすると、無限ループを実行する php ページが表示されます。このループでは、ユーザーが現在のページを離れるまで、ユーザーのログイン時間が 30 秒ごとに更新されます。

while(true) {	echo "\n";	ob_flush();	flush();		if(connection_aborted()) exit;        /*这里是将当前时间写入到数据库*/	sleep(30);}



ここで ob_flush();flush(); を削除すると問題は解決しますが、この場合 connection_aborted() は有効にならず、ユーザーがページを閉じた後も時刻は更新され続けます。 。しかし、これらの 2 つの文を追加すると、セッションを破棄できなくなり、手動で f5 キーを押して削除する必要があります

これを解決するにはどうすればよいですか?

?なぜ死のサイクルを止めなければならないのでしょうか?


?なぜ終わりのないサイクルを続けなければならないのでしょうか?

ユーザーが常にオンラインの場合、データベースへのログイン時刻を更新します。


この場合、もちろん、現在のセッションは終了しません。 。

その後、ページは実際には決して終了せず、もちろん現在のセッションは消えません。

connection_aborted() 文はクライアントが切断されているかどうかを確認できますが、その実行にはページにコンテンツを出力する必要があるため、ob_flush();flush();

問題は、これら 2 つの文によりページがセッションを破棄することです。つまり、セッションを手動で更新してセッションを破棄する必要があります


それで、クライアントが切断されたときにこのループを閉じる他の方法はありますか。それともセッションを破棄するページを正常に実行する他の方法はありますか?
この問題は ob_flush();flush(); によって引き起こされますか?私たちは何をすべきか?

ユーザーが長期間ログインしない場合にオフラインに追い出されるのを防ぐためにこれを行っています。他に方法はありますか?

その後、ページは実際には決して終了せず、もちろん現在のセッションは消えません。


connection_aborted() 文はクライアントが切断されているかどうかを確認できますが、その実行にはページにコンテンツを出力する必要があるため、ob_flush();flush();

問題は、これら 2 つの文によりページがセッションを破棄することです。つまり、セッションを手動で更新してセッションを破棄する必要があります


それで、クライアントが切断されたときにこのループを閉じる他の方法はありますか。それともセッションを破棄するページを正常に実行する他の方法はありますか?
この問題は ob_flush();flush(); によって引き起こされますか?私たちは何をすべきか?

ユーザーが長期間ログインしない場合にオフラインに追い出されるのを防ぐためにこれを行っています。他に方法はありますか?

ページは終了しておらず、現在のページのセッションはファイルに更新されていません。これが、session_destroy() がすぐには有効にならない理由です。
この問題を解決するには、 session_destroy(); の後に session_write_close(); を追加します。


実際、ページは決して終了せず、もちろん現在のセッションは消えません。


connection_aborted() 文はクライアントが切断されているかどうかを確認できますが、その実行にはページにコンテンツを出力する必要があるため、ob_flush();flush();
問題は、これら 2 つの文によりページがセッションを破棄することです。つまり、セッションを破棄するには手動で更新する必要があります


それでは、クライアントが切断されたときにこのループを閉じる他の方法はありますか。それともセッションを破棄するページを正常に実行する他の方法はありますか?
この問題は ob_flush();flush(); によって引き起こされますか?私たちは何をすべきか?

ユーザーが長期間ログインしない場合にオフラインに追い出されるのを防ぐためにこれを行っています。他に方法はありますか?



ページは終了しておらず、現在のページのセッションはファイルに更新されていません。これが、session_destroy() がすぐには有効にならない理由です。
この問題を解決するには、 session_destroy(); の後に session_write_close(); を追加します。

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