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

2018年10月26日 (金)

著者 : s-igarashi

たぶん月刊PHPニュース 2018年10月26日号


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

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

https://github.com/alhimik1986/php-excel-templator

  • PHP Spreadsheet を使い、テンプレートとなる Excel データから別のデータを生成するライブラリ

https://github.com/TiBeN/CrontabManager

  • crontab を PHP から管理するためのライブラリ

https://github.com/ankitpokhrel/tus-php

  • レジューム可能なファイルアップロードを実現するプロトコル、tus の PHP 実装

https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

  • PHP 製のファミコンエミュレータ
  • JS の bokuweb/flownes クローン、日本語記事がある
  • PHP としては珍しく、激しく CPU を使うアプリケーション
  • 遅いがコードは読みやすいので、高速化を試みると面白いかもしれない(面白かった)

https://github.com/thecodingmachine/safe

  • PHP の組み込み関数について、失敗時に false を返すのではなく例外を投げるラッパーライブラリ
  • use function で組み込み関数を呼び出す際の既存コードの実装を差し替えられる
  • 通常版の組み込み関数利用箇所を検知する phpstan 拡張も存在

https://github.com/infection/infection

  • テストの効果測定器、ミューテーションテスト用フレームワーク
  • テストコードとテスト対象コードを用意し、テスト対象コードを AST で操作したミュータントを複数作る
  • テストを実行し、こければ kill、通れば escape とする
  • 殺したミュータントの比率が低いなら、テストが対象コードの挙動を十分に検証していない可能性があるということ

https://github.com/Pinatra/Pinatra

  • Sinatra の PHP クローン、DSL から Web サイトを生成

https://github.com/laravel-zero/laravel-zero

  • CLI ツールを作るのに特化してパッケージされた Laravel 派生品
  • Laravel の各種コンポーネントとあわせて利用でき、対話型メニューやデスクトップ通知のサポートもある

https://github.com/laravel/telescope

  • Laravel 用のデバッグツール
  • リクエストや例外、ログ、DBクエリ、キュージョブ、メールなど様々な情報を監視し、アプリケーションの挙動を確認できる

https://github.com/spatie/laravel-view-models

  • Laravel で Controller から View へ渡す変数を整形するために View Model という階層を用意
  • MVVM で知られるのと同名の用語だが、位置づけは異なる
  • 実装方法は異なるものの、発想としてはかつて FuelPHP同名で存在した構造(現在は Presenter に改名)と少し似ている

https://github.com/makasim/php-fpm-queue

  • php-fpm を非同期処理用のキューとして扱うライブラリ
  • queue-interop のインターフェースを実装
  • 以前に tidewaysブログ記事でも同様のアイディアが紹介されたことがある

https://github.com/spiral/roadrunner

  • Go で書かれた PHP のアプリケーションサーバー / ロードバランサー / プロセスマネージャー
  • PSR-7 互換の HTTP/HTTPS サーバを持ち、Nginx + FPM なセットアップを置き換えられる

https://github.com/SeasX/SeasLog

  • ログ出力用の拡張
  • log4php などの PHP で実装されたログライブラリより高速であることをうたっている

最近のinternals

[RFC] [VOTE] Typed properties v2

RFC Result: Make the hash extension always available

[RFC] Preloading

  • https://externals.io/message/103333
  • Dmitry Stogov さんによる、PHP 8.0 の目玉機能として挙げられていた preloading の RFC
  • PR: 3538 で作業中
  • opcache の機能として実装
  • 処理系の起動時に指定したファイルを読み込み実行、そこから更に他のコードを読み込める
  • 読み込まれたコードは opcache のメモリ内に保持され、リクエストごとの読み込みが不要となる
  • Zend Framework 1 の hello world で~30%、Zend Framework 2 版で~50% の性能向上
  • ブートストラップのオーバヘッドがある程度の時間を占めるアプリケーション以外にはあまり効かず、マイクロサービス向き
  • 将来的には同じく PHP 8.0 の目玉機能とされている JIT/FFI との組み合わせで、より効果を発揮する想定

