2

当我从 /shell/ 目录中运行此命令时:

php -f regularPromos.php

为什么我会收到此错误?

PHP Fatal error: Class 'Mage' not found in /var/www/vhosts/yoohoo/httpdocs/shell/regularPromos.php on line 28

这是regularPromos.php:

<?php

require_once 'abstract.php';

class Mage_Shell_RegularPromos extends Mage_Shell_Abstract
{     
    //Day of week to repeat promotion
    protected $day;

    //ID of promotion
    protected $promoID;

    //Rule process object
    protected $rule;


    public function Mage_Shell_RegularPromos($promoID, $day)
    {
        $this->day = $day;
        $this->promoID = $promoID;
        $this->rule = Mage::getModel('salesrule/rule');
    }


    public function run()
    {
        date_default_timezone_set('America/New_York');
        $nextWeek = date('Y-m-d', strtotime('next '. $this->day));
        $rule = $rule->load($this->promoID);
        $rule->setFromDate($nextWeek)
                ->setToDate($nextWeek)
                ->save();
    }
}

$shell = new Mage_Shell_RegularPromos(7, 'monday');
$shell->run();

?>

根据我在这个问题上可以找到的所有 SO 线程:

  • 我尝试使用编译器打开/关闭/清除/编译运行,并显示相同的错误消息

  • 我已通过管理面板清除缓存并手动删除 /var/cache/ 中的所有内容。

  • APC 没有出现在 phpinfo() 中,所以这也不应该是一个问题。

我可以很好地运行 compiler.php,所以我假设我在上面的 php 中犯了一个错误。

我正在运行 Magento 1.7 CE,PHP 5.3.3

4

4 回答 4

8

也许如果您在脚本的开头添加它:

require_once('./app/Mage.php');
Mage::app();

问候

于 2013-08-19T16:31:36.267 回答
5

您错误地扩展了基本抽象类。如果您查看抽象构造函数

#File: shell/abstract.php
public function __construct()
{
    if ($this->_includeMage) {
        require_once $this->_getRootPath() . 'app' . DIRECTORY_SEPARATOR . 'Mage.php';
        Mage::app($this->_appCode, $this->_appType);
    }

    $this->_applyPhpVariables();
    $this->_parseArgs();
    $this->_construct();
    $this->_validate();
    $this->_showHelp();
}

您可以看到这是应用程序类中的 shell 脚本require所在的位置。Mage您的类使用旧的 PHP 语法重新定义了构造函数

public function Mage_Shell_RegularPromos($promoID, $day)
{
    $this->day = $day;
    $this->promoID = $promoID;
    $this->rule = Mage::getModel('salesrule/rule');
}

但是您还没有调用父构造函数。这意味着没有编辑 mage 类requir,并且不会发生其他重要的初始化。我将重新定义您的构造函数方法,使其使用较新的__construct语法,并调用父构造函数

public function __construct($promoID, $day)
{
    parent::__construct();
    $this->day = $day;
    $this->promoID = $promoID;
    $this->rule = Mage::getModel('salesrule/rule');
}
于 2013-08-19T18:13:14.347 回答
1

我有同样的问题,但使用 indexer.php 之类的核心 shell 脚本。我仍然不确定是什么导致了这个问题,但它必须以某种方式与环境相关,因为 shell 脚本在开发服务器上运行良好,但在生产服务器上导致了问题。

基本上我收到了这个错误:

PHP Fatal error:  Class 'Mage' not found in abstract.php on line 86

这个有问题的代码是:

84. if ($this->_includeMage) {
85.    require_once $this->_getRootPath() . 'app' . DIRECTORY_SEPARATOR . 'Mage.php';
86.    Mage::app($this->_appCode, $this->_appType);
87. }

然后我改成poof 错误消失了,一切正常require_oncerequire它似乎也适用于开发服务器。

于 2016-04-06T07:08:08.147 回答
-1

发生此类错误时:

致命错误:在 /home1/sumit/public_html/index.php 中找不到类“法师”

在不刷新页面的情况下,将 index.php 替换为 cache_flush 然后回车。

于 2015-07-06T11:36:30.217 回答