とりあえずdockerにzephirのビルド環境を準備してみた
phpのフレームワークであるphalconが好きで、phalconがzephirで実装されているとのことです。
zephirはphpのextensionの言語らいしく、phpっぽく書けるんですけど、実行速度が早いらしいです。
この「extension」っという響きがかっこいい….
っということでzephirのビルド環境を準備したいと思います。
環境情報
ホストOS : macOS Sierra
docker version: 1.11(tool box)
コンテナOS : debian 8
zephir version : 0.9.11
PHP version : 7.0.20
dokcer
まずはコンテナ用意
docker run -it -d -p 8181:80 -v /Users/name/zephir:/home/name/workspace --privileged --name zephir debian:8 /bin/bash
まぁざっとこんな感じかな
ビルド環境
次、PHPのバージョン7を入れます。
PHPのバージョンは5でも大丈夫?なんですけど、今後のことを考えるとバージョン7のほうがいいのでバージョン7をインストールします。
PHP 7のインストール
cd apt-get install wget echo "deb http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list wget https://www.dotdeb.org/dotdeb.gpg apt-key add dotdeb.gpg apt-get update
次にzephirをインストール
apt-get install git gcc make re2c php php-json php-dev php-xml libpcre3-dev sudo git clone https://github.com/phalcon/zephir cd zephir ./install -c
動作確認
次にzephirのプロジェクトの雛形を作成
zephir init utils
これで下記のファイル、ディレクトリが作成される
- ext/
- コンパイルに使用されたファイル、ディレクトリが入る
- utils/
- initで指定された名前のディレクトリ。zephirのコードをここに書いていく
- config.json
- 設定ファイル。zephirの振る舞いを定義
では早速zephirのコードを作成
greeting.zep
namespace Utils;次、PHPのコードclass Greeting { public static function say() { echo "Hello world!"; } }
sample.php
<?php echo Utils\Greeting::say(), "¥n";
では早速ビルド
cd utils zephir build
注意
php-xmlをインストールしないとこんなエラーが出る
PHP Fatal error: Uncaught Error: Call to undefined function Zephir\utf8_decode() in /root/zephir/Library/Compiler.php:2023
php-xmlをインストールしてなくって、、エラーが出てしまったんでとりあえず記述。
/usr/lib/php/20151012/
ここにsoファイルができる
注意
phpize -v
でsoファイルの出力先を確認
php.iniにextensionを追加
extension=utils.so
php -mで確認
[PHP Modules] ・・・ sysvsem sysvshm tokenizer utils wddx xml ・・・
OK、utilsがある。
実際に実行
# php sample.php Hello world!
おし、動いた。<- Hello Worldで満足
次、ちょっと変更して、文字列を一文字ずつ表示するプログラムの実装
filter.zep
namespace Utils;class Filter { public function alpha(string str) { char ch; for ch in str { echo ch, "\n"; } } }
sample.php
<?php $f = new Utils\Filter(); $f->alpha("hello");
ではビルド
zephir build
そして、実行
# php sample.php h e l l o
ビルド環境の準備と動作確認完了。
補足
今回遭遇したエラー内容、、、
zephir\CompilerException: Unexpected class name Utils\Filter in file: utils/greeting.zep, expected: utils/filter.zep
原因
greeting.zep内にFilterクラスを書いてしまったから、、、
ファイル名とクラス名は決まっているみたい。