気ままなDevLog

webとかプログラミングについての雑記帳

sfMemcachePluginを使ってみる

phpのセッション管理にmemcacheを使うとむちゃくちゃ早いとの情報を得たので(いまさらですかね(^^;)さっそく調査してみると、Memcacheはやっぱりすごかった:アシアルブログベンチマークした結果が載ってた。
ふむふむなるほどこれは使えるな〜♪

さっそくsymfonyでも使ってみようと思ってさらに調査。
memcacheをsymfonyから利用してみる:ueblogsfMemcachePluginというのが紹介されてましたので自分でもやってみることに。

memcachedのインストール

# yum install memcached

※dagのリポジトリでないとyumでmemcacheは見つからなかったです。。。

つづいてphpでmemcacheを使えつるようにmemcacheをインストール

# pecl install memcache

php.iniに次のextensionを追記

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/memcache.so

sfMemcachePluginをインストール

$ symfony plugin-install http://plugins.symfony-project.com/sfMemcachePlugin

memcacheを使いたいアプリのconfigディレクトリに設定ymlファイルをコピー

$ cp plugins/sfMemcachePlugin/config/config_handlers.yml apps/front/config/
$ cp plugins/sfMemcachePlugin/config/memcache.yml apps/front/config/

※設定内容は必要であれば適宜修正します。

サンプル
action

  public function executeIndex()
  {
    $ns = 'mynamespace';
    $key = 'mykey';
    $fc  = new sfMemcacheFunctionCache;
    $this->result = '';
    if ($fc->has($key, $ns, ''))
    {
      $this->result = $fc->get($key, $ns, '');
    }
    else
    {
      $result = 'hello! memcache!';
      $fc->set($key, $ns, $result);
    }
    sfView::SUCCESS;
  }

templates

<?php echo $result ?>

ちゃんと2回目の表示で出ました。
これで超速いので、文句なしですね♪

go-pearでのpearインストール

pearインストール

curlでgo-pearを取得。もしくはwgetで。

# curl http://pear.php.net/go-pear > pear.php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 87099  100 87099    0     0  29743      0  0:00:02  0:00:02 --:--:-- 53998


# php -q pear.php
Welcome to go-pear!

Go-pear will install the 'pear' command and all the files needed by
it.  This command is your tool for PEAR installation and maintenance.

Go-pear also lets you download and install the following optional PEAR
packages: PEAR_Frontend_Web-beta, PEAR_Frontend_Gtk2, MDB2.


If you wish to abort, press Control-C now, or press Enter to continue:

HTTP proxy (http://user:password@proxy.myhost.com:port), or Enter for none::

Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.

(↓このように変更)
 1. Installation prefix ($prefix) : /usr/local/share
 2. Temporary files directory     : $prefix/temp
 3. Binaries directory            : /usr/local/bin
 4. PHP code directory ($php_dir) : $prefix/PEAR
 5. Documentation base directory  : $php_dir/docs
 6. Data base directory           : $php_dir/data
 7. Tests base directory          : $php_dir/tests

1-7, 'all' or Enter to continue:

The following PEAR packages are bundled with PHP: PEAR_Frontend_Web-beta,
PEAR_Frontend_Gtk2, MDB2.
Would you like to install these as well? [Y/n] : Y

Would you like to alter php.ini </usr/local/php/lib/php.ini>? [Y/n] : Y

php.ini </usr/local/php/lib/php.ini> include_path updated.

Current include path           : .:/usr/local/php/lib/php
Configured directory           : /usr/local/share/PEAR
Currently used php.ini (guess) : /usr/local/php/etc/php.ini
Press Enter to continue:

The 'pear' command is now at your service at /usr/bin/pear
pearの設定を確認

pear config-showコマンドで現在の設定を確認。

$ pear config-show
CONFIGURATION (CHANNEL PEAR.PHP.NET):
=====================================
Auto-discover new Channels     auto_discover    <not set>
Default Channel                default_channel  pear.php.net
HTTP Proxy Server Address      http_proxy       <not set>
PEAR server [DEPRECATED]       master_server    pear.php.net
Default Channel Mirror         preferred_mirror pear.php.net
Remote Configuration File      remote_config    <not set>
PEAR executables directory     bin_dir          /usr/local/php/bin
PEAR documentation directory   doc_dir          /usr/local/php/lib/php/pear/docs
PHP extension directory        ext_dir          ./
PEAR directory                 php_dir          /usr/local/php/lib/php/pear
PEAR Installer cache directory cache_dir        /tmp/pear/cache
PEAR configuration file        cfg_dir          /usr/local/php/lib/php/pear/cfg
directory
PEAR data directory            data_dir         /usr/local/php/lib/php/pear/data
PEAR Installer download        download_dir     /tmp/pear/download
directory
PHP CLI/CGI binary             php_bin          /usr/local/php/bin/php
php.ini location               php_ini          <not set>
PEAR Installer temp directory  temp_dir         /tmp/pear/temp
PEAR test directory            test_dir         /usr/local/php/lib/php/pear/tests
PEAR www files directory       www_dir          /usr/local/php/lib/php/pear/www
Cache TimeToLive               cache_ttl        3600
Preferred Package State        preferred_state  stable
Unix file mask                 umask            2
Debug Log Level                verbose          1
PEAR password (for             password         <not set>
maintainers)
Signature Handling Program     sig_bin          /usr/bin/gpg
Signature Key Directory        sig_keydir       /usr/local/etc/pearkeys
Signature Key Id               sig_keyid        <not set>
Package Signature Type         sig_type         gpg
PEAR username (for             username         <not set>
maintainers)
User Configuration File        Filename         /home/myuser/.pearrc
System Configuration File      Filename         /usr/local/php/etc/pear.conf
pearの設定変更

pear config-setで設定値を変更できる。

$ pear config-set bin_dir /usr/local/bin
config-set succeeded

sfAdvancedLoggerPluginを使ってみる

symfonyに標準搭載されているloggerが貧弱なので、「symfonyで開発日記」で紹介されていたsfAdvancedLoggerPluginを使ってみます。
http://blog.symfony.jp/2008/04/17/logging/

システム全体で同じ設定でログを吐きたいので、project_root/config/logging.ymlを作成し以下のように設定。
製品環境はnotice以上、開発環境などはdebug以上すべて吐き出すようにする。
(開発環境でメールが大量のメールが飛ぶことが予想されるがw、とりあえず動作確認の意味を込めて開発でもメール通知することに)

prod:
  enabled: on
  level:   notice
  rotate:  on
  period:  7
  history: 5
  purge:   off

  loggers:
    sf_file_debug:
       class: sfAdvancedLogger
       param:
         php_level:     855
         exception:     on

         email:
           - min_level: 3
             to:        myaccount@localhost
             from:      symfony sfAdvencedLogger
             subject:   “symfony project Alert Mail”

         file:
           - min_level: 5
             file:      %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%_symfony.log

           - type:      [PHP, Exception]
             file:      %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%_php_exception.log

all:
  enabled: on
  level:   debug
  rotate:  on
  period:  1
  history: 7
  purge:   on

  loggers:
    sf_file_debug:
       class: sfAdvancedLogger
       param:
         php_level:     855
         exception:     on

         email:
           - min_level: 3
             to:        myaccount@localhost
             from:      symfony sfAdvencedLogger
             subject:   “symfony project Alert Mail”

         file:
           - min_level: 8
             file:      %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%_symfony.log

           - type:      [PHP, Exception]
             file:      %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%_php_exception.log

忘れずにsymfony cc

これでログは吐かれるようになったんだけど、吐かれたログを見ると日付が入ってない。。。
いつ発生したかわかんないんじゃぜんぜん実用的じゃなくね?

すでに提供されているものに手を入れるのはあまり好きではないのだが、
仕方なくsfAdvancedLoggerPlugin自体に手を入れることに。

  public function log($message, $priority, $priorityName) {

    ・
    ・
    ・
        // タイムスタンプ取得
        $timestamp = date('Y-m-d H:i:s');

        switch ($log['log_type']) {
          case 'email':
            // メッセージの先頭にタイムスタンプを挿入
            $log['messages'][] = " $priorityName - $message";
            break;
          case 'file':
            // メッセージの先頭にタイムスタンプを挿入
            file_put_contents($log['file'], "$timestamp - $priorityName - $message\n", FILE_APPEND | LOCK_EX);
            break;
        }
      }
    }
  }

