ハワイのおすすめスポット①Blue Note Hawaii
なんかもうアレなのでhawaiiのおすすめスポットBlue Note Hawaii について書いてみる
TL;DR
- Blue Note Hawaii はいいぞ
- 予約は直接本家WebSiteから
- 先にディナー済ませてドリンクのみがおすすめ
Blue Note Hawaii とは
ニューヨークの名門ジャズクラブ“BlueNote”のライブハウスジャズをはじめとする多彩な音楽ジャンルの世界的アーティストや地元ハワイの人気ミュージシャンのパフォーマンスを楽しめるライブ・スペースです!
Blue Note Hawaiiへのアクセス
場所はワイキキのロイアルワイアンセンターも隣のアウトリガーワイキキビーチリゾートにあります
ドレスコード
Blue Note Hawaiiはドレスコードが特にないようです。アロハシャツ+サンダルでも大丈夫でした(アロハシャツはHawaiiでは正装)よっぽどラフな格好ではないかぎり大丈夫と思います
ライブの様子
- 至近距離でみることが出来ます
www.instagram.com
www.instagram.com
ディナー食べる暇なし
- アーティストによりますが、ライブが始まるとほぼ落ち着ける時間はありませんw
- もちろん食事もおいしいのですが、ライブが始まるとゆっくり食べているのがもったいない
- なので予約を取る際は食事なし、ドリンクのみの予約がおすすめです
- 多くの場合6時台開始と9時台の2ステージ構成なので、先にどこかでディナーを済ませて、9時台のライブでしっぽり飲むのがおすすめです
まとめ
- Blue Note Hawaii はいいぞ
- 堅苦しくないし、料理頼まなければ料金も格安
- ぜひ旅行に日程が決まり次第、ライスケジュールをチェック!
ハワイでアメフト観戦をしよう!
なんかもうアレなので、前回のハワイ旅行で行ったハワイ大学のアメフト観戦が最高だったので書いてみる
チケットの購入方法
チケットはハワイ大学のサイトから購入することができます
記事を書いている時はシーズン前なのでSeason Ticketsしかないですが、シーズンが始まると各試合ごとでチケットを買うことができます チケットはシートエリアを選択して購入します QQ~FF側がHome側になるので、絶対ホーム側を選びましょう!
チケットを購入したら、メールで案内が来るのでチケットを印刷すれば準備OK スマホの画面でもよいと思いますが、念の為印刷しておくことをオススメします
アロハスタジアムへのアクセス
試合会場のアロハスタジアムはwaikikiから車で30分ぐらいの場所にあります the busでもいけるようですが、試合終了後はかなり混雑 + 辺りも暗くなっているのでレンタカーで行くのがよいと思います
試合当日のアロハスタジアムの様子
この日は試合開始数時間前ぐらいには行ったのですが、すでのローカルのファンがテールゲートパーティーをしていました ※試合前にファンたちが駐車した車の後部でBBQをするのがお約束になっています
スタジアム内にもTシャツなどの物販があるのですが、自分が行った時はTシャツのみでユニフォームなどはありませんでした ユニフォームを着て観戦したい場合は事前に買っておいたほうが良さげです
シーズン始めはけっこう空いているので、直前でも前の方のチケットが購入できました
試合中のタイムアウト中はファンをフィールドに呼んでちょっとしたゲームをやったりでまったく飽きることなく観戦できます アメリカのエンタテインメント力恐るべし
この日活躍していたJahlani Tavai, John Ursuaはのちに2019 NFL Draft でpickされました
Hawaii’s Tavai drafted by Lions in 2nd round of 2019 NFL Draft
試合終了
試合が終わる頃にはあたりは真っ暗に。 全員一斉に帰るので、駐車場からでるのに30分ぐらいかかりました
まとめ
- ハワイでのアメフト観戦はいいぞ
- Go! Bows!!
Set up gRPC server with Go and try requesting with PHP
Hi guys. In this time, I will set up the gRPC server and try requesting it.
By the way, it seems that the gRPC server with PHP is spoken by ↓, but it seems that is no plan now.(2018 / February) groups.google.com
So this time, I will set up a gRPC server with Go and I will try requesting it with PHP.
Flow
- Define proto
- Generate code for Go
- Create a Go gRPC server with generated code
- Generate code for PHP
- Create a PHP client with the generated code
- Set up a gRPC server and request it with PHP client
Define proto
Prepare the following proto.Simply to accept the string and just return it.
syntax = "proto3"; package ping; service Ping { rpc Hello (HelloReqest) returns (HelloResponse) { } } message HelloReqest { string toMessage = 1; } message HelloResponse { string resMessage = 1; }
Generate code for Go
The official is here
What is necessary for generation is as follows.
- google.golang.org/grpc - github.com/golang/protobuf/protoc-gen-go // plugin for generating gRPC go code from proto - protoc // protoc compiler
google.golang.org / grpc
,protoc-gen-go
you can go get
go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/protoc-gen-go
You can download protoc
that fitting your platform from below, And place it in /bin or the like.
So I use mac, I've downloaded protoc-3.5.1-osx-x86_64.zip
.
The code generation command for Go is as follows
// For protos/*.proto, The code generated for gRPC is under. /go protoc - go_out = plugins = grpc: ./ go protos / *. proto
The actual generated code will look like this.
come-on-proto/ping.pb.go at master · ogataka50/come-on-proto · GitHub
Create a Go gRPC server with generated code
I prepare a gRPC server with Go based on the generated code.
This time I've taken the following article quite nicely and I just made a reference as it is! Thank you! ^^
The actual code is here
Generate code for PHP
Next, I will generate code for PHP for requesting the gRPC server.
What we need to generate is below
- grpc-extension - protobuf-extension - protoc // same as installing it at the time of Go - grpc_php_plugin // plugin for generating gRPC PHP code from proto
grpc-extension
,protobuf-extension
can be installed with pecl, brew etc.
brew install php71-grpc brew install php71-protobuf pecl install grpc pecl install protobuf
grpc_php_plugin
can be created by cloning the repo of grpc and make grpc_php_plugin
git clone -b v1.9.x https://github.com/grpc/grpc cd grpc && git submodule update --init && make grpc_php_plugin
The code generation command for PHP is as follows
// For protos/*.proto, The code generated for gRPC is under. /php protoc --proto_path = protos / \ - php_out = php \ --grpc_out = php \ --plugin = protoc-gen-grpc =. / grpc_php_plugin \ ./protos /*.proto
The actual generated code will look like this.
come-on-proto/PingClient.php at master · ogataka50/come-on-proto · GitHub
Create a PHP client with the generated code
Next, we will create a PHP code to request using generated code.
Almost all of the following are just new request()
and set to generatedclient
.
This time we specified wait ()
to do UnaryCall
(once requesting and receiving a response once).
Set up a gRPC server and request it with PHP client
Preparation is done, so I will actually check it.
Build GogRPC Server and run
go build -o bin/server server.go go build -o bin/client client.go - you can use `make build` too. ./bin/server
Request with PHP client
Go back to gRPC-client-PHP
and request it withphp ./bin/console helloGRPC
.
$ php ./bin/console helloGRPC object (stdClass) # 52 (3) { ["metadata"] => array (0) { } ["code"] => int (0) ["details"] => string (0) "" } string (24) "I hear hogeeeeeeeeeeeeee"
If you can successfully request, it should be output as above. It seems like it is done!
Summary
In this time, I set up a gRPC server with Go and requested it with PHP.
At first, there were some confused things, but I was able to check simple operation.
Next time, I'd like to try Streaming RPC
etc. I also care about performance.
I can use in multiple languages based on common proto, I realized that micro-services
certainly seems to be compatible! ^^
The repo used this time will be below. thanks.
なぜPHPはgRPCサーバーがサポートされていないのか?
なんかもうアレなので、前回少し触れたのですが、2018/2月現在公式なPHPのgRPCサーバーはサポートされていません。
GoでgRPCサーバー立てて、PHPでリクエストしてみる - 恥知らずのウェブエンジニア -web engineer, shameless
様々な迫害には慣れているPHPerでもそもそもサポートされないというのは辛いものがあります。
なぜPHPのgRPCサーバーがサポートされていなのか下記のMLのdiscussionを英語の勉強も兼ねてまとめてみようと思います。
※素人意訳なので、間違いありましたらごめんなさい。
gRPC Servers in PHP?
PHPのgRPCクライアントは作れるけど、gRPCサーバーは作れません。それの技術的ブロッカー、将来的な実装のロードマップはあります?
PHPのgRPCサーバーにはいくつかの問題があります。そして今の所、解決策はありません。
nginx, Apacheのフロントエンドなしで素のPHPを実行している場合解決策がありません。典型的な設定では、PHPでlong-lived streaming RPCをすることができません。
ページはすぐにtimeoutしてしまいます。unary RPCを提供することはできます。または制限時間を持つstreaming RPCを提供できますが、それはもはやgRPCではありません。
そして現時点ではPHPには適切なHTTP/2サポートはありません。
フロントエンドサーバーからPHPプロセスへリクエストを転送するモデルでは、gRPCリクエストを処理するために必要なHTTP/2 streamへのアクセスができません。
これ以上のことについては、PHPからweb-socketを提供することをおすすめします。おそらくすべての解決策はapacheなどなしの素のPHPを実行することになると思われます。 これはPHPを使いたい典型的な構成ではありません。したがって、PHPのgRPCサーバーは特殊な構成になるため、あまり役に立たないでしょう。
下記のようにphp-cliを使ってweb-serverを動かすことができます PHP: Built-in web server - Manual
ドキュメントの冒頭に、「これは開発のテスト、デモ用でパブリックネットワーク上で使用しないでください。」と書いてありますけど
良い方法を見つけることにも非常に興味があります。他の言語はこれをどのように処理していますか?Pythonに関しても同じ問題を抱えているのでは。 gRPCは素のPythonプロセスだけをサポートしていますか?
この例を見てみると grpc/route_guide_server.py at release-0_13 · grpc/grpc · GitHub PHPも同じ種類のソケットリスニング操作を実行することができます。 このようなデーモン化されたPHPプロセスを書くことは一般的です。もちろん、PHPがHTTP / 2の機能をネイティブにサポートするかどうかは別の問題として。。
他の言語(Ruby、Node.js、Python、C#、...)にはそのような問題がないのは、それらがすべてコマンドラインから適切に動作しているフレームワークを持っているからです。
gRPC pythonサーバーを動かすためのpythonデーモンを適切に起動することができます。
nodeにはフロントエンドなしで稼働できる組み込みの機能があります。 Rubyは長い間ネイティブでこれもやっています。
PHPのみがデーモンを実行するための適切なサポートを持っていません。オプションとしてあるのは、本番環境に適していないプロトタイプです。
ReactPHPのようなもので回避できるかも? Event-driven, non-blocking I/O with PHP - ReactPHP
素のPHPプロセスとしてサーバーを実行することはスケーラビリティがなく、PHPコミュニティは推奨していなく、PHP Web Hosting Serviceでほとんどサポートされていません。
私はReactPHPを掘り下げ、必要なHTTP / 2をサポートするかどうか見てみる
ReactPHPは、gRPCのC coreがすでに行っていること以上のものを提供しません。coreは非同期I / OとHTTP / 2を処理します。
PHPをgRPCサーバーとしてサポートすることは、third partyの依存を必要とすることなく、既に持っているものの周りにコードを書くことを意味します。
しかし、それには素のPHPが必要であり、私たちが見るに公式のPHPサーバのサポートは、LAMPのほかにPHPに対する大きな需要を見たことがないと思っています。 そのモデルをサポートするためのリソースをコミットする必要があります。
正しい解決策は、SAPIとして"php-fpm"と同じような "php-grpc server"があればと思う。 それはHTTP / 2ウェブサーバを起動し、$ _SERVER / $ _ POSTの適切な変数を使用してserverへの個々のPHPリクエストを作成します。
これは、CのgRPCサーバーがlong-lived streamingを処理できるようにする一方で、PHPの原理を破ることなく維持します。 しかしこれは複雑になるかもしれません。
現状の回避策は、Go FastCgiクライアントライブラリを使用して、gRPC / HTTP2上でリクエストを受け入れ、それらをphp-fpmベースのバックエンドに送信する単純なGoベースのプロキシを書くことです。
我々が想像している2つの主な動機は比較的共通している。 1つは、私たちのPHPベースのREST + JSON APIは、protobufやThriftのように見えるようになっているinternal pseudo-type system(内部擬似型システム)を長年にわたって成長させてきました。
2つ目はObjective-C、Android、PHP、およびJavaScriptでAPIクライアントを使用し、これらのクライアントの開発を容易にするためのコード生成です。 我々はgRPC + Protobufがそれらの解決策であると見ています。
ほとんどの人がApacheやnginixでPHPを使用しているので、素のPHPサーバーをサポートすることに抵抗があることを理解しています。 しかし私たちはunary RPC ができることに興奮しています。 おそらく、PHPとApache / nginixがHTTP / 2サポートを進化させると、gRPC PHPサーバーのサポートも進化する可能性があります。
PHPサーバーの問題と使用例を深く理解し、合理的な解決策を考案したいと考えています。
我々はgRPCからFastCGI(PHP-FPM)にブリッジする形でPHPサーバのサポートを開発しました。興味があるなら、それをオープンソースにして、関わっているコミュニティのメンバーをさらに増やしたい。
素晴らしい! 間違いなくオープンソースにするべきです。 PHPのgRPCサーバーは必須です - マイクロサービスの時代にはすべてのPHPがLAMPで実行されているわけではありませんから。
PHPサーバソリューションにも非常に興味があります。 PHPのマイクロサービスプラットフォームは、PHPが "嫌われ者の言語"(red headed step child of a language)でなくなるのを助けるだろう。 :-)
アップデート - 私たちはオープンソーシングをクリアし、独自のビットを抽出するよう努めています。できるだけ早くgRPCエコシステムへ組み込まれるよう評価するものを得るでしょう。
多くのユーザーが興味を持っているので、gRPCエコシステムへの登場を楽しみにしています
その後進捗どうですか???
まとめ
なんとなく背景がわかった気がします。
- そもそもPHPは、素の(nakedな)PHPの状態でデーモン化して実行がすることができない
- built-in serverがあるけどあくまでテスト用で本番環境では使えない
- 一般的な設定ではすぐtime outするため、Streaming RPCがまともに使えない
- フロントエンド(apache, nginx)を置いてしまうとHTTP/2 streamへのアクセスができない。それってもはやgRPCじゃなくない?
- そのためthird partyなしでのPHPでのgRPCサーバーのサポートはできない
PHPデベロッパーにとってフロントエンド(apache, nginx)があることは一般的になっている
- 素のPHPだけのサーバーの方が違和感
- そしてPHPデベロッパーとして有り難いのは、共通のprotoを使うことで開発が簡略化できること。unary RPCだけでもありがたい
- Apache,nginixのHTTP / 2サポートが進むとまた状況が変わるもしれない
- gRPCからphp-fpmへブリッジするlibraryの開発もされている(が開発者の返信が2016年末で止まっている…)
gRPCとしては、
- PHPの言語のみではgRPCの全機能が提供できなく、中途半端なぐらいになるぐらいなら公式サポートはできない
PHP開発者としては、
- 開発者側としてはコードの自動生成、unary RPCだけでも利点がある(しかしそれがgRPCであるべきなのかと言われるとアレな感じも。。。)
のような状況のようです。
また関連してnginx が gRPC proxy support
の実装を進めているようです(中身よくわかってない)
これによって状況がまた変わるかも?
Milestone 1.13 – nginx
今後も動きがありそうなので引き続きウォッチ。
GoでgRPCサーバー立てて、PHPでリクエストしてみる
なんかもうアレなので前回PHPでgRPCサーバーにリクエストするっぽいことをやったので、今回は実際にgRPCサーバーを立てて、リクエストをしてみる。
PHPでgRPC叩く手始め - 恥知らずのウェブエンジニア -web engineer, shameless
ちなみにPHPでgRPCサーバーは↓で話されているようなのですが、2018/2月現在では実装の目処は立っていない模様。 groups.google.com
なので今回は,GoでgRPCサーバーを立てて、それにPHPからリクエストをするようにしてみようと思います。
流れ
- protoを定義
- Go用のコードを生成
- 生成されたコードからGoでgRPCサーバーを立てる
- PHP用のコードを生成
- 生成されたコードからPHPクライントを作る
- gRPCサーバーを立てて、PHPクライントリクエストしてみる
protoを定義
下記のprotoを用意。とりあえず単純に文字列を受けて、返すだけです
syntax = "proto3"; package ping; service Ping { rpc Hello (HelloReqest) returns (HelloResponse) { } } message HelloReqest { string toMessage = 1; } message HelloResponse { string resMessage = 1; }
Go用のコードを生成
ますはGoから。公式はこちら
生成に必要なのは、下記です。
- google.golang.org/grpc - github.com/golang/protobuf/protoc-gen-go //protoからgRPCのgoのコードを生成するためのplugin - protoc //protoc compiler
google.golang.org/grpc
, protoc-gen-go
は普通にgo get します
go get -u google.golang.org/grpc go get -u github.com/golang/protobuf/protoc-gen-go
protoc
は各platformにあったものを下記からDLし、bin以下などにおきます。
自分はmacなのでprotoc-3.5.1-osx-x86_64.zip
をDLしました。
Go用のコードの生成コマンドは下記になります
// protos/*.protoを対象にして、./go以下に生成されたgo用のgRPCを使ったコードが生成されます protoc --go_out=plugins=grpc:./go protos/*.proto
実際に生成されコードはこちらのようになります。
come-on-proto/ping.pb.go at master · ogataka50/come-on-proto · GitHub
生成されたコードからGoでgRPCサーバーを立てる
これらもとにGoでgRPCサーバーを用意します。
今回は下記の記事をかなり色濃くほぼそのまま参考にさせて頂きました!ありがとうございます!m( )m
実際のコードはこちら
PHP用のコードを生成
次はgRPCサーバーを叩く用のPHP用のコードを生成します。
生成に必要なのは、下記です
- grpc-extension - protobuf-extension - protoc // 先ほどGoの時にinstallしたのと同じ - grpc_php_plugin //protoからgRPCのPHPのコードを生成するためのplugin
grpc-extension
, protobuf-extension
はpecl, brewなどでinstallできます。
brew install php71-grpc brew install php71-protobuf pecl install grpc pecl install protobuf
grpc_php_plugin
は、grpcのrepoをcloneして、make grpc_php_plugin
することでつくることができます
git clone -b v1.9.x https://github.com/grpc/grpc cd grpc && git submodule update --init && make grpc_php_plugin
PHP用のコードの生成コマンドは下記になります
// protos/*.protoを対象にして、./php以下に生成されたPHP用のgRPCを使ったコードが生成されます protoc --proto_path=protos/ \ --php_out=php \ --grpc_out=php \ --plugin=protoc-gen-grpc=./grpc_php_plugin \ ./protos/*.proto
実際に生成されコードはこちらのようになります。
come-on-proto/PingClient.php at master · ogataka50/come-on-proto · GitHub
生成されたコードからPHPクライントを作る
次に生成されたコードを使ってリクエストを行うPHPコードをつくります。
下記がほぼすべてで、生成されたclient
にrequest
をsetしてリクエストしているだけです。
今回はUnaryCall
(1回リクエストして、1回レスポンスを受け取る)を行うwait()
を指定しています。
gRPCサーバーを立てて、PHPクライントでリクエストしてみる
準備は整ったので、実際に動かしていきます。
Goサーバーのビルド、実行
go build -o bin/server server.go go build -o bin/client client.go // goでgRPCにリクエストする用。今回はスルー。 ※make build でもできるようにしています ./bin/server
でGoのgRPCサーバーを立てます
PHPクライントでリクエストしてみる
さっそくリクエストしてます。gRPC-client-PHP
に戻って php ./bin/console helloGRPC
でリクエストできます。
$ php ./bin/console helloGRPC object(stdClass)#52 (3) { ["metadata"]=> array(0) { } ["code"]=> int(0) ["details"]=> string(0) "" } string(24) "I hear hogeeeeeeeeeeeeee"
正常にリクエストできてば、上記のような出力になるはずです。 それっぽくできているようです!
まとめ
今回は実際にGoでgRPCサーバーを立てて、PHPでリクエストしてみました。
最初色々戸惑いところもありましたが、簡単な動作確認することができました。
次は、Streaming RPC
なども試したいところ。パフォーマンスなども気になる。
共通のprotoを元に複数言語で利用できるところなどはmicro services
とは確かに相性良さそうなことは実感できました!^^
また今回つかったrepoは下記になります。
PHPでgRPC叩く手始め
なんかもうアレなので、PHPでgRPCのサーバーを叩いてみる。まずは環境整備から
- 流れ的にはprotobufを定義して、それを元にPHPからgRPCと通信するclientを作ってそれを使ってgPRCを叩く模様
Environment
- 公式のままやってみる
grpc
# peclが必要 yum install --enablerepo=remi-php71 php-pear gcc-c++ make zlib-devel php-devel pecl install grpc echo 'extension=grpc.so' >> /etc/php.ini
参考: https://github.com/grpc/grpc/issues/11957 https://github.com/grpc/grpc/issues/11057
protobuff
pecl install protobuf echo 'extension=protobuf.so' >> /etc/php.ini # 現時点の最新版protobuf-3.5.0.1は下記のエラーが出るのでv3.4を使う。。。 PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/protobuf.so' - /usr/lib64/php/modules/protobuf.so: undefined symbol: timelib_update_ts in Unknown on line 0 See : https://github.com/google/protobuf/issues/3929 # 一旦protobuf-3.4.0 install pecl uninstall protobuf pecl install protobuf-3.4.0 # protobufのコンパイラは下記から https://github.com/google/protobuf/releases/
grpc用のprotobuf plugin
#repo clone git clone --recursive -b v1.7.x https://github.com/grpc/grpc # 公式には書いてないけどこれやらないと下のmakeができないっぽい cd grpc/third_party/protobuf ./autogen.sh cd grpc make grpc_php_plugin ※上手くいかない時は下記が足りていないかも libtool shtool autoconf autogen
サンプルproto
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; option objc_class_prefix = "HLW"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
- phpのコード生成
protoc --proto_path=examples/protos --php_out=examples/php --grpc_out=examples/php --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin ./examples/protos/helloworld.proto
- sampleを実行してみる
require dirname(__FILE__).'/vendor/autoload.php'; @include_once dirname(__FILE__).'/Helloworld/GreeterClient.php'; @include_once dirname(__FILE__).'/Helloworld/HelloReply.php'; @include_once dirname(__FILE__).'/Helloworld/HelloRequest.php'; @include_once dirname(__FILE__).'/GPBMetadata/Helloworld.php'; function greet($name) { $client = new Helloworld\GreeterClient('localhost:50051', [ 'credentials' => Grpc\ChannelCredentials::createInsecure(), ]); $request = new Helloworld\HelloRequest(); $request->setName($name); list($reply, $status) = $client->SayHello($request)->wait(); var_dump($reply); var_dump($status); return $message; } $name = !empty($argv[1]) ? $argv[1] : 'world'; echo greet($name)."\n"; [root@6b0b0fc608dc php]# php greeter_client.php wow /var/workspace/grpc/examples/php/greeter_client.php:42: NULL /var/workspace/grpc/examples/php/greeter_client.php:43: class stdClass#12 (3) { public $metadata => array(0) { } public $code => int(14) public $details => string(14) "Connect Failed" } PHP Fatal error: Uncaught Error: Call to a member function getMessage() on null in /var/workspace/grpc/examples/php/greeter_client.php:44 Stack trace: #0 /var/workspace/grpc/examples/php/greeter_client.php(53): greet('wow') #1 {main} thrown in /var/workspace/grpc/examples/php/greeter_client.php on line 44
それっぽく動いてる? ※grpc serverはnodeで動くので立ち上げていない
次は実際にgRPCサーバーを立てて動作確認
Phanで静的解析するようにしてみる
なんかもうアレなので業務でとあるAPIを叩く用の簡単なSDKをを作った。 その際PHPDoc,型宣言とかしたので、せっかくなのでPhanで静的解析するようにしてみたメモ。 PhanはPHPDoc,型宣言などが整備されてないと真価を発揮しないということなので。
install
- ast-extが必要
pecl install ast
- phan install
composer require --dev phan/phan
config
./phan/config.php
のファイルを作って設定定義- See : https://github.com/phan/phan/blob/master/src/Phan/Config.php
- sample
<?php return [ //解析、パース対象dir 'directory_list' => [ 'src', 'vendor/' ], //解析除外対象dir "exclude_analysis_directory_list" => [ 'vendor/' ], ];
実行
./vendor/bin/phan src/xxxxRequest.php:16 PhanUndeclaredTypeProperty Property xxxxx\AbstractRequest::request has undeclared type \xxxxx\Message src/xxxxPoint.php:13 PhanUndeclaredClassConstant Reference to constant class from undeclared class \xxxxx\Request
こんな感じで解析結果がでーる
まだそこまでありがたみを感じていないがしばらく様子見してみる
Tips
PhanUndeclared~が出る
- 未定義〜を呼んでいるとかとか
- Phanはautoloadを行わない。なのでコード内でcomposerで入れたクラスなどを参照している場合、それらも解析対象にしなければいけない
- Issue-Types-Caught-by-Phan
- https://github.com/phan/phan/wiki/Issue-Types-Caught-by-Phan
./phan/config.php
に↓のようにしてvendor
以下もパース対象にしつつ解析除外にする
'directory_list' => [ 'src', 'vendor/' ], "exclude_analysis_directory_list" => [ 'vendor/' ],
dead code検出
- 実行時optionで、
-x, --dead-code-detection
を付けると未使用の関数、変数等を検出してくれる
./vendor/bin/phan --dead-code-detection src/Client.php:38 PhanUnreferencedPrivateMethod Possibly zero references to private method \xxxxx\Client::aaa