“PHP” カテゴリのアーカイブ


PHPの中間コードキャッシュAPCを導入した環境にEC-CUBE2.4.4をインストールして動かそうとしましたが、

PHP Fatal error:  Class 'SC_DB_DBFactory_MYSQL_Ex' not found

というエラーが出て管理画面にログインできません。いろいろ調べた結果APCの問題であることが判明。
APCをOFFにしたら無事に動くようになりました。要注意です。

環境:

  • PHP 5.2.14
  • APC 3.0.9
  • EC-CUBE 2.4.4

参考

http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=4881&forum=4

Comments [tips]PHPの中間コードキャッシュAPCとEC-CUBEの組み合わせは要注意 はコメントを受け付けていません


概要

CentOS5はyumでPHPをインストールすると標準では5.1.6が入ります。WordPressで使いたいプラグインが5.2以上を要求していたので、yumでPHP5.2を入れる方法を探してみました。
ついでにPHPの中間コードキャッシュ「APC」を導入してサイトの速度向上を計ってみました。

環境:

  • ServersMan@VPS のEntryプラン
  • CentOS 5.4

PHP5.2のインストール

まず古いPHPを削除します。私の環境では以下のものを削除しました。(/var/log/yum.log で後日確認)

php
php-mbstring
php-pdo
php-common
php-cli
php-mysql
gnupg
curl

次に取得先のGPG-KEYをインポートします。

rpm --import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

リポジトリの設定をします。

$ vi /etc/yum.repos.d/utterramblings.repo
(以下の内容を入力)
[utterramblings]
name=Jason's Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

後は普通にyumで必要なパッケージをインストールします。

$ yum install php php-mbstring php-pdo php-pdo-mysql ...

インストールが終わったら、yum update でこのリポジトリが使われないように enabled=1のところを enabled=0に書き換えておきます。

apcのインストール

上記で追加した「Jason’s Utter Ramblings Repo」には php-apcも用意されていたので、普通に

$ yum install php-apc

で完了でした。
標準の5.1.6にインストールするには peclを使う方法、他のリポジトリを追加してyumでインストール方法などが紹介されていました。(下部の参考リンクを参照。)

ベンチマーク

Apacheを再起動してベンチマークしてみます。

APCなしの場合

