web-dev-qa-db-ja.com

外部のphpスクリプトでJoomlaセッション変数を連続して設定することに問題はありますか?

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セッション変数を連続して設定すると、一部の値が失われる可能性があるかどうか知りたいのですが。それがありそうにない場合は、データ損失の原因となっている可能性があることに関する提案と、問題の解決方法に関する提案をいただければ幸いです。

5
TryHarder

データベースをセッションハンドラーとして使用すると、この問題が発生しました。私が収集できるものから、スクリプトが終了するまで、セッションデータはデータベースに書き込まれません。つまり、最初のスクリプトが完了する前に2番目のスクリプトが実行を開始すると、まだデータベースに書き込まれていないため、新しい値なしでセッションデータが読み込まれます。

セッションハンドラーをfileではなくdatabaseに切り替えるだけで運が良かったため、実際にファイルをロックして、最初のスクリプトが完了して保存するまで2番目のスクリプトが実行されないようにしました値。これはおそらく、ファイルがあるほど個々のテーブル行をロックする方法が適切ではないためです。

2
David Fritsch

問題は、同じセッションを使用する必要があることです。

それをするために。セッションを作成してデータを保存するときに、$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レコード見つかります。

1
Jack Ting