ytake Hatena

Web Application Developer

php7 でxhp-extensionをインストール

XHP

HackでおなじみのXHP XSS対策はもちろんのこと、現在のReactの元(ほぼ同じ記述法)になったもの、
とご存知の方も多いと思います。
php5ではfacebookGithubで公開されています。

github.com

が、現php7対応版は公開されておらず、Hackのみで利用可能となっています。

for php7

がしかし、php7で動くように対応したリポジトリがありました

github.com

こちらをビルドして、php7で動かしてみましょう

Linux

$ git clone https://github.com/KMK-ONLINE/xhp-php7-extension.git
$ phpize
$./configure
$ make
$ sudo make install

Mac OS

Linux環境と同じですが、最新のOSなどではgccが古いためmakeに失敗します。 brew などでgccをinstallし、Makefileを変更するか、CC= CXX= などで指定するとmake できると思います

変更する場合は、xhp-php7-extension/xhp/Makefilegcc, g++をbrewなどでinstallしたgccに変更します。

gcc-6 g++-6の場合は以下のようになるでしょう

ifdef DEBUG
CPPFLAGS = -fPIC -ggdb -Wall -DDEBUG -std=c++11
else
CPPFLAGS = -fPIC -g -Wall -O3 -minline-all-stringops -std=c++11
endif

ifdef PROFILE
CPPFLAGS += -pg
endif

FLEX = `which flex35 2>/dev/null || which flex 2>/dev/null`

all: libxhp.a libxhp.so

clean:
    -rm libxhp.a xhpize parser.yacc.cpp scanner.lex.cpp scanner.lex.hpp parser.yacc.output parser.yacc.hpp fastpath.cpp version.h *.o 2>/dev/null

parser.yacc.cpp: parser.y
    bison --debug --verbose -d -o $@ $<

parser.yacc.hpp: parser.yacc.cpp

scanner.lex.cpp: scanner.l
    $(FLEX) \
      -C --header-file=scanner.lex.hpp -o $@ -d $<

scanner.lex.hpp: scanner.lex.cpp

fastpath.cpp: fastpath.re
    re2c -c -o $@ $<

%.o: %.cpp
    g++-6 -c $(CPPFLAGS) -o $@ $<

xhp_preprocess.o: xhp_preprocess.cpp scanner.lex.hpp parser.yacc.hpp
parser.yacc.o: scanner.lex.hpp
scanner.lex.o: parser.yacc.hpp

libxhp.a: code_rope.o rope_entity.o scanner.lex.o parser.yacc.o fastpath.o xhp_preprocess.o
    $(AR) -crs $@ $^

libxhp.so: code_rope.o rope_entity.o scanner.lex.o parser.yacc.o fastpath.o xhp_preprocess.o
    g++-6 -shared -Wl,-soname,libxhp.so -o libxhp.so $^

version.h:
    echo "#define XHPIZE_VERSION \""`git show -s --format="%h - %ci" HEAD`"\"" >> version.h

xhpize: xhpize.cpp libxhp.a version.h
    g++-6 $(CPPFLAGS) -o $@ $^

rope_test: rope_test.cpp code_rope.o rope_entity.o
    g++-6 $(CPPFLAGS) -o $@ $^

.PHONY: all clean tags

*CentOS 7, Ubuntu16.04環境で動作確認

install後php.ini にextensionを追加します

extension=xhp.so

php -mでインストールされたのを確認しましょう

composer

xhpのextensionに加え、ライブラリをインストールします(kmklabs/xhp)

  "require": {
    "kmklabs/xhp": "^1.6"
  }

インストール後は通常のphpコードに記述できます。

はじめてのxhp

Reactと同様です。
このextensionを利用する場合は、
<?hh にするか、 <?php // xhpと指定する必要があります

<?php // xhp

require __DIR__ . '/vendor/autoload.php';

/**
 * Class
 */
class :ytake:something extends :x:element {
    protected function render()
    {
        return <div class="hello">it's work!</div>;
    }
}

echo <ytake:something /> . "\n";

動作が確認できればOKです

その他

ビルドはできましたが、自分の環境では正しく動きませんでした github.com