インフィニットループ 技術ブログ

2018年08月09日 (木)

著者 : s-igarashi

たぶん月刊PHPニュース 2018年8月9日号


インフィニットループ仙台支社のプログラマー、いがらしです。
PHP 界隈の気になったことをまとめ、月一くらいで宮城県仙台市からお送りします。
前回に引き続き、主に最近 GitHub で見かけて気になった PHP プロジェクトや、PHP の言語開発者メーリングリストである internals の議論などをつまみ食いして紹介します。
※ なお、画像のPHP ロゴは作者の Colin Viebrock さんによってリリースされ、CC BY-SA 4.0 でライセンスされているものです。

GitHub で見かけたプロジェクト

  • WordPress を .NET で動かすプロジェクト
  • wordpress.dll などという極めてロックなブツが出てくる
  • Roslyn にもとづいた PHP の .NET コンパイラ PeachPie(前身は Phalanger)にもとづく
  • ソフトウェアのリリース作業自動化ツール
  • SemVer によるバージョン番号の決定
  • git のバージョンタグの作成とリモートへの push
  • GitHub のリリース機能を使ってのリリースとチェンジログの作成
  • 正式リリース以外に alpha/beta/rc のようなリリース前バージョンの作業にも使える
  • liip/RMT というツールにインスパイアされたらしい
  • 実際のブラウザを使ってスクレイピングやテストを行うためのライブラリ
  • 6 月に W3C の勧告となった WebDriver プロトコルを使い、Chrome や Firefox 等を動かす
  • Symfony の BrowserKit / DomCrawler API を実装
  • PHP でプロセス間の排他制御を行うライブラリ
  • 同じ Mutex のインターフェースで、flock から memcached や redis、mysql/postgresql をロック機構に使うものまで複数種類ある
  • コードの品質を守るためのツール
  • インストール時に git のコミットフックを登録
  • コミット時に phpcs などの設定されたツールを実行し、テストが失敗したりするとヒゲ面のおじさんが叱ってくれる
  • composer パッケージの依存チェックツール
  • composer.json のオートロード設定からたどれる全 PHP ファイルを見て、各ファイルで使われるシンボルを収集
  • composer.json の require にはなく require-dev にだけあるものがあれば警告
    • たとえば require-dev にあるシンボルの利用により、ローカルで動くけれども本番で動かない、という事態を避けられる
  • パッケージはインストールされているが、どこでも使われていないものがあれば警告
  • GrumPHP のタスクとしても動く
  • PHPUnit を並列実行
  • 並列で実行してコードカバレッジのレポートを 1 つにまとめられる
  • 各ワーカープロセスは TEST_TOKEN という環境変数で 1 から始まる番号をそれぞれ振られる
    • たとえばプロセスごと別の DB 設定を使うようなことが可能になる

https://github.com/nunomaduro/larastan

  • Laravel 用の phpstan ラッパー
  • Facade のような、実行時にマジックメソッドで解決される部分を正しく解析するためのもの
  • Laravel プロジェクトの画面内で、どの部分がどのテンプレートと対応するかを視覚化できる
  • Laravel のモデルファイルからER図を生成
  • GraphViz を利用
  • Laravel アプリケーションのクエリ実行を監視し、N + 1 クエリを見つけて警告してくれるツール
  • 実装的には Eloquent のリレーション経由で投げられるクエリをクエリ毎にバックトレースから検出し、重複クエリをカウントするようなもの
  • Swoole + Laravel = 5 倍速い
  • Nginx & FPM とのベンチマーク比較がある
  • PHP 7.3 向けで頓挫した Fiber RFC の落胤
  • Fiber 拡張にはオリジナル版と派生版の2種類があった
    • 派生版の方の作者 Martin さんが、Fiber RFC や async-interop の議論内容を引き継ぎながら始めた新プロジェクト
  • 以下の内容を持ち、Fiber RFC が支持されなかった点への回答も一通り取り入れている
    • 派生版 Fiber 拡張(C スタックを切り替える)
    • Awaitable (Promise のようなもの)
    • async/await (当面は関数として提供、一応 PHP 本体へのキーワード追加のパッチも存在)
    • デフォルトのスケジューラ
    • ローカルストレージである Context
    • libuv ベースのイベントループの統合
    • とりあえずは目標 PECL 入り
  • amphp/amp の メンバーが拡張を実際に利用する側の立場でかなり噛んでいる
  • Minecraft Bedrock Edition 用サーバを PHP で実装したもの
  • なにげに pthreads 拡張を頑張って実用している数少ない例の一つ
    • 例えば pthreads 拡張ではクラス変数がスレッドローカルとなるため、スレッド生成時に再初期化する、といった少し特殊なノウハウが必要

