-1

回复:EE v1.10.1.1

你好,

最近我发现在用户提交表单创建帐户后,注册过程页面冻结。它死在'/customer/account/createpost/'上。

似乎在 /app/code/core/Mage/Customer/controllers/AccountController.php 行 #325 附近的这条线上死掉了(

$session->setCustomerAsLoggedIn($customer);
)。

将用户设置为已登录时,似乎在无效/空会话中窒息。只有在刷新冻结页面后才会记录/显示错误。我在任何日志中都没有发现任何其他错误/警告/消息(包括服务器日志):


a:5:{i:0;s:62:"Mage registry key "_singleton/customer/session" already exists";i:1;s:1247:"#0 /server_path/html/app/Mage.php(192): Mage::throwException('Mage registry k...')
#1 /server_path/html/app/Mage.php(446): Mage::register('_singleton/cust...', Object(Mage_Customer_Model_Session))
#2 /server_path/html/app/code/core/Mage/Customer/controllers/AccountController.php(50): Mage::getSingleton('customer/sessio...')
#3 /server_path/html/app/code/core/Mage/Customer/controllers/AccountController.php(75): Mage_Customer_AccountController->_getSession()
#4 /server_path/html/app/code/core/Mage/Core/Controller/Varien/Action.php(409): Mage_Customer_AccountController->preDispatch()
#5 /server_path/html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(253): Mage_Core_Controller_Varien_Action->dispatch('create')
#6 /server_path/html/app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#7 /server_path/html/app/code/core/Mage/Core/Model/App.php(340): Mage_Core_Controller_Varien_Front->dispatch()
#8 /server_path/html/app/Mage.php(627): Mage_Core_Model_App->run(Array)
#9 /server_path/html/index.php(95): Mage::run('', 'store')
#10 {main}";s:3:"url";s:25:"/customer/account/create/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:2:"sg";}

下一行 (#326) 发送欢迎电子邮件。如果第 325 行被注释掉,那么电子邮件仍然会被发送,如果这样做了,第一次登录他们的帐户的尝试会在第 137 行的“/customer/account/loginPost/”上阻塞:

$session->login($login['username'], $login['password']);

刷新一次页面会显示仪表板。

无论哪种方式,帐户似乎都已正确创建,之后帐户功能正常,没有其他登录问题。

最近发生了一些变化,但它们都不应该与客户和/或客户/会话有任何关系......至少我不知道。

碰巧有人知道代码中任何常见的潜在magento陷阱......我可以在另一个脚本/mod中间接地做一些会导致这样的事情的事情吗?

我在这条路上的时间比我应该的要长,我觉得我已经回到起点而没有任何线索/成功。我有点觉得我错过了/忽略了一些明显的东西。任何输入、想法、建议或想法都将受到赞赏。

谢谢。

尊敬的,詹姆斯D

[b]注意:[/b] 我最后一次亲自检查这个功能是一两个月前,它没有这样做。从那以后,我制作/添加了一些自定义模块,但它们不应“直接”连接到客户和/或客户会话。

此外,一年多以前,我们确实为“customer_login”和“customer_before_save”事件添加了一些内容,但过去它们没有出现任何问题,所以我认为这两者都不是原因。 . 唯一的其他变化是 Magento 从 EE 1.9 升级到 1.10。

空会话示例....

这是页面阻塞时会话的样子:

Mage_Customer_Model_Session Object
    (
        [_customer:protected] => 
        [_isCustomerIdChecked:protected] => 
        [_skipSessionIdFlag:protected] => 
        [_data:protected] => Array
            (
                [_session_validator_data] => Array
                    (
                        [remote_addr] => 155.77.22.255
                        [http_via] => 
                        [http_x_forwarded_for] => 
                        [http_user_agent] => Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
                    )

                [session_hosts] => Array
                    (
                        [www.slimgenics.com] => 1
                    )

                [id] => 
                [messages] => Mage_Core_Model_Message_Collection Object
                    (
                        [_messages:protected] => Array
                            (
                            )

                        [_lastAddedMessage:protected] => Mage_Core_Model_Message_Success Object
                            (
                                [_type:protected] => success
                                [_code:protected] => Thank you for registering.
                                [_class:protected] => 
                                [_method:protected] => 
                                [_identifier:protected] => 
                                [_isSticky:protected] => 
                            )

                    )

                [before_auth_url] => https://www.domain.com/customer/account/index/
                [no_referer] => 1
            )

        [_hasDataChanges:protected] => 1
        [_origData:protected] => 
        [_idFieldName:protected] => 
        [_isDeleted:protected] =>
4

2 回答 2

1

您描述的错误应该在这里提出(magento CE 1.7.0.2 供参考):

// app/Mage.php:472
$registryKey = '_singleton/'.$modelClass;
if (!self::registry($registryKey)) {
    self::register($registryKey, self::getModel($modelClass, $arguments));
}

因此,在注册之前立即检查此密钥是否存在。我不认为,EE 代码会做其他事情。所以你必须回答的问题是:为什么!self::registry($registryKey) false

你很幸运,我挖得更深了。我认为 Session-Object 的创建失败并返回 false。这意味着对密钥的检查为真,但检查Mage::register()失败,因为它检查isset()

// app/Mage.php:216
public static function register($key, $value, $graceful = false)
{
    if (isset(self::$_registry[$key])) {
        if ($graceful) {
            return;
        }
        self::throwException('Mage registry key "'.$key.'" already exists');
        // [...]

问题是:为什么会话对象的创建失败。

于 2012-12-30T08:39:45.060 回答
0

问题已解决。

问题源于我不知道的文件更改。这种变化显然导致了一个循环(它正在死亡)抛出“无法重新声明”消息。由被多次调用的文件中的“require”语句引起。

我发现这一点的唯一方法是通过自定义 API。我用它来测试帐户创建功能,幸运的是,Soap 处理程序能够抛出错误并将其记录在 Magento error.log 中(以前从未这样做过)。'redeclare' 错误消息就在那里,并引导我找到已更改的文件。

感谢大家的意见。

于 2013-02-19T17:23:13.000 回答