Concurrency Level:      5
Time taken for tests:   103.595070 seconds
Complete requests:      50
Failed requests:        0
Write errors:           0
Total transferred:      1881150 bytes
HTML transferred:       1869950 bytes
Requests per second:    0.48 [#/sec] (mean)
Time per request:       10359.507 [ms] (mean)
Time per request:       2071.901 [ms] (mean, across all concurrent requests)
Transfer rate:          17.73 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   8.8      0      32
Processing:  1749 10192 22227.7   4236  103562
Waiting:     1198 8469 21650.1   2593  102240
Total:       1749 10194 22232.4   4236  103594

APCあり(shm 32M)の場合

Concurrency Level:      5
Time taken for tests:   66.140733 seconds
Complete requests:      50
Failed requests:        0
Write errors:           0
Total transferred:      1881150 bytes
HTML transferred:       1869950 bytes
Requests per second:    0.76 [#/sec] (mean)
Time per request:       6614.073 [ms] (mean)
Time per request:       1322.815 [ms] (mean, across all concurrent requests)
Transfer rate:          27.77 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.1      0       6
Processing:  3831 6405 1900.1   6155   13822
Waiting:     1797 3599 1741.1   3355   10780
Total:       3831 6405 1899.9   6155   13822

およそ40%ほどスピードアップしているようです。
ちなみに /etc/php.d/apc.ini にapc関連の設定があって共有メモリのサイズ(apc.shm_size)を128に増やしてベンチマークしてみましたが特に有意差はありませんでした。
キャッシュされるソースコードの量が増えてくるとこのパラメータが効いてくるようです。

参考

以下のサイトを参考にさせていただきました。ありがとうございます。

Comments CentOSのPHPを5.2にする。ついでにAPCも入れてみました。 はコメントを受け付けていません


概要

Teeple2 にデータベースマイグレーション機能を追加しました。これによりコマンド一発でデータベースの変更を適用し、エンティティクラスもそれに合わせて更新できるようになりました。
マイグレーション機能はシステムリリース後もそうですが、開発中も複数人で開発している場合は特に有用です。

使い方

まずmigrationディレクトリにDataSource名でディレクトリを作成します。
その中にデータベースに適用したいDDL文を NNN-somename.sql という形式で配置します。
「NNN」は001のようにバージョンを数字で表します。
ハイフン、またはアンダースコア以降は適当なファイル名で構いませんが拡張子は.sqlにする必要があります。

次に以下のコマンドを実行して差分を適用します。

$ php cli.php Teeple_Migration
 (cli.phpはbinディレクトリにある)

エンティティも同時に上書きしたい場合は –entityをつけます。

$ php cli.php Teeple_Migration --entity

※ Entity_Base_* が更新されます。

リンク

Comments Teeple2にデータベースマイグレーション機能を追加 はコメントを受け付けていません


概要

PHPでケータイサイトを作る際に非常に便利に使わせていただいているのが「らくらくケータイ3キャリアコンバーター(仮名)」です。(詳しくはke-tai.org > Blog Archive > PHPを使って3分で作る3キャリア対応ケータイサイト をご覧ください。)
簡単にいうと以下のようにやると3キャリア対応のケータイサイトが1つのソース(HTML)で実現できます。

  • HTML(テンプレート)はXHTMLでShift_JISで書く
  • 絵文字はドコモのunicode形式で書いておく (これを上記モジュールで出力時に変換する)

さてここでフォームの入力モード(docomoだとistyleとか)を指定したい場合にはどうしたらよいでしょうか?
「ケータイ xhtml 入力モード」とかでぐぐると以下のようなサイトがヒットします。

これらのサイトで述べられていることをまとめると以下のようになります。

  1. style属性でwap-input-formatを各キャリア仕様分並べて書いてやれば3キャリアとも機能する
  2. ただしSoftBankの一部の機種(特にSHARP)で入力制限モード(指定したモード以外の文字種が入力できない状態)になってしまう

大体のサイトでは2の条件はNGだろうと思うので結論としては「絵文字のように出力時に置換してやる方法しかない」ということになります。

そこで、「らくらくケータイ3キャリアコンバーター(仮名)」には docomoのときだけ istyle を wap-input-format に変換する関数が用意されていますがこれを拡張して3キャリア対応の関数を追加しました。

修正箇所

convert_istyle関数の追加


    /**
     * 入力モード指定変換(全キャリア)
     *
     * iモード用の入力モードの変換を行う
     *
     * @param   string  $input  変換対象の文字列
     *
     * @return  string          変換後の文字列
     */
    function convert_istyle($input, $agent)
    {
        $rep_arr_master = array(
            'DoCoMo' => array(
                'istyle="1"' => 'istyle="1" style="-wap-input-format:"*<ja:h>";"',
                'istyle="2"' => 'istyle="2" style="-wap-input-format:"*<ja:hk>";"',
                'istyle="3"' => 'istyle="3" style="-wap-input-format:"*<ja:en>";"',
                'istyle="4"' => 'istyle="4" style="-wap-input-format:"*<ja:n>";"'
            ),
            'SoftBank' => array(
                'istyle="1"' => 'mode="hiragana" istyle="1" format="*M"',
                'istyle="2"' => 'mode="hankakukana" istyle="2" format="*M"',
                'istyle="3"' => 'mode="alphabet" istyle="3" format="*x"',
                'istyle="4"' => 'mode="numeric" istyle="4" format="*N"'
            ),
            'EZweb' => array(
                'istyle="1"' => 'istyle="1" format="*M"',
                'istyle="2"' => 'istyle="2" format="*M"',
                'istyle="3"' => 'istyle="3" format="*x"',
                'istyle="4"' => 'istyle="4" format="*N"'
            ),
        );
        
        $carrier = KetaiConverter::getCarrier($agent);
        if (! preg_match('/DoCoMo|SoftBank|EZweb/', $carrier)) {
            return $input;
        }
        $rep_arr = $rep_arr_master[$carrier];
        
        $output = $input;
        preg_match_all('/<input (?:.*)(istyle=("|\')?[1-4](?:"|\')?)(?: (?:.*?))?>/i', $input, $arr);       // inputタグを検索し、配列に格納
        for ($i = 0; $i < count($arr[0]); $i++) {
            // 必要な変数を取得
            $target = $arr[0][$i];          // 置換対象
            $istyle = $arr[1][$i];          // istyle属性
            $quote = $arr[2][$i];           // クォート
            $replacement = strtr($target, $rep_arr);
            $output = str_replace($target, $replacement, $output);
        }
        
        return $output;
    }

convert関数の最後に convert_istyleを呼び出し


       // istyleの変換
        $output = KetaiConverter::convert_istyle($output, $agent);

※convert()内でDocomoのときに呼び出されている istyle_imode()はコメントアウトしておきます。

課題

今のところこのような形で運用していますがAUの一部の機種でどうしても「入力制限モード」になってしまうことがあるようです。調べた結果AUの仕様の書き方が曖昧で、これはどうしようもないとの結論に至っています。

まとめ

「らくらくケータイ3キャリアコンバーター(仮名)」はこのようにケータイサイトの出力時にいろいろ変換をかませるモジュールとして大変便利でカスタマイズしやすくなってます。
たとえばこれ以外にも

  • formのaction属性にguid=ONをつける

という変換なども加えて使っています。
このような便利なモジュールを公開してくださったke-tai.orgさんに感謝です。

参考

添付

viewer.php

Comments PHPのケータイ絵文字変換モジュール「らくらくケータイ3キャリアコンバーター(仮名)」に入力モード指定変換機能を追加 はコメントを受け付けていません