You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento后台管理员登录状态检测:定时脚本无效问题求助

检测Magento后台当前登录管理员的正确方法

嘿,我来帮你搞定这个问题!你的代码思路有点偏了——你现在是循环所有管理员用户,试图切换会话来判断登录状态,但Magento的后台会话是和每个用户的独立会话绑定的,不是这么直接切换就能检测的。

你的代码问题所在

你用Mage::getSingleton('core/session', array('name'=>$name))尝试切换会话,但这并不能模拟对应用户的登录状态,因为每个登录的管理员都有自己唯一的adminhtml开头的会话ID,存储在数据库(默认是core_session表)或者文件里。你的方法根本没触及到这些真实的会话数据。

正确实现方案

我们需要直接查询Magento的会话存储,找出所有adminhtml类型的会话,反序列化里面的数据,判断哪些用户处于登录状态。下面是可行的代码:

<?php
// 初始化Magento环境(如果脚本不在Magento根目录,需要调整路径)
require_once 'app/Mage.php';
umask(0);
Mage::app('admin'); // 用admin商店初始化,确保权限足够

// 获取会话集合,过滤admin后台的会话(会话ID以adminhtml开头)
$sessionCollection = Mage::getModel('core/session')->getCollection()
    ->addFieldToFilter('session_id', array('like' => 'adminhtml_%'));

echo '<pre>';
foreach ($sessionCollection as $session) {
    try {
        // 反序列化会话数据
        $sessionData = unserialize($session->getData('session_data'));
        
        // 检查会话中是否包含已登录的admin用户信息
        if (isset($sessionData['admin/user']) && $sessionData['admin/user'] instanceof Mage_Admin_Model_User) {
            $adminUser = $sessionData['admin/user'];
            echo sprintf('✅ 管理员 "%s"(ID: %d)当前处于登录状态' . PHP_EOL, 
                $adminUser->getUsername(), 
                $adminUser->getId()
            );
        }
    } catch (Exception $e) {
        // 跳过损坏的会话数据
        echo '⚠️ 遇到无效会话数据,跳过处理' . PHP_EOL;
    }
}
echo '</pre>';
?>

额外说明

  • 如果你的Magento会话是用文件存储的(而不是数据库),那需要读取var/session目录下以adminhtml_开头的文件,反序列化里面的内容,逻辑和上面类似,只是读取方式不同。
  • 要确保运行脚本的用户有足够权限访问Magento的会话存储(数据库或文件目录)。
  • 有些Magento版本可能会对会话数据加密,这时候需要额外处理解密逻辑,但默认情况下是未加密的序列化数据。

内容的提问来源于stack exchange,提问作者Rob D. A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:21:41