EMM研究会でポスター発表しました

JAISTで開催されたマルチメディア情報ハイディング・エンリッチメント(EMM)にて、ポスター発表をしました。これまでの研究成果を実際にアプリケーションとして実装し、デモンストレーションを交えながら説明させて頂きました。多くのご意見を頂いたので今後の検討ポイントとしたいと思います。

論文名: センシティブデータの漏洩検知による適応的な公開範囲設定システムのプロトタイプ実装

ADCS

WebSocketプロトコルのバージョン変更

家のマシンから自分が作ったWebSocketサービスに接続出来なくなったので、少し調べてみたら、
Chrome14からはWebSocketプロトコルのバージョンがdraft10になっていた為でした。
Chrome13まではdraft76で、draft10とは互換性が無いとの事。

使用しているPHPWebSocketはまだ対応していないようですが、下記に関して対応する必要があります。

  $status = '101 Web Socket Protocol Handshake';
  if (array_key_exists('Sec-WebSocket-Key1', $headers)) {
    // draft-76
    $def_header = array(
    'Sec-WebSocket-Origin' => $origin,
    'Sec-WebSocket-Location' => "ws://{$host}{$path}"
    );
    $digest = $this->securityDigest($headers['Sec-WebSocket-Key1'], $headers['S    ec-WebSocket-Key2'], $key3);
  } else {
    // draft-75
    $def_header = array(
    'WebSocket-Origin' => $origin,
    'WebSocket-Location' => "ws://{$host}{$path}"
    );
    $digest = '';
  }

もう少し調べたいところですが、ちょっと時間がないので、、少し落ち着いてから調べます。

こちらに詳しく書かれていました。

memcached 設定メモ

memcachedをPHPから使えるようにしたので、設定方法をメモします。

1. memcached install
最初にmemcachedをインストールします。repositoryはremiにしました。

[root@hoge ~]# yum install memcached --enablerepo=remi
Loaded plugins: downloadonly, fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * addons: ftp.nara.wide.ad.jp
 * base: ftp.nara.wide.ad.jp
 * epel: ftp.iij.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * remi: remi-mirror.dedipower.com
 * updates: ftp.nara.wide.ad.jp
Excluding Packages in global exclude list
Finished
303 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.5-2.el5.remi set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================================
 Package                  Arch                  Version                         Repository           Size
==========================================================================================================
Installing:
 memcached                x86_64                1.4.5-2.el5.remi                remi                 73 k

Transaction Summary
==========================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 73 k
Is this ok [y/N]: y
Downloading Packages:
memcached-1.4.5-2.el5.remi.x86_64.rpm                                              |  73 kB     00:02
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : memcached

Installed:
  memcached.x86_64 0:1.4.5-2.el5.remi

Complete!

完了したら、memcachedを立ち上げたら、telnetでlocalhostのport:11211に接続します。
memcachedのデフォルトportは11211で、接続出来たら stats を実行すると、下記となります。
telnetからquit出来なかった場合hあ、ctrl + ] を実行後にquitします。

[shmachid@hoge ~]$ memcached -u memcached -d
[shmachid@hoge ~]$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT pid 32743
STAT uptime 79
STAT time 1312625362
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.000999
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END

続いて、memcachedへデータを入れてみます。
下記では、key:testに対して、value:12345をセットしています。

[shmachid@hoge ~]$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set test 0 0 5
12345
STORED
get test
VALUE test 0 5
12345
END

2. PHP拡張モジュール install
memcachedは使えるようになったので、次にPHPからmemcachedを使用する為に拡張モジュールをインストールします。
peclには”memcached”もあるようですが、こちらはlibmemcachedの事前インストールが必要となる為、
今回は”memcache”をインストールしました。

[root@hoge ~]# pecl install memcache

PHPからmemcachedに追加出来るか確認します。下記では、key:hogeに対して、value:fugaをセットしています。

<?php

 $memcache_obj = memcache_connect("localhost", 11211);

 $memcache_obj->add('hoge', 'fuga', false, 0);

?>

上記のPHPを実行後、再度telnetで接続してプログラムでセットした値が格納されたかを確認します。

[shmachid@hoge ~]$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get hoge
VALUE hoge 0 4
fuga
END

key:hoge に対して、value:fugaが取れましたので、確認OKです。

以上です。

Comet メモ

