2013-08-19 122 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和噗錯誤消失了,一切工作就好了。它似乎也可以在開發服務器上運行。

相關問題