php/ajaxでチャットを作成しています。ユーザーのタイムアウトを検出するために、私は5秒間アクティビティがない場合にユーザーを切断するバックグラウンドのPHPスクリプトを作成しました。PHPセッションが更新されていません
セッションでの変数が更新されない問題は、...ここ
は、すべてのAjax問い合わせは(少なくとも1秒あたりに、クライアントごとに)実行され、私のchat.phpです:
ここで<?php
session_save_path("sessions");
session_start();
$_SESSION['last_request'] = time();
が、私はこのchat.phpからのバックグラウンドスクリプトを起動する方法です:
exec('php user_manager.php ' . session_id() . ' > /tmp/output &');
そして、ここでは、ユーザはまだここにいるかどうかを確認するために私のループである(これは、バックグラウンド・プロセスである):
<?php
session_save_path("sessions");
session_id($argv[1]);
session_start();
ignore_user_abort(true);
set_time_limit(0);
echo "background task starting on user " . $_SESSION['user'] . PHP_EOL;
$lastrequest = $_SESSION["last_request"];
while(time() - intval($lastrequest) < 5) { //5 seconds
echo "last_request : " . $lastrequest . PHP_EOL;
$lastrequest = $_SESSION["last_request"];
sleep(1);
}
echo "disconnecting user !" . PHP_EOL;
そして、あなたが見ることができるように、last_requestセッション変数が更新されることはありません:
# cat /tmp/output
background task starting on user test
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
last_request : 1493120020
disconnecting user !
を私はなぜ理解していない、それは狂気私を運転です...助けてください!
'$ _SESSION'戦争は唯一、一度満たされています。他の誰かがセッション変数を変更したときにスクリプトを実行すると、この変更はあなたの現在のスクリプトに反映されません。 – Philipp
@Philippこれは同じスクリプトを呼び出すのと同じユーザなので、同じセッションを持つ可能性があります – ShellCode
セッションを開くスクリプトではブロックされているため、同時に2つのスクリプト/要求が同じセッションにアクセスすることはできません。セッションが開かれたら、もう一方の要求は最初のスクリプトが終了するまで待たなければなりません。 – jeroen