WebSocketを使用したmashupを作るにあたり、以前から知られているCometについては、
サーバからpushする技術ぐらいにしか理解していなかった為、少し調べてみました。

  • ■ 目的
  • 従来のWebページはクライアントからリクエストがあった時のみ、サーバからレスポンスが返ってくる。
    その際、クライアントからはHTTPコネクションを生成し、サーバからレスポンスが返るとコネクションはクローズする。
    上記の手法でも通常は問題は無いが、リアルタイム性を求められるアプリケーション等の場合は不都合である。
    (例えば、チャットや株価情報など)
    その場合、AJAX等で非同期にサーバへHTTP通信をする手法が考えられるが、
    サーバ/クライアントに負荷が掛かったり、他ユーザからの更新情報をリアルタイムに受け取る事は難しい。
    こうした経緯からCometと呼ばれる概念(Cometは複数の技術の総称)が生まれた。
    なお、Comet, AJAXの名称は共に洗剤から由来している。

  • ■ トランスポート処理手法
    1. ポーリング
    2. サイトあるいはアプリケーションから、更新有無を問い合わせるリクエストを定期的に送信するという非常に単純な仕組み。
      デメリットとして等間隔(例えば、5秒など)でリクエストを送信するが、サーバ側で高負荷になっていた場合も常にリクエストを出し続けてしまう事が起こり得る。この場合、サーバ側に未処理リクエストが溜まり続けてしまう。

    3. ロングポーリング
    4. クライアントからリクエストをサーバに送信し、すぐに返却可能なデータがある場合はすぐにレスポンスを返すが、まだ返却可能なレスポンスデータが存在しない場合は、レスポンスを返さずに未応答リクエストとしてサーバ側で保持する。
      データの用意が出来た段階で、保持していた接続を見つけてレスポンスを返す。
      Meeboで使用されて、有名となった。
      ロングポーリングの発展系として、スマートポーリングと呼ばれる手法がある。
      スマートポーリングはレスポンスデータが返って来なかった場合にリクエスト頻度を下げるポーリング手法である。
      例えば、空レスポンスであったら、次回のリクエスト間隔は1.5倍にするなど。

    5. 永久フレーム
    6. ロングポーリングは永久フレームから生まれた手法である。
      永久フレームとは、非表示のインラインフレーム(iframe)を開き、
      チャンク形式エンコーディングを利用して送信する。
      この方式は非常に大きなドキュメントを段階的にロードする為に考案された。
      但し、IEでは永久フレームを使用した場合、チャンクを受け取る度に「カチッ」という効果音がなってしまう為、
      使用に耐えないものであった。
      そこで登場したのが、GoogleがGoogle Talk考案したhtmlfileというActiveXオブジェクトを用いる手法である。
      この手法により、IE問題はクリアされ永久フレームは有効な手法として広まった。

    7. XHRストリーミング
    8. サーバと通信をする為の最も良い方法はXMLHttpRequestを使用する事である。
      通常、ポーリングやロングポーリングのデータ転送で使用されている。
      XHRストリーミングでは、XHR通信を行った後にreadystateをチェックし続け、
      接続が切れる前に同一コネクションを使用して会話をする。
      現状、最善の手法であるが、いくつかデメリットが存在する。
      通常Webサーバはリクエストを受けるとすぐにレスポンスを返すように最適化されているが、
      ストリーミングでは接続を保持し続ける必要がある為、注意が必要である。
      また、クライアント側においてははXHRストリーミングがパフォーマンス上の問題を引き起こすケースがある。
      ストリーミングのレスポンスがあまりに長く続くと、ブラウザのメモリ消費が過大となり、クラッシュしてしまう。
      解決方法としては、一定数のレスポンス後に一旦レスポンスを終了し、新たにリクエストを生成すれば良い。
      なお、IEではXHRストリーミングを正式サポートしていないので注意が必要である。

  • ■ 今後の動向
  • 前述までのCometを使用したとしても、大量コネクション保持やサポート問題等の為、完全なソリューションではない。
    そこで、HTML5からforkしたWebSocketに期待が集まっている。
    現在策定中のWebSocketはCometのデメリットを補いつつ、リアルタイムアプリケーションを容易に構築出来る可能性を秘めている。

    調査にあたり、続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティスを参照させてもらいました。


    twitter × Google maps with WebSocket

    twitter API と Google Maps API のmashupサービス twigeo を作りました。
    これだけだとありきたりの為、最近話題に上がるWebSocketを使用し、
    “ほぼ”リアルタイムにServer => Clientへtweetをpushするようにしています。
    誰得なサービスか分からないのですが、、皆さん様々な場所でtweetされているのですね。

    WebSocketを実現する為にPHP WebSocketを使用させてもらいました。
    PHP WebSocketはチャットのような複数クライアント間でメッセージのやり取りを行いやすいように
    設計がされていますが、本サービスではクライアント間のやり取りはなく、
    一方的にサーバ側からpushするのみとなりますので、少し手を入れる必要がありました。
    また、twitter StreamingAPIを使用する際にOAuthが必要ですので、tmhOAuthを使用しています。
    なお、現状WebSocketをサポートしているブラウザは、Chrome, Safariとなります。
    Firefoxは次バージョンからサポートされるようです。

    現在対応出来ていない仕様やバグは以下です。

  • tagエラー
  • 初期画面で自身の位置情報が固定
  • InのTweet量に対して、Outは視認性を良くする為にSleepを入れている関係上、叙々に配信が遅れてしまう
  • いづれも軽微な対応で済みそうですので、暇をみて対応したいと思います。

    Perl, Python, PHPのベンチマークを計測しました

    Perl, Python, PHPのベンチマークを計測しました。

    =====
    1. 環境 及び シナリオ

    1. 実行環境
    2. 実行環境は以下である。
      Platform: Linux(CentOS 5.6)  @sakura VPS
      Memory: 512 MB
      CPU: 仮想2Core

    3. プログラミング言語
    4. 実行・考察を行うプログラミング言語はLAMP構成として通常扱われるスクリプト言語の以下を使用する。
      ・Perl
      ・Python2.4
      ・PHP5.2

    5. 実施シナリオ
    6. No. 演算 概要
      1 i = i + 1 加算
      2 i = i – 1 減算
      3 i = i * i 乗算
      4 i = i / 3 除算
      5 i = i % 3 剰余
      6 s = “Hello,World!” 文字列代入
      7 i = len(string) 文字列数
      8 s = random() ランダム(指定なし)
      9 s = random(1, 100) ランダム(指定あり)
      10 IF (s = “Hello,World!) 文字列判断
      11 IF (i = 5) 数値判断
      12 IF (i = TRUE) Bool値判断
      13 IF文ネスト 条件分岐ネスト
      14 Switch文 ループ(Switch)
      15 While文 ループ(While)
      16 For文 ループ(For)
      17 Foreach文 ループ(Foreach)
      18 print “Hello, World!” 文字列出力
      19 関数呼び出し 関数
      20 File Open, Close オープン, クローズ
      21 File read 1行毎の読み込み
      22 File Write 1行毎の書き込み

      実行時のループ回数は、10000000回ループさせる。但し、実行に時間の掛かり過ぎるシナリオ等に関しては回数を減らす事とする。例外シナリオは以下である。
      No.17: 100000回 PHPにおいて例外が発生する為。
      No.18: 10000回 標準出力に文字列出力する為、処理
      対象のprint文の計測が行いづらい為。

    7. 実施前考察
    8. 本レポートで実行対象となるプログラミング言語はそれぞれ実績のある言語であり、Webサービス開発においてよく使用されている。私はPerl, PHPの経験はあるがPythonは今回が初めての使用となる。
      Perlは全体的に処理が速く、ファイル操作に長けているイメージがある為、全般的にPerlのパフォーマンスが良いと考えている。
      PHPは全体的に処理が遅いイメージがある。特にrandom()やファイル操作が遅いイメージがある。
      Pythonを使用するのは今回が初めてである為、あまりイメージが出来ないが、処理速度的にはPerlと同様の計測値となると予測する。

      よって、 ほぼ全シナリオでPerl < Python < PHP の順番で処理コストが高くなると考える。

    9. 実施方法
    10. 以下の要領で実施を行う。

      1. プログラミング言語毎に22個のプログラムを作成する。
      2. 実施シナリオ毎のアルゴリズムは同一とする。実行時間計測アルゴリズムに関しては後述する。
      3. 言語によっては命令が存在しないケースがある為、その場合は代替(同等)機能を使用する。No.16のPythonにおけるFor文等。
      4. Perlに関しては、ミリ秒単位を取得する組み込み関数がない為、Time::Hiresモジュールを使用する。
      5. シナリオ毎に10回実行し、実行結果として平均値を記録する。その際のコマンドは以下ように実行する。(以下はPythonでの例)
        # loop=1; while [ $loop -le 10 ]; do loop=`expr $loop + 1`; ./check1.py >> result/check1; done;
      6. eの実行結果から平均値を出力するスクリプトを実行し、平均値を得る。平均値出力スクリプトは以下である。
        ====
        #! /usr/bin/perl
        open(IN, $ARGV[0]);
        while (<IN>) {
        $total += $_;
        $count++;
        }
        close(IN);
        print $total / $count . “n”;
        ====
    11. 実行時間計測方法とサンプルコード
    12. 言語毎の実行時間計測は以下のように行う。

      以下では、各言語のシナリオ1のプログラムである。

      Perl
      ====
      #!/usr/bin/perl
      use Time::HiRes;

      my $starttime = Time::HiRes::time;
      for($i=0; $i<10000000; $i++) {
      }
      my $looptime = Time::HiRes::time – $starttime;
      my $starttime = Time::HiRes::time;

      my $j=0;
      for(my $i=0; $i<10000000; $i++) {
      $j = $j + 1;
      }
      print Time::HiRes::time – $starttime – $looptime . “n”;
      ====

      Python
      ====
      #!/usr/bin/python
      import time

      starttime = time.clock()
      for i in range(10000000):
      pass

      looptime = time.clock() – starttime
      starttime = time.clock()

      j = 0
      for i in range(10000000):
      j = j + 1

      print time.clock() – starttime – looptime
      ====

      PHP
      ====
      <?php
      $starttime = microtime(true);
      for($i = 0; $i<10000000; $i++) {
      }
      $looptime = microtime(true) – $starttime;
      $starttime = microtime(true);

      $j=0;
      for($i=0; $i<10000000; $i++) {
      $j = $j + 1;
      }
      echo microtime(true) – $starttime – $looptime . “n”;
      ?>
      ====

    2. 実行

    1. 実行結果
    2. 以下が実行結果である。シナリオ毎に最も良いタイムに橙色にしている。また、特徴的な値となった結果は赤色とし、次項以降で考察を行う。なお、単位は全て”秒”である。

      演算 Perl Python PHP
      i = i + 1 0.8 1.04 0.44
      i = i – 1 0.81 1.13 0.45
      i = i * i 0.82 1.3 0.46
      i = i / 3 0.74 1.56 0.73
      i = i % 3 0.84 1.47 0.5
      s = “Hello,World!” 0.87 0.65 0.93
      i = len(string) 1.12 1.64 1.8
      s = random() 0.22 2.05 1.73
      s = random(1, 100) 0.95 27.65 2.86
      IF (s = “Hello,World!) 0.89 0.51 0.78
      IF (i = 5) 0.94 0.49 0.44
      IF (i = TRUE) 0.97 1.08 0.37
      IF文ネスト 0.60 2.05 1.67
      Switch文 251.03 2.81 2.01
      While文 1.13 1.64 0.77
      For文 0.67 1.18 0.91
      Foreach文 0.02 0.01 0.06
      print “Hello, World!” 1.2 0.47 0.96
      関数呼び出し 1.74 1.52 1.56
      File Open, Close 69.01 61.46 80.04
      File read 2 1.46 3.54
      File Write 2.02 4.94 23.18

    3. 考察

    実行前の考察では、全てのシナリオでPerlが優位だと考えていたが、結果は異なっていた。
    この考察としてはPerlの時間計測用の関数において、ミリ秒単位で計測が出来なかった為、
    Time::Hiresモジュールを使用した事が影響している可能性がある。
    但し、Perlならではの優位性が示されているシナリオもある為、現状のまま考察を進める事とする。

    1. randint()
    2. Pythonのrandint()が非常に遅い結果となった。Perlと比較すると約27倍の差である。調査したところ、Perl, PHPのrand()は組み込み関数であるのに対し、Pythonのrandint()は標準モジュールでの提供であった。
      また、randint()よりもchoice()を使用した方が速いとの情報があった為、変更し実行計測したところ、
      27.65 → 12.36 と半分以下の実行結果となった。但し、Perl, PHPと比較するとまだ遅い結果であった。
      この事からC等で記述される組み込み関数はやはり速いということが分かった。

    3. switch文
    4. Perlのswitch文が異常な程、遅い結果となった。これはPerlには組み込みでswitch文がない為、標準モジュールのSwitchを使用した事が影響していると考えられる。最速であったPHPと比較するとその差は100倍である。
      3.1のrand()と同様に以下に組み込み機能が速いかを再認識させられた。

    5. File操作
    6. 実行前の考察よりPHPはファイル操作が不得意であると考えていたが、その通りの結果であった。特にfopen(), fclose(), fwrite()のパフォーマンスが悪かった。
      また、ファイル操作はPerlが非常に有利だと考えていたが、Pythonが健闘している。

    7. その他
    8. シナリオ毎の実行結果の色付けを確認すると、PHP列に橙色が多く付いている。PHPは全般的に処理が遅いと考えていたが、結果から見ると異なっていた。以前の経験ではPHPのrandom()は遅いと感じていたが、やはりPerlと比較すると倍以上の差が出ていた。(Pythonとの比較に関しては、3.1を参照の事)

    9. 最後に
    10. それぞれのプログラミング言語には高速化技術が存在する。例えば、Perl: mod_perl, Python: mod_wsgi, PHP: APC, eAcceralator等である。これらの技術を使用すれば、より良いパフォーマンスが出やすいが、その前段階として、言語毎の特徴を押さえた上でプログラミング言語の選択や処理ロジック, アルゴリズムを組んでいく必要がある。

    =====

    おわりです。

    PHPアクセラレータを入れてみる

    PHP5.2へバージョンアップしたついでに、PHPアクセラレータを入れました。
    こちらを参考にさせていただきました。

    PHPはアクセス都度、パース→コンパイル→(中間コード)→実行を行いますが、
    PHPアクセラレータを導入する事で、ある条件下でパース→コンパイルが不要となります。

    代表的なPHPアクセラレータは以下です。

  • APC(Alternative PHP Cache)
  • eAccelerator
  • XCache
  • PHPA(PHP Accelerator)

    PHPAはPHP5系をサポートしていない為、選択肢としては残りの3つからとなりますが、
    特に性能を求めている訳でもないので、他の方々もよくいれているAPCにします。

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

    [root@centos]# vi /etc/yum.repos.d/sea-mew.repo
    [sea-mew-noarch]
    name=SeaMew Fedora AddIn Packages
    baseurl=ftp://sea-mew.jp/yum/el5/noarch/
    enabled=1
    gpgcheck=0
    
    [sea-mew-common]
    name=SeaMew Fedora AddIn Packages
    baseurl=ftp://sea-mew.jp/yum/el5/x86_64
    enabled=1
    gpgcheck=0
    

    パッケージがあるか検索します。

    [root@centos]# yum search php-apc
    Loaded plugins: downloadonly, fastestmirror, priorities
    Loading mirror speeds from cached hostfile
     * addons: ftp.nara.wide.ad.jp
     * base: ftp.nara.wide.ad.jp
     * epel: ftp.jaist.ac.jp
     * extras: ftp.nara.wide.ad.jp
     * remi: rpms.famillecollet.com
     * rpmforge: fr2.rpmfind.net
     * updates: ftp.nara.wide.ad.jp
    addons                                                           |  951 B     00:00
    base                                                             | 2.1 kB     00:00
    c5-testing                                                       | 1.9 kB     00:00
    epel                                                             | 3.7 kB     00:00
    epel/primary_db                                                  | 3.6 MB     00:00
    extras                                                           | 2.1 kB     00:00
    remi                                                             | 2.6 kB     00:00
    remi/primary_db                                                  | 251 kB     00:01
    rpmforge                                                         | 1.1 kB     00:00
    sea-mew-common                                                   |  951 B     00:00
    sea-mew-common/primary                                           | 2.0 MB     00:01
    sea-mew-common                                                                6548/6548
    sea-mew-noarch                                                   |  951 B     00:00
    sea-mew-noarch/primary                                           | 1.0 MB     00:01
    sea-mew-noarch                                                                3898/3898
    updates                                                          | 1.9 kB     00:00
    Reducing CentOS-5 Testing to included packages only
    Finished
    2227 packages excluded due to repository priority protections
    =================================== Matched: php-apc ===================================
    php-apc.x86_64 : The apc (Alternative PHP Cache) module for PHP
    php-apc-admin.x86_64 : Web admin GUI for apc (Alternative PHP Cache)
    

    sea-mew-common にありましたので、yumでインストールします。

    [root@centos]# yum install php-apc
    Loaded plugins: downloadonly, fastestmirror, priorities
    Loading mirror speeds from cached hostfile
     * addons: ftp.nara.wide.ad.jp
     * base: ftp.nara.wide.ad.jp
     * epel: ftp.jaist.ac.jp
     * extras: ftp.nara.wide.ad.jp
     * remi: rpms.famillecollet.com
     * rpmforge: fr2.rpmfind.net
     * updates: ftp.nara.wide.ad.jp
    Reducing CentOS-5 Testing to included packages only
    Finished
    2227 packages excluded due to repository priority protections
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package php-apc.x86_64 1:3.1.6-0m set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================
     Package           Arch             Version              Repository                Size
    ========================================================================================
    Installing:
     php-apc           x86_64           1:3.1.6-0m           sea-mew-common           304 k
    
    Transaction Summary
    ========================================================================================
    Install       1 Package(s)
    Upgrade       0 Package(s)
    
    Total download size: 304 k
    Is this ok [y/N]: y
    Downloading Packages:
    php-apc-3.1.6-0m.x86_64.rpm                                      | 304 kB     00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing     : php-apc                                                          1/1
    
    Installed:
      php-apc.x86_64 1:3.1.6-0m
    
    Complete!
    

    GUIが用意されているようですので、インストールしておきます。

    [root@centos]# yum install php-apc-admin
    Loaded plugins: downloadonly, fastestmirror, priorities
    Loading mirror speeds from cached hostfile
     * addons: ftp.nara.wide.ad.jp
     * base: ftp.nara.wide.ad.jp
     * epel: ftp.jaist.ac.jp
     * extras: ftp.nara.wide.ad.jp
     * remi: rpms.famillecollet.com
     * rpmforge: fr2.rpmfind.net
     * updates: ftp.nara.wide.ad.jp
    Reducing CentOS-5 Testing to included packages only
    Finished
    2227 packages excluded due to repository priority protections
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package php-apc-admin.x86_64 1:3.1.6-0m set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================
     Package               Arch           Version              Repository              Size
    ========================================================================================
    Installing:
     php-apc-admin         x86_64         1:3.1.6-0m           sea-mew-common          22 k
    
    Transaction Summary
    ========================================================================================
    Install       1 Package(s)
    Upgrade       0 Package(s)
    
    Total download size: 22 k
    Is this ok [y/N]: y
    Downloading Packages:
    php-apc-admin-3.1.6-0m.x86_64.rpm                                |  22 kB     00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing     : php-apc-admin                                                    1/1
    /var/tmp/rpm-tmp.74136: line 1: fg: no job control
    エラー: %post(php-apc-admin-3.1.6-0m.x86_64) スクリプトの実行に失敗しました。終了ステー タス 1
    
    Installed:
      php-apc-admin.x86_64 1:3.1.6-0m
    
    Complete!
    

    エラーが出ましたが、一旦このまま進めます。
    以下をコピーし、apacheをrestartします。

  • apc-mmap.so
  • apc-sem.so
    [root@centos]# cp -a /usr/lib64/php/extensions/apc-*.so /usr/lib64/php/modules/
    [root@centos]# ls -al /usr/lib64/php/modules/apc*
    -rwxr-xr-x 1 root root 166067  1月 20 06:09 /usr/lib64/php/modules/apc-mmap.so
    -rwxr-xr-x 1 root root 163217  1月 20 06:09 /usr/lib64/php/modules/apc-pthread.so
    -rwxr-xr-x 1 root root 163395  1月 20 06:09 /usr/lib64/php/modules/apc-sem.so
    -rwxr-xr-x 1 root root 162476  1月 20 06:09 /usr/lib64/php/modules/apc-spinlocks.so
    [root@centos]# service httpd restart
    httpd を停止中:                                            [  OK  ]
    httpd を起動中:                                            [  OK  ]
    
  • PHP5.2xインストール

    WordPressのplugin quick-cacheをインストールしたところ、PHP5.2へバージョンアップしろと言い出した為、
    PHP5.1 → 5.2へバージョンアップをする事にしました。
    現在のyumでは5.1までしか入らないようですので、新たにリポジトリを追加して5.2をインストールします。
    なお、こちらを参考にさせて頂きました。

    最初にPHPのバージョンを確認します。

    [root@centos]# php -v
    PHP 5.1.6 (cli) (built: Nov 29 2010 16:47:46)
    Copyright (c) 1997-2006 The PHP Group
    Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
    
    [root@centos]# yum list installed | grep php*
    php.x86_64                                5.1.6-27.el5_5.3             installed
    php-cli.x86_64                            5.1.6-27.el5_5.3             installed
    php-common.x86_64                         5.1.6-27.el5_5.3             installed
    php-mbstring.x86_64                       5.1.6-27.el5_5.3             installed
    php-mcrypt.x86_64                         5.1.6-15.el5.centos.1        installed
    php-mysql.x86_64                          5.1.6-27.el5_5.3             installed
    php-pdo.x86_64                            5.1.6-27.el5_5.3             installed
    

    続いて、リポジトリを追加します。

    [root@centos]# 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
    priority=0
    

    updateします。

    [root@centos]# yum -y update php
    Loaded plugins: downloadonly, fastestmirror, priorities
    Loading mirror speeds from cached hostfile
     * addons: ftp.nara.wide.ad.jp
     * base: ftp.nara.wide.ad.jp
     * epel: ftp.jaist.ac.jp
     * extras: ftp.nara.wide.ad.jp
     * remi: rpms.famillecollet.com
     * rpmforge: fr2.rpmfind.net
     * updates: ftp.nara.wide.ad.jp
    Reducing CentOS-5 Testing to included packages only
    Finished
    548 packages excluded due to repository priority protections
    Setting up Update Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package php.x86_64 0:5.2.16-jason.1 set to be updated
    --> Processing Dependency: php-common = 5.2.16-jason.1 for package: php
    --> Processing Dependency: php-cli = 5.2.16-jason.1 for package: php
    --> Running transaction check
    ---> Package php-cli.x86_64 0:5.2.16-jason.1 set to be updated
    --> Processing Dependency: php-common = 5.1.6-27.el5_5.3 for package: php-pdo
    --> Processing Dependency: php-common = 5.1.6-27.el5_5.3 for package: php-mbstring
    --> Processing Dependency: php-common = 5.1.6-27.el5_5.3 for package: php-mysql
    ---> Package php-common.x86_64 0:5.2.16-jason.1 set to be updated
    --> Running transaction check
    ---> Package php-mbstring.x86_64 0:5.2.16-jason.1 set to be updated
    ---> Package php-mysql.x86_64 0:5.2.16-jason.1 set to be updated
    --> Processing Dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit) for package: php-mysql
    --> Processing Dependency: libmysqlclient.so.16()(64bit) for package: php-mysql
    ---> Package php-pdo.x86_64 0:5.2.16-jason.1 set to be updated
    --> Running transaction check
    --> Processing Dependency: libmysqlclient.so.15()(64bit) for package: mysql-server
    --> Processing Dependency: libmysqlclient.so.15()(64bit) for package: perl-DBD-MySQL
    --> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) for package: mysql-server
    --> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15)(64bit) for package: perl-DBD-MySQL
    --> Processing Dependency: libmysqlclient_r.so.15()(64bit) for package: mysql-server
    --> Processing Dependency: libmysqlclient_r.so.15(libmysqlclient_15)(64bit) for package: mysql-server
    --> Processing Dependency: mysql = 5.0.77-4.el5_5.4 for package: mysql-server
    ---> Package mysql.x86_64 0:5.1.52-jason.1 set to be updated
    --> Running transaction check
    ---> Package mysql-server.x86_64 0:5.1.52-jason.1 set to be updated
    ---> Package mysqlclient15.x86_64 0:5.0.91-1.jason.1 set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================
     Package              Arch          Version                 Repository             Size
    ========================================================================================
    Updating:
     php                  x86_64        5.2.16-jason.1          utterramblings        3.8 M
    Installing for dependencies:
     mysqlclient15        x86_64        5.0.91-1.jason.1        utterramblings        2.0 M
    Updating for dependencies:
     mysql                x86_64        5.1.52-jason.1          utterramblings        3.5 M
     mysql-server         x86_64        5.1.52-jason.1          utterramblings         13 M
     php-cli              x86_64        5.2.16-jason.1          utterramblings        2.6 M
     php-common           x86_64        5.2.16-jason.1          utterramblings        522 k
     php-mbstring         x86_64        5.2.16-jason.1          utterramblings        1.4 M
     php-mysql            x86_64        5.2.16-jason.1          utterramblings        280 k
     php-pdo              x86_64        5.2.16-jason.1          utterramblings        169 k
    
    Transaction Summary
    ========================================================================================
    Install       1 Package(s)
    Upgrade       8 Package(s)
    
    Total size: 27 M
    Downloading Packages:
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Updating       : php-common                                                      1/17
      Installing     : mysqlclient15                                                   2/17
      Updating       : php-pdo                                                         3/17
      Updating       : mysql                                                           4/17
      Updating       : php-cli                                                         5/17
      Updating       : php-mysql                                                       6/17
      Updating       : php                                                             7/17
    
     ******************************************************************************
     * If this is a new installation you should run 'mysql_secure_installation'.  *
     *                                                                            *
     * If you are upgrading from a previous version of MySQL you should run the   *
     * 'mysql_upgrade' script to check your tables and update them to the newest  *
     * format. This command may take a long time to run if you have large tables. *
     ******************************************************************************
    
      Updating       : mysql-server                                                    8/17
      Updating       : php-mbstring                                                    9/17
      Cleanup        : php-common                                                     10/17
      Cleanup        : php-mysql                                                      11/17
      Cleanup        : php                                                            12/17
      Cleanup        : php-pdo                                                        13/17
      Cleanup        : php-cli                                                        14/17
      Cleanup        : mysql                                                          15/17
      Cleanup        : mysql-server                                                   16/17
      Cleanup        : php-mbstring                                                   17/17
    
    Dependency Installed:
      mysqlclient15.x86_64 0:5.0.91-1.jason.1
    
    Updated:
      php.x86_64 0:5.2.16-jason.1
    
    Dependency Updated:
      mysql.x86_64 0:5.1.52-jason.1              mysql-server.x86_64 0:5.1.52-jason.1
      php-cli.x86_64 0:5.2.16-jason.1            php-common.x86_64 0:5.2.16-jason.1
      php-mbstring.x86_64 0:5.2.16-jason.1       php-mysql.x86_64 0:5.2.16-jason.1
      php-pdo.x86_64 0:5.2.16-jason.1
    
    Complete!
    

    インストール出来たので、確認します。

    [root@centos]# php -v
    PHP Warning:  PHP Startup: mcrypt: Unable to initialize module
    Module compiled with module API=20050922, debug=0, thread-safety=0
    PHP    compiled with module API=20060613, debug=0, thread-safety=0
    These options need to match
     in Unknown on line 0
    PHP 5.2.16 (cli) (built: Dec 17 2010 14:11:16)
    Copyright (c) 1997-2010 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
    

    PHP自体は5.2になっていますが、Warningが出ていました。
    php-mcryptが5.1のままでしたので、明示してupdateします。

    [root@centos]# yum list installed | grep php*
    php.x86_64                                5.2.16-jason.1               installed
    php-cli.x86_64                            5.2.16-jason.1               installed
    php-common.x86_64                         5.2.16-jason.1               installed
    php-mbstring.x86_64                       5.2.16-jason.1               installed
    php-mcrypt.x86_64                         5.1.6-15.el5.centos.1        installed
    php-mysql.x86_64                          5.2.16-jason.1               installed
    php-pdo.x86_64                            5.2.16-jason.1               installed
    
    [root@centos]# yum update php-mcrypt
    Loaded plugins: downloadonly, fastestmirror, priorities
    Loading mirror speeds from cached hostfile
     * addons: ftp.nara.wide.ad.jp
     * base: ftp.nara.wide.ad.jp
     * epel: ftp.jaist.ac.jp
     * extras: ftp.nara.wide.ad.jp
     * remi: rpms.famillecollet.com
     * rpmforge: fr2.rpmfind.net
     * updates: ftp.nara.wide.ad.jp
    Reducing CentOS-5 Testing to included packages only
    Finished
    548 packages excluded due to repository priority protections
    Setting up Update Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package php-mcrypt.x86_64 0:5.2.16-jason.1 set to be updated
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================
     Package            Arch           Version                 Repository              Size
    ========================================================================================
    Updating:
     php-mcrypt         x86_64         5.2.16-jason.1          utterramblings          50 k
    
    Transaction Summary
    ========================================================================================
    Install       0 Package(s)
    Upgrade       1 Package(s)
    
    Total download size: 50 k
    Is this ok [y/N]: y
    Downloading Packages:
    php-mcrypt-5.2.16-jason.1.x86_64.rpm                             |  50 kB     00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Updating       : php-mcrypt                                                       1/2
      Cleanup        : php-mcrypt                                                       2/2
    
    Updated:
      php-mcrypt.x86_64 0:5.2.16-jason.1
    
    Complete!
    

    忘れずに最初追加したリポジトリを無効化(enabled=0)しておきます。

    [root@centos]# vi /etc/yum.repos.d/utterramblings.repo
    [utterramblings]
    name=Jason’s Utter Ramblings Repo
    baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
    enabled=0
    gpgcheck=1
    gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
    priority=0
    

    apache restart

    [root@centos]# service httpd restart
    httpd を停止中:                                            [  OK  ]
    httpd を起動中:                                            [  OK  ]
    

    ブラウザから確認してみると表示されなかった為、apacheのエラーログを確認すると
    メモリサイズがオーバーしているようなので、今回は手っ取り早く割り当てを増やしました。

    [root@centos]# tail -f /etc/httpd/logs/error_log
    PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted.........
    [root@centos]# vi /etc/php.ini
    ...
    memory_limit = 48M
    ...
    

    最後にもう一度apacheをrestartすれば完了です。