Joomlaの外部にあるPHPスクリプトで複数のセッション変数を設定しています。
変数は、次のコードを使用して連続的に設定されます。
//Access Joomla
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$app = JFactory::getApplication('site');
$app->initialise();
//Store values in Joomla Session
$session = JFactory::getSession();
$session->set('firstvalue', $firstvalue);
$session->set('secondvalue', $secondvalue);
$session->set('thirdvalue', $thirdvalue);
$session->set('fourthvalue', $fourthvalue);
別のスクリプトで、セッション変数を取得します
$session = JFactory::getSession();
$firstvalue = $session->get('firstvalue');
//etc etc
私が目にしている問題は、firstvalue ときどきの値が失われることです。これが他の変数で発生するかどうかはまだわかりません。私が読んだことから、Joomlaがセッションをロックしていない可能性があります。つまり、Joomlaはfirstvalueを設定しようとしますが、保存される前に別の変数によって上書きされます。これは正しい音ですか?
状況についての私の理解が正しい場合、私はいくつかの解決策を考え出しました。あなたがより良いものを持っているなら、私はそれらを聞いてみたい:)
私はできた
要約すれば、
Joomlaの外部のスクリプトでJoomlaセッション変数を連続して設定すると、一部の値が失われる可能性があるかどうか知りたいのですが。それがありそうにない場合は、データ損失の原因となっている可能性があることに関する提案と、問題の解決方法に関する提案をいただければ幸いです。
データベースをセッションハンドラーとして使用すると、この問題が発生しました。私が収集できるものから、スクリプトが終了するまで、セッションデータはデータベースに書き込まれません。つまり、最初のスクリプトが完了する前に2番目のスクリプトが実行を開始すると、まだデータベースに書き込まれていないため、新しい値なしでセッションデータが読み込まれます。
セッションハンドラーをfile
ではなくdatabase
に切り替えるだけで運が良かったため、実際にファイルをロックして、最初のスクリプトが完了して保存するまで2番目のスクリプトが実行されないようにしました値。これはおそらく、ファイルがあるほど個々のテーブル行をロックする方法が適切ではないためです。
問題は、同じセッションを使用する必要があることです。
それをするために。セッションを作成してデータを保存するときに、$session->getId()
を呼び出して現在の_seeeion_id
_を取得し、それをクライアント側に送信する必要がありました。
次に、クライアント側は、セッションデータを取得するときに_session_id
_を返し、_seeeion_id
_をJFactory::getSession()
のパラメータの1つとして渡します。
JFactory::getSession()
は、パラメータとして配列を使用できます。 _session_id
_を指定するには、名前としてid
を使用します。コードは
_$options = array(
"id" => $input_msg->session_id
);
$session = JFactory::getSession($options);
$firstvalue = $session->get('firstvalue');
_
ここで、_$input_msg->session_id
_は、ユーザーの入力から取得した_session_id
_です。
別の重要な問題は、セッションをdestroy()
したい場合、$session = JFactory::getSession($options)
によってセッションを取得した直後です。 $session->start()
を呼び出してセッションをアクティブ化する必要があり、次に$session->destroy()
の呼び出しが成功する場合があります。それ以外の場合は、失敗メッセージが表示されます。
ちなみに、セッションは_#__session
_テーブルでセッションごとに1レコード見つかります。