高速化、最適化へのあくなき挑戦は続く。
今回は、PHP のアプリケーションを C++ に変換してネイティブ動作させてしまうという、にいさんに教えてもらった HipHop for PHP で WordPress を動作させることに挑戦です。
きまったリソースの中で最大限を求めるロマンは、コンピュータの世界もバイクの世界も同じに違いない、きゅるるるるる…、ぼぼん! では、いってみましょう。 🙂
…結論から言いますと、WordPress を動かすことは失敗しています。。 にいさんに夢を託します。(笑)
まずは、HipHop for PHP から。
HipHop transforms your PHP source code into highly optimized C++ and then compiles it with g++ to build binary files. You keep coding in simpler PHP, then HipHop executes your source code in a semantically equivalent manner and sacrifices some rarely used features – such as eval() – in exchange for improved performance.
最近では JavaVM や .NET の CLI ではランタイム最適化でネイティブのスピードを超えてしまうこともあるらしいですが、PHP のインタプリタにそれを望むのは厳しいというわけで、C++ にしてネイティブにしてしまえ! というプロダクトです。
Facebook で使われているそうですが、すごいっすね。
スクリーンショットに意味はない。。
さてちょうどいいことに、さくら VPS のデフォルト OS である CentOS 5 AMD64 用の rpm が Hiphot サイトで提供されています。
Installing or Building HipHop-PHP via RPM on CentOS 5 – hiphop-php – GitHub
HipHop has been developed on CentOS and Fedora, but only based on source code and some patches. You may found this way is hard.
So, I create some patched RPM’s for easy HipHop installation on CentOS 5At the moment, RPM’s only for 64 bits systems. I work on 32bits in that moment, and you can get RPMS as soon as possible.
じゃ、じゃ、じゃー、さくらの VPS で動かしてスピードの向こう側をみてやろうじゃないか、というのがこの企画。
サイトの手順でいけるかなと思ったのですが、依存関係でなかなか手強い。。 おそらく以下の手順で依存は解消できると思われます。(ただし、後述するとおりセグるのでだめなのかもです)
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
yum install cvsps
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum install --enablerepo=remi mysql-server mysql-libs
yum install --enablerepo=remi mysql-devel-5.1.50-2.el5.remi
/etc/init.d/mysqld start
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
yum install --enablerepo=rpmforge perl-Error.noarch
wget http://www.n0c.org/RPM/centos/5/x86_64/tla-1.3.5-7.x86_64.rpm
rpm -ivh tla-1.3.5-7.x86_64.rpm
yum install tk gd gd-devel mcrypt libmcrypt tidy mhash freetds net-snmp httpd-mmn libtool-ltdl
yum remove subversion
yum install libc-client subversion-perl
yum install pcre pcre-devel libidn-devel expat-devel libmcrypt-devel libcap-devel
yum install binutils binutils-devel cmake gcc
yum update
yum remove libxml2-2.6.26-2.1.2.8.i386
yum remove curl-7.15.5-9.el5.i386
どーしても rpm のありかが分からなくて、なぞのリポジトリ(tla)も一部つかっていますのでご注意ください。 その他は、手順にあるリポジトリを利用しています。
でもって、提供されている .rpm をインストール。 ここで使った .rpm は以下の通りです。 sourceforge.net にあったもの全部です。
#!/bin/sh
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-doc-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-devel-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xmlrpc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xml-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-tidy-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-soap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-snmp-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pgsql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pdo-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-odbc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-ncurses-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mysql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mssql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mhash-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mcrypt-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mbstring-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-imap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-gd-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-devel-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-dba-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-common-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-cli-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-bcmath-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/perl-Git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-devel-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/m4-1.4.13-4.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-static-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-python-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-devel-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-doc-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-devel-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-devel-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/icu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/hiphop-php-1.0-2.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gnupg-1.4.10-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-svn-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gitk-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-gui-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-email-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-cvs-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-arch-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-all-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/flex-2.5.35-7.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-devel-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-doc-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-devel-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/autoconf-2.63-3.noarch.rpm/download
でもって、以下で HipHop for PHP のインストール、環境設定はOKだと思います。
# rpm -ivh *.rpm
# cd /usr/lib64/hphp
# export HPHP_HOME=`pwd`
# export HPHP_LIB=`pwd`/bin
あとは、WordPress のディレクトリに cd して変換、コンパイルをかければ…。
# cd /opt/sakura.maple4ever.net/
# find . -name "*.php" > files.list
# $HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50
…。
parsing inputs took 0'00" (157 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (75 ms) wall time
inferring types...
inferring types took 0'00" (142 ms) wall time
post-optimizing...
post-optimizing took 0'00" (15 ms) wall time
creating CPP files...
Core dumped: Segmentation fault
セグメンテーション違反です
[tegaki]マイガー![/tegaki]
というわけで、コンパイルに入る前にセグって落ちてしまうようです。。
ちなみにうまく C++ に変換されたソースは以下の感じです。
#include <php/wp-content/themes/twentyten/functions.h>
#include <php/wp-content/themes/twentyten/single.h>
#include <cpp/ext/ext.h>
namespace HPHP {
Variant pm_php$wp_content$themes$twentyten$single_php(bool incOnce /* = false */, LVariableTable* variables /* = NULL */) {
LINE(10,invoke_failed("get_header", Array(), 0x26068646792ABCAELL));
echo("\n\t\t<div id=\"container\">\n\t\t\t<div id=\"content\" role=\"main\">\n\n");
if (toBoolean(LINE(15,invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL)))) LOOP_COUNTER(1);
{
while (toBoolean(invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL))) {
LOOP_COUNTER_CHECK(1);
{
invoke_failed("the_post", Array(), 0x41F4B03CC3C890CFLL);
echo("\n\t\t\t\t<div id=\"nav-above\" class=\"navigation\">\n\t\t\t\t\t<div class=\"nav-previous\">");
ここでは分かりやすいようにかなり抜粋していますが、PHP が C++ に変換されているのがワカリマス。 これは twentytn の single.php 部分ですがなんてことを、って感じですね(笑)
ちなみに、WordPress 以外はというと bbPress も同様に変換がおちました。 ごくごく簡単な、test.php ひとつだけだとうまくサーバ起動まで動作しました。
ランタイムでおちるのなら依存のライブラリかなとかも思うのですが、この段階で動くプロダクトが何かがよく分からなくて手詰まりとなりました。 最初さくら VPS 上でやっていたのでメモリ不足かなとおもって、ローカルの仮想マシンの CentOS 5.5 でもやってみたのですが同様の結果に。
もうちょっと時間があれば、file.list を増減させたりしてみたかったのですが、なんせ ここまでくるのに 12時間近く、、、わたしまけましたわ(笑)
まぁ小中学生のときはコンピュータうまく動かないことにハマって数ヶ月一人もんもんするくらいへーきだったので、根性なくなったな自分、などと思いつつ今日はここまでにしておきます。 😀
お疲れ様です。
ホント、”なんてことを”って感じですね 😛
PHP の動的 include / require も対応していて、なんだかすごいですた。
ななな、なんてことをー! 😀