[RFC] Kill proprietary CSV escaping mechanism

  • https://externals.io/message/103268
  • fgetcsv() / fputcsv() などの $escape パラメータを PHP 9 にかけて非推奨 / 廃止としていく提案
  • 世界で広く使われている CSV はいまだ書式が標準化されておらず、ただし informational な文書として RFC 4180 がある
  • RFC 4180 ではダブルクオートされた文字列内にダブルクオートを含む際は二重にする記載があるが、$escape 相当の挙動は規定がなく、他言語でも $escape 相当の機能はない
  • $enclosure があれば $escape は余分であり、問題を引き起こす場合もある
    • 現在 $escape のデフォルト値は "\\"
    • ASCII 非互換のエンコードで意図せぬエスケープが発生したり、fgetcsv(fputcsv()) のようなラウンドトリップで失敗したりする
    • 多くのケースでは $escape'\0' を渡すことで期待通り動くが、バイナリを含むような CSV の読み書きでは失敗するかもしれない
  • PHP 7.4 で空文字列を渡してエスケープを無効化できるように、PHP 8 でデフォルトを空文字列に、PHP 9 で廃止と、段階的に進めていく提案内容

[RFC} Deprecate and Remove ext/wwdx

  • https://externals.io/message/103164
  • ext/wddx を非推奨 / 廃止とする提案
  • WDDX は言語非依存のデータ交換フォーマットとして設計されたデータ形式だが、正式な標準化がされず、JSON など他のデータ形式の普及により重要度が下がった
  • PHP 7.4 で非推奨とし、8.0 で PECL に移すという内容
  • 7.4 の段階で非推奨とはしないまま PECL へ移してもよいのでは、という意見

Unbundle libsqlite3?

  • https://externals.io/message/103167
  • 現在 PHP 処理系のソースコードへバンドルしている libsqlite3 のバンドルをとりやめとする話
  • PHP 処理系は幾つかの外部ライブラリをバンドルしており、一部は処理系独自のパッチを当てて利用しているが、libsqlite3 は無修正で利用していた
  • すでに master へマージされている
  • PHP 処理系のソースコードからのビルドにはシステムのパッケージマネージャなどで別途 libsqlite3 の用意が必要となる

最近の FIG

[ENTRANCE] [VOTE] [CC] PHPDoc & PHPDoc Tags PSRs

[ACCEPTANCE VOTE][CC] PSR-18 HTTP Client

その他 PHP 界隈の情報など

The Future of the Zend Engine and the Zend Framework

Wanted (Maybe?): New Maintainer

  • https://github.com/sebastianbergmann/dbunit/issues/217
  • PHPUnit の DbUnit がメンテナンスを終了
  • 2019 年 2 月よりは前にプロジェクトをアーカイブ化する予定
  • DbUnit は 2007 年に JUnit から移植された
  • 現在はアクティブなメンテナが不在
  • PHPUnit の Sebastian Bergmann さんと tideways の beberlei さんとの会話の中で、「プロジェクトに特化したフィクスチャ管理の方が楽」という話が出る
  • 「そういえば最近同じ理由でDbUnitを人にすすめることもないな」と思ったとのこと
  • ここ数年やっていたようなバグ修正の PR をマージするくらいのモチベーションも今はないそう

イベント情報

PHP カンファレンス 2018(開催日: 2018 年 12 月 15 日)

  • 当日スタッフ募集中(10/31 まで)

PHP カンファレンス仙台 2019(開催日: 2019 年 1 月 26 日)

  • スピーカー募集中(10/31 まで)

Laravel JP Conference(開催日: 2019 年 2 月 16 日)

  • スピーカー募集中(11/30 まで)
  • スポンサー募集中(現在ブロンズスポンサーの空き有り)

PHPerKaigi 2019(開催日: 2019 年 3 月 29 日 ~ 31 日)

  • スポンサー募集中

 
型付プロパティの RFC が可決されました。導入される PHP 7.4 は来年のリリースで、多くの現場ではまだしばらく使えない機能となるでしょうが、今からだいぶ楽しみです。PHP 8 向けの改善も進んでいるようですが、エンジン改修の旗手である Dmitry さん(PHP 7.0 での劇的な高速化改修もされていた方)がフルタイムで開発に携われなくなってしまうと、開発速度にも影響が出るかもしれません。良い引き受け先が見つかるとよいのですが。
最近 JetBrains の PHPSTORM BLOG で、PHP Annotated Monthly という連載記事を見つけました。 かつては Gary Hockin さんが担当されていたようですが、今年の 2 月に BBC へ移籍されてからは連載が止まっていました。 8 月から新しく担当となった Roman Pronskiy さんは、ロシア語でも PHP についてのニュース記事を隔週連載されてきた方のようです。ロシア語は分かりませんが、Google 翻訳を頼りにそちらも読んでみるとけっこう情報源が被っていて、一方的に親近感を持ったりしています。
インフィニットループでは、PHP の最新技術動向が気になるエンジニアを募集しています。 詳しくはこちらの求人詳細をご覧ください → 採用情報ページ仙台支社特設ページはこちら

ブログ記事検索

このブログについて

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