これで日付も出るようになりました。

あと心配なのはまだ動作確認できてないログローテーションだけだな。

MySQL 5.1のインストールメモ

インストール

バイナリパッケージのダウンロード

MySQLのサイトからmysql-5.1.24-rc-linux-i686-glibc23.tar.gzを入手する。
http://dev.mysql.com/downloads/

ダウンロードしたファイルを展開し、インストール対象ディレクトリに移動する。
# tar zxvf mysql-5.1.24-rc-linux-i686-glibc23.tar.gz
# mv mysql-5.1.24-rc-linux-i686-glibc23 /usr/mysql

初期設定

データファイル、設定ファイル、ログファイルすべて/var/mysql/data以下に置くことにしてみる。

ユーザとグループの作成
# groupadd mysql
# useradd -g mysql -d /home/mysql mysql
# passwd mysql パスワード
所有者の変更
# chown -R mysql:mysql /usr/mysql
権限DBの作成
# mkdir -p /var/mysql/data
# chown mysql:mysql /var/mysql/data

mysqlユーザになってインストールシェルを実行

$ cd /usr/mysql
$ ./scripts/mysql_install_db --datadir=/var/mysql/data
my.cnfの作成と設定
# cp /usr/mysql/support-files/my-medium.cnf /var/mysql/data/my.cnf
# vi /var/mysql/data/my.cnf

