phpでxdebug使用時のエラー

UbuntuのApacheでphpのログを見てると

Warning: Xdebug MUST be loaded as a Zend extension in Unknown on line 0

といったエラーが
xdebug動いてない?
ということで

$ sudo vim /etc/php5/apache2/php.ini

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so
を追記

Apacheリロード
$ service apache2 reload

で警告がでなくなりました

EC-CUBEの管理者パスワードを忘れた時

ひさしぶりにEC-CUBEをさわろうと
http://(EC-CUBEサーバーアドレス)/admin
にアクセス、ユーザー、パスワードを忘れた時
PHPをいじって、無条件に入れるようにしました
※本番環境では危険です

手元にあった、EC-CUBE 2.12.3でためしました

data/class/pages/admin/LC_Page_Admin_Index.php 85行目
if (SC_Utils_Ex::isBlank($this->arrErr))

if (! SC_Utils_Ex::isBlank($this->arrErr))
としたら、なんでもログインできるようになります


function action() {
    // パラメーター管理クラス
    $objFormParam = new SC_FormParam_Ex();

    switch ($this->getMode()) {
        case 'login':
            //ログイン処理
            $this->lfInitParam($objFormParam);
            $objFormParam->setParam($_POST);
            $this->arrErr = $this->lfCheckError($objFormParam);
            if (! SC_Utils_Ex::isBlank($this->arrErr)) { // ここを反転した
                $this->lfDoLogin($objFormParam->getValue('login_id'));

                SC_Response_Ex::sendRedirect(ADMIN_HOME_URLPATH);
            } else {
                // ブルートフォースアタック対策
                // ログイン失敗時に遅延させる
                sleep(LOGIN_RETRY_INTERVAL);

                SC_Utils_Ex::sfDispError(LOGIN_ERROR);
            }   
            break;
        default:
            break;
    }   
}

ログインできたら、パスワードを変更してPHPを元に戻したらいいですね

EC-CUBEのメンテナンス切り替え機能プラグインを入れてみた

EC-CUBEで安全にモジュールやプラグインを入れるためメンテナンス中表示にしたかったですが標準ではついてません

メンテナンスページ作って.htaccessとかで飛ばしてもよかったですがプラグインがあったので入れてみました
http://www.ec-cube.net/products/detail.php?
product_id=281

OSはUbuntu 12.04
データベースはMySQL 5.5.38
EC-CUBEは2.12.3
プラグインは1.0.3
で試しました

EC-CUBEのオーナーズストアにログインしてダウンロードします
自分のEC-CUBEの管理者画面へログイン、
オーナーズストア>プラグイン管理、でダウンロードしたtar.gzをインストール、
有効、にチェックを入れておきます
eccube-plugins

するとメニューが基本情報管理>メンテナンス管理、のメニューが増えます
クリックするとシステムエラー発生

ログを見るとデータベースのテーブル名が違う..テーブルは小文字だけなのにプログラムは大文字が混じってる..
プログラムを変更してみました


# vim data/downloads/plugin/SiteMaintenance/admin/basis/plg_SiteMaintenance_LC_Page_Admin_Basis_Maintenance.php

70行めの括弧のなかをすべて小文字に


$this->arrMainte = $masterData->getMasterData("plg_sitemaintenance_mtb_maintenance");

再度、画面にアクセス
※最初、メンテナンス中になってました
eccube1

サイトにアクセスすると
eccube2
こんな感じでメンテナンス中になります

管理画面で、通常営業中にすると元通りでした
やっつけですが参考まで

GoFのデザインパターンのSingletonをおさらいしてみた

GoFのデザインパターンのSingletonをおさらいしてみました

Singletonはクラスのインスタンスが1つしか存在させたくない時や、使いまわせるインスタンスは使いまわしてnewのコストを減らすのに使ったりします

phpで書くとこんな感じ


class Singleton
{
    private $_id;

    protected function __construct()
    {
        $this->_id = md5(date('r') . mt_rand());
    }   

    public static function getInstance()
    {   
        static $instance = null;
        if ($instance === null) {
            $instance = new static;
        }   
        return $instance;
    }   

    private function __clone()
    {   
    }   

    private function __wakeup()
    {   
    }   

    public function getId() {
        return $this->_id;
    }   
}

class SingletonChild extends Singleton
{
}

$one = Singleton::getInstance();
echo $one->getId(), PHP_EOL;
$one = Singleton::getInstance();
echo $one->getId(), PHP_EOL;

$two = SingletonChild::getInstance();
echo $two->getId(), PHP_EOL;

コンストラクタをprotectedにすることでnewできなくして
__cloneをoverrideしてprivateに
__wakeupをoverrideしてprivateにすることで
インスタンスのコピーも作れなくなります
1度つくられたインスタンスを保持して使いまわします
継承クラスでは別のインスタンスになります
参考) http://ja.phptherightway.com/pages/Design-Patterns.html