为什么 Magento 在使用 customer/session 后删除了我的前端 cookie?

Why does Magento remove my frontend cookie after using customer/session?

我正在使用 Nginx 和 HHVM,我还使用自定义 php 文件与 Magento 交互。

当我 运行 任何 PHP 文件时,前端 cookie 设置正确,购物车也正常工作。

然而,每当我使用:

$session = Mage::getSingleton( 'customer/session' );
$session->login($login, $pass);
$session->setCustomerAsLoggedIn($customer);

前端 cookie 被删除。

问题:为什么会这样,我该如何解决?

设置:

完整示例:

include_once('../app/Mage.php');
    ob_start();
    umask(0);
    Mage::app();
    Mage::getSingleton('core/session', array('name'=>'frontend'));
    $login = $v[0]; //username as email
    $pass  = $v[1]; //user password
    try {
        $customer = Mage::getModel("customer/customer");
        $customer->website_id = Mage::app()->getWebsite()->getId();
        $customer->loadByEmail($login);

        $session = Mage::getSingleton( 'customer/session' );
        $session->login($login, $pass);
        $session->setCustomerAsLoggedIn($customer);

    } catch(Exception $e) {
        $returnJson['success']  = false;
        $returnJson['error']    = $e;
    }

可能不相关,但为什么在登录之前就加载客户,而你从不检查登录功能 returns 是真还是假。您还可以手动将客户设置为已登录,如果 user/pass 正确,这将在 login() 函数内为您执行。我基本上会将整个 try..catch 部分更改为:

try {
    $session = Mage::getSingleton( 'customer/session' );
    if (!$session->login($login, $pass)) {
        throw new Exception("Authentication failed");
    }
    $customer = $session->getCustomer();
    // more stuff?
} catch(Exception $e) {
    $returnJson['success']  = false;
    $returnJson['error']    = $e;
}

显然不是 tested/proofread 出于懒惰的原因。 :)

我们通过添加 HHVM ini 设置解决了这个问题:

hhvm.server.allow_duplicate_cookies = 0

更多信息:https://github.com/facebook/hhvm/issues/2758