次のコードでは、プログラムで任意のユーザーにログインしましょう。
global $user;
$user = user_load(<any_uid>);
私の質問は、上記のコードがブラウザに新しいユーザーCookieを設定するためにどのようにトリガーされるかです。この時点では、セッションを再生成することすらありません。
次のコードでは、プログラムで任意のユーザーにログインしましょう。
ではない正確に;現在のグローバルユーザーオブジェクトをユーザーのインスタンスに設定しますが、アカウントにログインしたり、セッションに触れたりすることはありません。グローバルユーザーオブジェクトに依存するリクエストで発生する多くのことは、アカウントがログインした場合がログインした場合と同じように動作しますが、 、およびアカウントに関連付けられたセッションはありません(いずれにせよ)。
Cookieはリクエストの最後に _drupal_session_commit
_ で追加されます:
_if (!drupal_session_started()) {
drupal_session_start();
if ($is_https && variable_get('https', FALSE)) {
$insecure_session_name = substr(session_name(), 1);
$params = session_get_cookie_params();
$expire = $params['lifetime'] ? REQUEST_TIME + $params['lifetime'] : 0;
setcookie($insecure_session_name, $_COOKIE[$insecure_session_name], $expire, $params['path'], $params['domain'], FALSE, $params['httponly']);
}
}
_
方法の副産物としてDrupalはセッションを初期化します(遅延フックで))最初のセッションが初期化される前に$user = user_load(<any_uid>);
への呼び出しが発生した場合、セッションは_user_load
_行が実行されない場合でも、そのユーザー用に初期化され、次のリクエストに対して「ログイン済み」と表示されます。
ただし、_hook_user_login
_は呼び出されず、ユーザーテーブルの最後のログイン列は更新されません。これは完全な「ログイン」ではなく、特定のユーザーのセッションを初期化するだけです。
ちなみに、別のユーザーのセッションがすでに存在しているときに$user = user_load(<any_uid>);
を呼び出すと、次のリクエストのセッションはその別のユーザーのセッションになります。 _<any_uid>
_のセッションで上書きされることはありません。