とりあえず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;

class Greeting { public static function say() { echo "Hello world!"; } }

次、PHPのコード

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クラスを書いてしまったから、、、
ファイル名とクラス名は決まっているみたい。