https://github.com/codeplea/ahocorasickphp

  • エイホ – コラシック法で複数キーワードでの文字列探索を行うライブラリ
  • PHP による実装でも strpos() や preg_match() 使うより速かったりする、とのこと
  • ベルギーの Web デザインエージェンシー Spatie 公式サイトのソースコード
  • Postcardware で、コード読んで学びがあったら葉書を送ってほしいらしい(送るとサイトに載る
  • Laravel を使った今どきな構成の Web サイトの中身を見れる

 

最近の internals

[RFC] Typed Properties v2 [Under Discussion]

  • https://externals.io/message/102333#102867
  • PHP 7.3 向けで RFC の出ていた型付プロパティについて PHP 7.4 をターゲットとするよう方針が決まる
    • 今から入れると拡張の対応が大変になりそう、が最終的な理由となった
  • 投票自体は 7/23 くらいには開始という話だったが、今現在まだ始まっていない

Non-nullable properties

  • https://externals.io/message/102822
  • 型付プロパティの非 Nullable なプロパティの扱いについて Rowan さんから
  • 最も単純なのはデフォルト値を常に持つようにすること
  • 現状提案では使われる前に初期化する前提
  • 正しく初期化されていないプロパティは読み取り時エラーとなる(か、__get() が呼ばれる)
  • これだと利用側コードは使う前に初期化されているかのチェックが必要となり、型宣言を信用できなくなり、またアクセス時エラーだと実際の間違いがどこかを探せなくなるのでは?という意見
  • 提案者の Nikita さんは、未初期化コードへのアクセスは常に初期化コードの誤りなので、気にせず初期化済前提でアクセスし、エラーは初期化コードで直すでよい、と返答
  • Rowan さんからは、ライブラリのユーザ等はその初期化コードの誤りに対応するすべがないので、やはり言語側でなんとかできないのか、という意見

PHP 7.3 branched / PHP 7.3.0beta1 is available for testing

  • https://externals.io/message/102986
  • PHP 7.3 のブランチが master から切られ、beta1 もリリース
  • これで PHP 7.3 は Feature Freeze
  • 以降 master は PHP 7.4 向けの作業ブランチとなる
  • 型付プロパティやその他の提案が alpha の後半で大量に出たことで、alpha ステージが 1 つ追加となり、当初予定より 2 週間遅れの 2018 年 12 月 13 日に GA 予定

On not rushing things at the last minute

  • https://externals.io/message/102708
  • Feature Freeze 前の土壇場で提案がなだれ込むことへの苦言が Sara Golemon さんから
  • おおむね「良いことではないよね」という意見
  • RFC のターゲット先指定を当該バージョンの alpha より前に制限、という話もありつつ、落としどころは見つかっていない

[RFC] abolish narrow margins [Under Discussion]

  • https://externals.io/message/102765
  • 言語のコア以外は過半数で可決、という投票ルールを廃止する提案
  • 投票者の半数近くが反対するような提案が可決されるのは良くないことなので、全部 2/3 の yes を要求するように、という話
  • 一定の賛同を得る一方、例えばかつての PHP の次バージョンが PHP6 か PHP7 か、などは過半数で別によいという意見も
  • その他、議論の停止後一定期間内に投票へ移行しない RFC は「inactive」という状態へ移行、といった投票プロセス全体についての話も出つつ、とりあえずの落としどころは無し
  • 7.3 の作業が落ち着いた頃に再燃するかも

On abstract methods defined on traits

  • https://externals.io/message/103032
  • Trait の abstract メソッドについて
  • 利用クラスの要件を規定するような記述がマニュアルにあるが、実際そうなってないのでは、という話
  • 現状は利用クラスが trait で要求するメソッド名を持つことは強制されても、それ以上ではない
  • たとえば型宣言のようなシグネチャの他の部分は強制されない
    • 一旦抽象クラスで use すると、その派生クラスでは型宣言部分も強制される
  • 振る舞いではなくドキュメントの方の修正が適切では、という意見も

Nullable cast (?int)

  • https://externals.io/message/102997
  • Nullable cast の提案
  • キャストする値が null なら null のままになる
  • たとえば (?int)null は 0 ではなく、null
  • 今はまだ ML にポッと話が出てきた状態、そのうち RFC がくるかも?

[RFC] [VOTE] User-defined object comparison [Declined]

[RFC] [VOTE] Class Friendship [Declined]

  • https://externals.io/message/102627
  • Class Friendship の RFC、投票で 6:27 で否決
  • 2 ~ 3 年前から議論のあった提案がやや唐突に投票へ持ち込まれたもの
  • パッケージレベルの可視性制御ならアリかも、という過去の議論の流れを反映してか、同じ人が Namespace Visibility の RFC を作りはじめた

FIG

[ACCEPTANCE] PSR-17 Accepted

 
internals の方は 7 月上旬頃まで、型付プロパティをどのバージョンへ入れにいくか、というのでだいぶゴタついた印象でした。PHP7.3 向けの機能が一通り出揃い、最近は機能提案等は少し落ち着いている印象です。
GitHub のパッケージ紹介は月一だと貯まり過ぎ(て記事にする段階で捨てしまうものが多く出)るので、やや間隔を短くして記事を出す方が楽そうな気がしてきています。
FIG は PSR-14 が alpha1 を出したりして結構活発な印象はあるのですが、まだ議論内容までは追いきれていません。
最後にお知らせです。PHPカンファレンス仙台の公式サイトが公開となりました。2019年1月26日に仙台駅西口で開催です。
インフィニットループでは、PHP の最新技術動向が気になるエンジニアを募集しています。
詳しくはこちらの求人詳細をご覧ください → 採用情報ページ (仙台支社特設ページはこちら

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!