2011年 3月 の投稿一覧

Snow Leopard に PHP5.3 の環境に PHP4.4.9 をインストール

普段は迷わずPHP5.3使うのですが、今やってるサイトがPHP4なのでインストールしたときのログを残しておきます。

前提

  • PHPはシステムにもともと入ってるPHP5.3(portsでインストールしたものでない)
  • ApacheはportsでインストールしたApache2.2
  • どのようにするか

    PHP4はソースからインストールする。makeしてできるApahceのモジュールのMIMEタイプを『application/x-h-httpd-php4』で作成する。バーチャルホストの設定でPHP4で動くようにする。

    make準備

    [suusuke@macbook ~]$ curl -o php-4.x.tar.gz -L http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror
    [suusuke@macbook ~]$ tar zxvf php-4.x.tar.gz
    [suusuke@macbook ~]$ cd php-4.4.49
    

    sapi/apache2handler/sapi_apache2.cを変更する。

    #define PHP_MAGIC_TYPE "application/x-httpd-php"
    

    #define PHP_MAGIC_TYPE "application/x-httpd-php4"
    

    configure

    とりあえず最低限、必要そうなものをオプションに追加しました。
    また、Snow Leopardでconfigureする時はlresolvを有効にする必要があるようなので、『EXTRA_LIBS=-lresolv』で指定する。

    [suusuke@macbook ~]$ EXTRA_LIBS=-lresolv \ 
     ./configure --prefix=/usr/local/lib/php-4.4.9 \
     --with-apxs2=/usr/sbin/apxs \
     --enable-mbstring \
     --with-pgsql=/opt/local/lib/postgresql83 \
     --with-pdo-pgsql=/opt/local/lib/postgresql83 \
     --with-mysql \
     --with-pdo \
     --with-gd \
     --with-png-dir=/opt/local \
     --with-jpeg-dir=/opt/local \
     --with-zlib-dir=/opt/local
    

    ないものは基本portでインストール。
    今回インストールしたのは

    [suusuke@macbook ~]$ sudo port install libpng
    [suusuke@macbook ~]$ sudo port install jpeg
    

    の二つ。

    MySQL、PostgreSQLのインストールについてはSnow Leopard に PostgreSQL インストールSnow Leopard に MySQL 再インストールを参照。

    make

    [suusuke@macbook ~]$ make
    [suusuke@macbook ~]$ sudo make install
    

    設定

    [suusuke@macbook ~]$ sudo cp php.ini-recommended /usr/local/lib/php-4.4.9/lib/php.ini
    

    PHP.iniのinclude_pathにPEARのパスを追加。。。したいところだったんだけど、PEARがインストールされない。。。
    とりあえず、PEARは未だにPEAR::DB使ってるんみたいなんで、手動で入れることに。

    aliasの設定

    ~/.bashrc

    alias php4=/usr/local/lib/php-4.4.9/bin/php
    

    反映

    [suusuke@macbook ~]$ source ~/.bashrc
    

    確認

    [suusuke@macbook ~]$ php4 -v
    PHP 4.4.9 (cli) (built: Mar 26 2011 10:08:22)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    

    バーチャルホストの設定

    # test.php5.info
    <VirtualHost *:80>
        DocumentRoot "/Library/WebServer/Documents/php5/public_html"
        ServerName test.php5.info
        <Directory "/Library/WebServer/Documents/php5/public_html">
            AllowOverride All
            order deny,allow
            allow from All
        </Directory>
    </VirtualHost>
    
    # test.php4.info
    <VirtualHost *:80>
        DocumentRoot "/Library/WebServer/Documents/php4/public_html"
        ServerName test.php4.info
        <Directory "/Library/WebServer/Documents/php4/public_html">
            AllowOverride All
            order deny,allow
            AddType application/x-httpd-php4 .php
            allow from All
        </Directory>
    </VirtualHost>
    

    phpinfo();で確認してみる。

    削除したいときは

    /usr/local/lib/php-4.4.9
    php-x.x.x/
          bin/ 	PHPコマンドなど
          etc/ 	pear設定ファイル
          include/ 	ヘッダファイルなど
          lib/php 	PEARライブラリディレクトリ
          man/ 	マニュアル
    
    /opt/local/apache2/modules/libphp4.so
    

    を削除するだけ。

    参考にさせてもらったサイト

    http://www.atmarkit.co.jp/fcoding/articles/macxphp/02/macxphp02a.html

    Snow Leopard に PostgreSQL インストール

    個人的にはMySQLの方が好きなんですが、開発環境としてPostgreSQLが必要になったのでその時のインストールメモ。

    ※euc-jpでcreatedbできなくて、3回インストール、アンインストールを繰り返しました・・・

    インストール

    今回は、PostgresSQL8.3をインストールする必要が有ったので、portで検索してからインストール。

    [suusuke@macbook ~]$ sudo port search postgresql
    [suusuke@macbook ~]$ sudo port install postgresql83
    [suusuke@macbook ~]$ sudo port install postgresql83-server
    

    ちなみに、postgresql83とpostgresql83-serverの違いは

    postgresql83 postgresql83-server
    psqlやpg_dumpなどのPostgreSQLのクライアントユーティリティ initdbやpg_ctlなどのPostgreSQLのサーバユーティリティ。
    DBMSサーバとして必要な機能はこれに含まれています。

    という感じです。

    自動起動・解除

    [suusuke@macbook ~]$ sudo port load postgresql83-server
    [suusuke@macbook ~]$ sudo launchctl list | grep macports ← 確認
    

    解除する場合は

    [suusuke@macbook ~]$ sudo port unload postgresql83-server
    

    領域確保と初期化

    portsでインストールするとログに書いてあるのでそのまま実行。

    [suusuke@macbook ~]$ sudo mkdir -p /opt/local/var/db/postgresql83/defaultdb
    [suusuke@macbook ~]$ sudo chown postgres:postgres /opt/local/var/db/postgresql83/defaultdb/
    

    euc-jpの場合は

    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/initdb -E EUC-JP --no-locale -D /opt/local/var/db/postgresql83/defaultdb'
    

    特に設定しない場合はデフォルト(ロケールの設定、通常はUTF-8)。

    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/initdb -D /opt/local/var/db/postgresql83/defaultdb'
    

    スタート・ストップ

    [suusuke@macbook ~]$ sudo su - postgres /opt/local/lib/postgresql83/bin/postgres -D /opt/local/var/db/postgresql83/defaultdb
    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/pg_ctl -D /opt/local/var/db/postgresql83/defaultdb stop'
    

    インストールログに起動方法はもう一つあるが

    [suusuke@macbook ~]$ sudo su postgres -c 'pg_ctl -D /opt/local/var/db/postgresql83/defaultdb -l logfile start'
    Password:
    server starting
    sh: logfile: Permission denied
    

    logfileがPermission deniedになってしまう、これはlogfileを絶対パスにしてやればOK

    [suusuke@macbook ~]$ sudo su postgres -c 'pg_ctl -D /opt/local/var/db/postgresql83/defaultdb -l /opt/local/var/db/postgresql84/logfile start'
    server starting
    

    補足

    インストールして追加されたpostgresユーザー情報の確認

    [suusuke@macbook ~]$ dscl . -read /Users/postgres
    AppleMetaNodeLocation: /Local/Default
    GeneratedUID: 8D95D02C-E3FB-4F3B-956B-96320B8FE6CD
    NFSHomeDirectory: /opt/local/var/db/postgresql83
    Password: *
    PrimaryGroupID: 500
    RealName:
     PostgreSQL-83 Server
    RecordName: postgres
    RecordType: dsRecTypeStandard:Users
    UniqueID: 500
    UserShell: /bin/sh
    
    [suusuke@macbook ~]$ dscl . -read /Groups/postgres
    AppleMetaNodeLocation: /Local/Default
    GeneratedUID: 8427C813-9996-42F4-9D92-83E57CDA93DA
    Password: *
    PrimaryGroupID: 500
    RealName: postgres
    RecordName: postgres
    RecordType: dsRecTypeStandard:Groups
    

    ルート権限でsu(switch user)したい場合はと sudo su xxxxx やれば良い事を初めて知った。。。
    macでしか使う事は無いと思うけど。

    Snow Leopard に MySQL 再インストール

    Snow Leopard に PHP4 の環境が必要になったときに、configure出来なくてmysql5じゃだめでmysql5-develを入れ直した時のメモ。

    ※結果的にはmysql5-devel入れてもconfigureは出来なかったんだけど・・・

    バックアップ

    [suusuke@macbook ~]$ mysqldump5 -u root -x --all-databases > ~/Desktop/mysql_dump.sql
    

    portsでインストールしたmysql5をアンインストール

    [suusuke@macbook ~]$ sudo port uninstall mysql5
    [suusuke@macbook ~]$ sudo port installed | less ← 確認
    

    portsでmysql5-develをインストール

    [suusuke@macbook ~]$ sudo port search mysql5
    mysql5 @5.1.56 (databases)
        Multithreaded SQL database server
    
    mysql5-devel @5.5.2-m2 (databases)
        Multithreaded SQL database server
    
    mysql5-server @5.1.56 (databases)
        Multithreaded SQL database server
    
    mysql5-server-devel @5.5.2-m2 (databases)
        Multithreaded SQL database server
    
    Found 4 ports.
    
    [suusuke@macbook ~]$ sudo port install mysql5-devel
    [suusuke@macbook ~]$ sudo port install mysql5-server-devel
    
    [suusuke@macbook ~]$ sudo port load mysql5-server-devel ← 自動起動
    

    ダンプリストア

    [suusuke@macbook ~]$ mysql5 -u root -p < ~/Desktop/mysql_dump.sql [/bash]

    CakePHP Authコンポーネントでユーザー情報とセッションの更新

    ログインの処理はAuthコンポーネントを使用する事が多いと思います。
    Authコンポーネントを使用すると、ユーザー情報はセッションに保存されますが、認証に使うテーブル(デフォルトUsers)を更新した場合は保存されているセッションは更新されないので以下のようにします。

    $this->User->save($data);
    $this->Auth->login($this->Auth->user('id'));
    

    こうすると、セッションも更新されます。

    http://api13.cakephp.org/class/auth-component#method-AuthComponentlogin

    MySQLのキャッシュサイズ変更で重いSQLを高速化

    MySQLパフォーマンスチューニングのためのクエリの基礎知識
    パフォーマンスチューニングについては↑が非常に参考になります。

    ただ、いくらパフォーマンスチューニングをしてもMySQLの設定がデフォルトでは限界が有るので、設定も変更する必要が有ります。

    InnoDBをメインストレージエンジンとしている場合は、

    innodb_buffer_pool_size
     ⇒InnoDBのインデックスやレコードをキャッシュするメモリ領域のサイズ
    
    innodb_log_file_size
     ⇒InnoDBの更新ログを記録するディスク上のファイルサイズ
     ⇒innodb_buffer_pool_sizeのサイズを増やしたらinnodb_log_file_sizeも合わせて調整する必要が有る。
    

    が重要。

    SHOW VARIABLESコマンドで現状の設定をまず確認。

    mysql > SHOW VARIABLES LIKE "innodb_%_size";
    +---------------------------------+---------+
    | Variable_name                   | Value   |
    +---------------------------------+---------+
    | innodb_additional_mem_pool_size | 1048576 |
    | innodb_buffer_pool_size         | 8388608 |
    | innodb_log_buffer_size          | 1048576 |
    | innodb_log_file_size            | 5242880 |
    +---------------------------------+---------+
    4 rows in set (0.00 sec)
    

    innodb_buffer_pool_sizeはデフォルトでは8Mに割り当てられています。
    変更するにはWindowsの場合はmy.ini、Linux系の場合はmy.cnfを編集します。

    innodb_buffer_pool_size = 16M
    innodb_log_file_size = 2M
    

    MySQLを再起動して、確認。

    mysql > SHOW VARIABLES LIKE "innodb_%_size";
    +---------------------------------+----------+
    | Variable_name                   | Value    |
    +---------------------------------+----------+
    | innodb_additional_mem_pool_size | 1048576  |
    | innodb_buffer_pool_size         | 16777216 |
    | innodb_log_buffer_size          | 1048576  |
    | innodb_log_file_size            | 2097152  |
    +---------------------------------+----------+
    4 rows in set (0.00 sec)
    

    開発環境ではデフォルトの設定で開発していたので、本番環境からデータを取ってくるとSQLが重すぎる!ってことがありましたが、これで解消されました。

    [参考にさせて頂いたサイト]
    5分でできる、MySQLのメモリ関係のチューニング!
    MySQL 初めてのチューニング

    Windows7でmy.iniの編集について

    my.iniをsakuraエディタで変更して、再起動しても全然設定が反映されない・・・。

    何の事は無い、管理者権限で開いたら設定が変更できました。

    設定変更したら、確認はしないと駄目ですね。

    今回設定変更した箇所

    # Set the SQL mode to strict
    #sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    確認方法はコンソールから

    SELECT @@sql_mode;
    

    MySQLの削除について

    Windows7でMySQLをアンインストールするとゴミデータとサービスがそのまま残った状態になってしまう(サービスに登録している場合)。
    データは手動で削除出来るが、サービスは以下の方法で削除できる。

    sc delete mysql
    

    ※mysqlという名前でサービスが登録されていた場合

    Windows7、Vistaの場合は管理者権限でコマンドプロンプトを起動しないと「アクセスを拒否されました」となってしまうので注意。