my.cnfのmysqldディレクティブを編集

[mysqld]
user = mysql
basedir = /usr/mysql
datadir = /var/mysql/data
port = 3306
socket = /var/mysql/data/mysql.sock
mysqld起動
$ cd /usr/mysql
$ ./bin/mysqld_safe --defaults-file=/var/mysql/data/my.cnf >> /var/mysql/data/mysqld_safe.log 2>&1 &
データベースユーザの作成

初期登録されているユーザを削除し、新たに管理者ユーザを作成する。

$ /usr/mysql/bin/mysql --user=root --socket=/var/mysql/data/mysql.sock

mysql> TRUNCATE TABLE mysql.user;
mysql> FLUSH PRIVILEGES;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

データベースの作成と利用ユーザの作成

mysql> CREATE DATABASE hoge;
mysql> GRANT ALL PRIVILEGES ON hoge.* TO hogeuser IDENTIFIED BY 'パスワード';

作成したユーザで接続してみる

$ /usr/mysql/bin/mysql --user=hogeuser --password=パスワード --socket=/var/mysql/data/mysql.sock hoge
mysqld停止
$ /usr/mysql/bin/mysqladmin shutdown --user=root --password=パスワード --socket=/var/mysql/data/mysql.sock

yumコマンドメモ

パッケージを探す
yum search キーワード

特定の(ソース)ファイルを配布しているパッケージを探す

yum provides ファイル名
インストール
yum install パッケージ名
インストールされているパッケージリスト
yum list installed

パッケージ指定で

yum list installed | grep パッケージ名
アップデート
yum update
アンインストール
yum remove パッケージ名

phpでQRコードを出力する(実践編)

讃容日記さんのphp_qrを使って実際にQRコードを出力するまでやってみた。

参考サイトをいろいろ見るとphp_qrをインストールすれば使えるようなことが書いてあったのだが、いくらやってもエラーが発生してしまいます。
どうもGDが入ってないと使えないみたいである。

GDのインストール

yum -y install php-gd

php_qrのインストール

php_qrのインストールにはphpizeを利用するので、php-develが入ってなければインストール。

yum -y install php-devel

今回はphp_qr最新バージョンの0.3.1を使ってみました。

秋のPECLまつり - 讃容日記
http://d.hatena.ne.jp/rsky/20070918/1190041651

また、PNGやJPEGなどでも出力できるようにするので--enable-qr-gdオプションをつけます。

$ wget http://www.opendogs.org/pub/php_qr-0.3.1.tgz
$ tar zxvf php_qr-0.3.1.tgz
$ cd php_qr-0.3.1
$ phpize
./configure --enable-qr-gd
$ make
$ sudo make install

extentionとして読み込ませるために/etc/php.d/qr.iniを作成。

extension=qr.so

サンプルコード

<?php
$data = 'test';
$data = mb_convert_encoding($data, 'SJIS-win', 'UTF-8');
$options = array(
    'format' => QR_FMT_PNG,
    'magnify' => 2,
);
header('Content-Type: ' .qr_mimetype($options['format']) );
qr_output_symbol(null, $data, $options);

これで出ました。


こちらがとても参考になりました。
PHPQRコードを作ろう - PHPプロ!TIPS+
http://www.phppro.jp/phptips/archives/vol46/1

phpでQRコードを出力する

php_qr-0.1.0のインストール・使用例
http://d.hatena.ne.jp/rsky/20070427/1177680276

php_qr-0.1.1
http://d.hatena.ne.jp/rsky/20070428/1177769255

[参考]
http://www.phppro.jp/phptips/archives/vol46/1
http://jo1upk.blogdns.net/linux/?%E3%82%BD%E3%83%95%E3%83%88%2FPHP%2Fphp_qr

※現在はv0.3.1までリリースされています。