PHPを高速に実行しようと思ったらエクステンションを使っていくことになるでしょう。しかしそうなると使う言語がC言語になり、途端に敷居が上がってしまいます。その結果、独自のエクステンションをどんどん書いていこうという気にならないかも知れません。 そこで注目したいのがphp-goです。なんとPHPのエクステンションをGo言語で作成できます。

php-goの使い方

例えば以下はテストのエクステンションコードの一部です。普通にGoのコードです。

package main

import "log"
import "reflect"
import "math/rand"
import "time"
import "github.com/kitech/php-go/phpgo"

type PGDemo struct {
}

func NewPGDemo() *PGDemo {
	log.Println("NewPGDemo...")
	return &PGDemo{}
}
  :
func (this *PGDemo) Hello3() [3][]int {
	a := []int{1, 2, 3}
	b := []int{4, 5, 6}
	c := []int{7, 8, 9}
	var d [3][]int
	d[0] = a
	d[1] = b
	d[2] = c
	return d
}
  :
func request_shutdown(ptype int, module_number int) int {
	println("request_shutdown", ptype, module_number)
	return rand.Int()
}
  :

これを以下のようなPHPコードから呼び出します。

< ?php

// test run function
foo_hello();
foo_hello3(12, "abc", 3.5);

// test run class method
$d = new PGDemo();
$r = $d->Hello1();
var_dump($r);
$r2 = $d->Hello3();
print_r($r2);
$r3 = $d->Hello4();
print_r($r3);

コンパイルすると.soファイルが生成されるので、それを読み込みながらPHPを実行します。

/usr/bin/php -d extension=./hello.so examples/hello.php

ちゃんとGoとPHPとでデータを受け渡して処理ができています。

Adjust GOMAXPROCS 8 => 1
  :
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
  :
)
  :
function handler called.10, this=0x10c9ad3b8, atys=p, op=0x10c997020, func=Hello4, class=PGDemo
parse params: 1
  :

php-goはZend APIをGo言語でラッピングしています。Go言語であればC言語よりも使いやすいという方も多いのではないでしょうか。Goを使ってPHP機能拡張が書ければ、より高速な実行も可能になるでしょう。

php-goはGo製のソフトウェア(ソースコードは公開されていますがライセンスは明記されていません)です。

kitech/php-go: Write PHP extension using go/golang. Zend API wrapper for go/golang.