2013-08-19 91 views
2

当我从/壳/目录中运行以下命令:Magento的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

+0

[这应该有帮助吗?](http://www.magentocommerce.com/boards/viewthread/193459/#t327897) – karthikr

+0

不,因为“include_once”Maged/Controller.php“;”不在我的系统中的该文件中。我也不认为这与下载器有什么关系,这似乎是更新Magento,对吗? – werdnanoslen

回答

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脚本requireMage应用程序类。您的班级使用旧的PHP语法重新定义了构造函数

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

但您尚未调用父构造函数。这意味着法师类不是requir ed,并且其他重要的初始化不会发生。当这种类型的错误发生时我会重新定义构造函数方法使得它使用较新__construct语法,并调用父类的构造

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

+1,但不会破坏与父'__construct'的签名兼容性吗?将$ promo id和day放置在'$ data'中的重构会更加地道,不是吗? – kojiro

+0

@kojiro我认为这仍然会通过PHP的严格标准,因为父类没有任何参数,但是100%正确,因为最好是以另一种方式获取$ promoId和$ day变量。但是,这些是'/ shell /'中的脚本,所以没有$ data数组。简单地思考一下,“正确”的事情就是使这些命令行参数成为'_construct',尽管最终我认为“正确的”是程序员愿意支持的东西。 –

+0

@AlanStorm是的!这就是我不理解的事情,而且它按照我的预期工作。我将查找两个构造函数语法之间的区别。 – werdnanoslen

7

也许如果你在你开始脚本补充一点:

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

问候

+0

奇怪的是,abstract.php应该已经加载了Mage.php。添加上面这两行require_once('abstract.php')将错误更改为“PHP致命错误:在第38行的非对象上调用成员函数load()”) – werdnanoslen

+0

尝试:$ this- >基于规则>负载($这个 - > promoID); –

+0

你是对的,先生! 现在为什么我需要Mage.php,当我已经需要abstract.php,它在其构造函数中加载Mage.php? – werdnanoslen

-1

Fatal error: Class 'Mage' not found in /home1/sumit/public_html/index.php

而无需刷新页面,替代指标。 php到cache_flush然后回车。

1

我有同样的问题,但与像indexer.php核心壳脚本。我仍然不确定是什么导致了这个问题,但它必须以某种方式与环境相关,因为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. } 

然后,我改变require_oncerequire和噗错误消失了,一切工作就好了。它似乎也可以在开发服务器上运行。

相关问题