2017-04-25 15 views
0

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 ! 

を私はなぜ理解していない、それは狂気私を運転です...助けてください!

+0

'$ _SESSION'戦争は唯一、一度満たされています。他の誰かがセッション変数を変更したときにスクリプトを実行すると、この変更はあなたの現在のスクリプトに反映されません。 – Philipp

+0

@Philippこれは同じスクリプトを呼び出すのと同じユーザなので、同じセッションを持つ可能性があります – ShellCode

+0

セッションを開くスクリプトではブロックされているため、同時に2つのスクリプト/要求が同じセッションにアクセスすることはできません。セッションが開かれたら、もう一方の要求は最初のスクリプトが終了するまで待たなければなりません。 – jeroen

答えて

1

$ _SESSION配列はsession_startで開始されますが、その後はユーザーチャットスクリプトによって変更されません。 chat.phpが最後のアクセス時間を書き込むセッションごとにファイルを使用する必要があります。バックグラウンドプロセスは、このファイルをwhileブロックで読み取る必要があります。

チャットスクリプト:

<?php 
session_save_path("sessions"); 
session_start(); 
file_put_contents('access_' . session_id() . '.txt', time()); 

バックグラウンドプロセス:スクリプトを呼び出すとき

<?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 = file_get_contents('access_' . session_id() . '.txt'); 

while(time() - intval($lastrequest) < 5) { //5 seconds 
    echo "last_request : " . $lastrequest . PHP_EOL; 
    $lastrequest = file_get_contents('access_' . session_id() . '.txt'); 
    sleep(1); 
} 

echo "disconnecting user !" . PHP_EOL; 
+0

あなたの答えをありがとう、もし私がしたことではない、私はそれが動作することを知っている!私はどのファイルも管理する必要がないので、@ jeroenが(セッションを閉じて再オープンして)私に言った方法を好みました。しかし、あなたの答えは唯一のものであり、私はそれが正しいとマークするために良いものであることを知っています;) – ShellCode

+0

よろしくお願いします。そしてありがとう! :) – TrX

関連する問題