テクノロジー

WEB+DB PRESS連載『PHP大規模開発入門』を振り返る

tadsan tadsan
2018.4.25
シェア
ツイート
ブックマーク
トゥート

pixiv運営本部 技術基盤チームのうさみけんた(@tadsan)です。

2018年4月26日に技術評論社さまからWEB+DB PRESS総集編 [Vol.1~102]が発売されます(一部書店には既に並んでいるようです)。これは2000年12月に発売されたWEB+DB PRESSの創刊号から102回までの全バックナンバーのPDFを収録した、超大ボリュームの総集編(WEBからもダウンロード可能)です。

17年に及ぶWEB+DB PRESSの歴史の中で、ピクシブ株式会社も2014年から2017年までの間、連載企画『PHP大規模開発入門』を執筆・掲載させていただきました。

連載記事一覧

連載各回の内容は以下の通りです。

  • Vol.80 「モダンな開発環境を構築!」 パッケージ管理、ビルトインサーバ、デバッグ、テスト
  • Vol.81 「テストコードのないアプリケーションの改修」
  • Vol.82 「安全なコードの書き方」 エラーと例外処理の活用、PhpStormによる効率化、健全なチーム作り
  • Vol.83 「PHP 5.5/5.6入門」 新機能の紹介とアップグレードの注意点
  • Vol.84 「高速な開発サイクルのためのデプロイ」 巨大Gitリポジトリ運用、Composerでのライブラリ管理、ゼロダウンタイムリリース
  • Vol.85 「本番環境での不具合の発見と修正」 例外やエラーの収集・可視化・通知、phpdbgによるデバッグ
  • Vol.86 「PHPによる画像処理」 Imagickの使い方、最適化、非同期処理、動的サムネイル生成
  • Vol.87 「PHPDocでコードの品質を保つ」 チームでの仕様共有、IDEによる入力補完
  • Vol.88 「HHVMでPHP実行速度を高速化しよう」 インストール、設定、速度比較、運用監視
  • Vol.89 「ThriftとPHPで堅牢なAPIを構築しよう」 言語間通信APIの作成、ドキュメント自動生成、活用事例
  • Vol.90 「新登場PHP 7」 新機能と移行時の注意点
  • Vol.91 「名前空間とオートローディング」 必要なクラスを無駄なくわかりやすく読み込む
  • Vol.92 「PHPからのHTTPリクエスト」 ファイル操作関数、curl関数、Guzzleライブラリ
  • Vol.93 「PHPでコマンドラインプログラムを書く」 バッチ処理、ジョブキュー、ログのストリーミング処理
  • Vol.94 「PHP初心者がハマりがちな落とし穴」 型のキャスト、変数のリファレンス、引数による挙動の違い
  • Vol.95 「PHPの静的解析ツール」 ドキュメントの生成、品質の計測、問題箇所の発見
  • Vol.96 「レガシーなプロダクトの改善」 フレームワークを利用できない環境でのライブラリ活用
  • Vol.97 「PhpStorm徹底活用」 人気IDEで高精度な入力補完、リファクタリングを実現

これらの記事が執筆された期間は、PHPのメジャーバージョンで言えばPHP5.6から7.1のリリースに相当する期間です。しかし内容の多くの部分は現在でもあまり古びておらず、Web上の資料や出版された書籍にはない実際の開発・運用の現場に根差したノウハウが多く含まれています。

また、この連載の先代にあたるPHP Mentorsさんの「巨人の肩からPHP」の全連載(Vol.69〜79)も、総集編ですべて読むことができます。

各連載記事の紹介

ここでは、私うさみが執筆した連載記事の内容を紹介いたします。「裏話」では記事の一部を抜粋しています。

Vol.87 「PHPDocでコードの品質を保つ」

PHPDocはPHPコード内に記述するコメントについてのデファクト仕様です。「型がない」と呼ばれるPHPですが、メソッド定義などに適切な形式で記述することで、PHPコードを静的検査するための大きな助けとなります。

型宣言または型注釈(PHPDoc)を記述することによる非常にわかりやすいメリットは、PhpStormのような静的解析機能を持ったIDEでメソッド名の入力補完やエラーチェックが効果的に動作するようになることです。

私はこの記事を書いた後にもPHPDocやPHPの型解析などについてPHPカンファレンスやWeb上の記事を何度か焼き直して発表しています。そのなかでも、Vol.87では紙幅8ページのなかでPHPDocを体系的に理解できるよう、最も簡潔に整理して解説することができたと感じています。

裏話

デザインレシピに沿った開発

 PHPの本ではないのですが、『プログラミングの基礎』というプログラミングの入門書があります。この本ではデザインレシピというプログラミングの考え方が紹介されています。とても良い本なので詳しくはぜひ読んでいただきたいのですが、関数定義のデザインレシピとして次のような順で考えることを推奨しています。

  1. 目的:何を目的とした関数で、どんな型の値を受け取って何を返すのかヘッダに記述し、処理を考える
  2. 例:具体的な入力と出力の例を考え、実行可能なテストプログラムにする
  3. 本体:関数の本体に目的とする処理を実装する
  4. テスト:❷の「例」で作成したテストを実行し、実際に動くか確認する

ここで言及したのは浅井健一先生の「プログラミングの基礎」 です。この本はPHPとは関係ありませんが、「関数定義のデザインレシピ」はいわゆるTDDとも共通する考えかたです。あらゆる型の引数を受け付けたり戻り値にしたりできるPHPだからこそ、形式化された型表記とコメントを書くことで整理された関数/メソッドを定義することができると考えています。

PHPDocを型定義として取り扱うツールはPhpStormPhanPHPStanなど増えましたが、残念ながらPSR-5の仕様策定プロセスは2018年4月現在、停止状態にあります。JetBrainsさん、がんばってくれないかなあ……。

PHPカンファレンス福岡2018の前日の非公式イベントPHPカンファレンス福岡2018前夜祭リジェクトコンでは、PHPStanとEmacsを統合して高度なIDEとして利用するための方法を話す予定です。

参考記事


Vol.91 「名前空間とオートローディング」

PHPにはクラスを自動ロード(遅延ロード)する仕組みがあります。この記事では名前空間などPHPのクラスに関わる諸々の仕様や、useキーワードの記法、クラスローダーの実装方法、Composerのオートロード機能の使用方法などを併せて紹介しました。

オートローディングをうまく利用すると、PHPのクラス定義ファイルを明示的に読み込まなくても(include_oncerequire_onceを書かなくても)クラスを利用できるようになります。またファイルの読み込みを必要になるまで遅延させることができるのも大きなポイントです。

裏話

名前空間を導入すべきか?

 名前空間は優れた言語機能ではありますが、すでに名前空間なしで定義されたコード資産のあるプロジェクトではリファクタリングの規模が大きくなってしまいます。そのため、今回は名前空間の導入は 行いませんでした。

 もし既存コードに名前空間を導入したとしたら、クラスを利用している箇所のすべてを置換する(PHPの標準クラスやライブラリを含む)か、機械的にuseを挿入していくといった処置が必要になり、変更および確認コストが上がってしまいます。

名前空間は良い機能ではあるのですが、使いどころの難しいものでもあります。PSR-4の影響もあり一つのオートローディングを採用することと名前空間を採用することは結び付けて捉えられがちですが、実際には独立して考えることができます。

pixivでは、ここから更に範囲を拡げて、クラス名の命名規則にPSR-0風の擬似名前空間を採用した上で、すべてのクラスをオートロードしています。Packagistに公開するライブラリなどではともかく、独立したアプリケーションを構築する上では、これもひとつの割り切った選択肢です。

参考記事

この連載記事に近い話題としてQiitaにも記事を書いたので、こちらも併せてお読みください。


Vol.92 「PHPからのHTTPリクエスト」

この記事ではHTTPについての解説と、PHPからHTTPリクエストをする方法をまとめたものです。具体的には、環境への依存が少なく手軽に利用できる可能性が高い順からストリームラッパー1cURL関数Guzzle6の3種類の方法を紹介しました。

惜しむらくは、これらの3種類の使用方法を解説したところで8ページの紙幅がほとんど尽きてしまいました。この記事の最後にすこしだけ言及されているPSR-7とHTTPのテストについて、もっと言及したかったところです。

裏話

PSR-7ミドルウェアの応用

(中略)

 また極端な例では、社内で連携するWebアプリケーションがPSR-7準拠であれば、ApacheやnginxなどのHTTPサーバに依存せず、連携Webアプリケーションを同一プロセスで動作させライブラリとして 利用することで通信のオーバーヘッドを減らす、といった選択肢も生まれるでしょう。

PSR-7が登場する前の話ですが、弊社にはWebアプリケーションをマウントしてライブラリとして利用できるフレームワークがあります。現在この機能は積極的には利用していませんが、使いどころを選べば応用可能性のある技術です。

参考記事

GuzzleやPSR-7についてはQiitaにいくつか記事を書いたように、おもしろいことができます。


Vol.94 「PHP初心者がハマりがちな落とし穴」

この記事の原題は「セキュアなコードを書くためのPHP文法」でした。安全なPHPプログラミングのために把握しておくべき値の扱いや型、関数の仕様、リファレンスなどの機能など、紙幅8ページの中でさまざまな話題に言及しています(悪く言うと、取りとめがない)

勢い余って「PHP初心者」などと冠されていますが、この記事で触れた話題の一部は中級者でも理解が曖昧であったり、ベテランでもたまに落とし穴にはまってしまうことがあります。この記事で触れた内容は氷山の一角なので、また折を見て体系的に解説したいと考えています。

裏話

変数の複製

 PHPの値の特徴は「参照カウント」と「コピーオンライト」です注6。誤解を恐れずに書くと、値の種類によって複製する方法は異なります。数値や文字列や配列などの値は別の変数に代入しなおすだけで、別の値として複製されます。正確には値を変更する際に初めて値の複製が行われるので、それまでは変更コストは発生しません。

PHPの値や変数をどうやって取り扱えば良いのか、とても説明のしにくい概念です。オブジェクトはともかく、PHPの配列や文字列はRubyやPythonなど、ほかの言語とも違った振る舞いをするからです。

参考記事


Vol.96 「レガシーなプロダクトの改善」

この回のサンプルコードはGitHub zonuexe/wdb-php-96-sampleに置きました。

突然ですが、pixivのPHPのソースコードは特定のフレームワークの基盤には乗っていません。これはpixivが2007年に作られたときに特定のフレームワークに依存しなかったからです。pixivをWebアプリケーションとして見るとフレームワークがなかったために生まれた歪な部分もありますし、特定のフレームワークに依存しなかったこその機動的なリファクタリングやアーキテクチャ変更を連続的に断行できた面もあります。

Webアプリケーションとして必要なすべての機能をPHPの組み込み機能や自作コンポーネントだけでまかなうこともできますが、近年のPHPライブラリには特定のフレームワークに依存せず汎用的に作られているものがあります。この記事では、フレームワークに求められる機能や、PHP開発や運用に役立つツールやライブラリなどを個別に紹介しました。これらのツールの多くは現在のpixivでも利用されています。

pixivは2018年に入ってPHP 7.1移行を完了しましたが、それまでは長くPHP 5系に依存していました。それまではsymfony/polyfill: PHP polyfillsパッケージを利用して、PHP 7系に取り入れられた関数を先取りして利用していました。(地味ですが、intdiv()random_bytes()などです。)

7月14日に大阪で開催されるPHPカンファレンス関西では、私うさみ(@tadsan)が『「ふつうのPHP」がpixivになるまで』と題して、pixivを構築する上でPHPをどのように応用しているか、技術的な詳細についてお話しいたします。

裏話

PHPはレガシー言語か

 PHPは、ほかの言語の利用者から「レガシー」「セキュリティが脆弱」などのレッテルを張られがちです。しかし依然としてPHPは高いシェアを誇っており、プログラミング言語としての進歩も歩みを止めていない、胸を張れるモダンな開発環境です。

PHPは簡易な言語、古い言語として見くびられがちな面がありますが、現在でも継続的にアップデートされているWebアプリケーション開発環境で、世界中の多くのWebサービスで今なお採用され続けています。また「歴史的経緯」と呼ばれるような言語仕様や関数の仕様なども段階的に廃止・非推奨として改められています。

参考資料

まとめ

この連載『PHP大規模開発入門』では合計18記事が執筆されました。これらの記事はすべてpixiv開発の現場から生まれたものです。社内の重要な技術スタックについても、「社内WikiよりもWEB+DB PRESSやinsideの方が詳しくまとまっている」と言える内容もあります。

連載から一年以上が経ちましたが、この連載の機会を与えていただいたことで社内のPHPへの理解が整理された側面も決して小さくありません。私が担当したのは全18回中5回でしたが、需要を考えてネタ出しをし、回によっては本が一冊書けそうな内容を8ページの枠に凝縮して執筆したことは良い体験でした。

現在 WEB+DB PRESSには、Vol.102からの新しいPHP連載としてVOYAGE GROUPさんの開発チームによる「事業を支えるPHP」が連載されています。総集編に収録された本連載『PHP大規模開発入門』(Vol.80〜97)とPHP Mentorsさんの「巨人の肩からPHP」(Vol.69〜79)だけでなく、ぜひ最新のWEB+DB PRESSを手にとって最新の連載も読んでみてください。 (私も毎月楽しみに拝読してます!)

宣伝

ピクシブでは世界中から使われるサービスをこの手で作り上げたいエンジニアを募集しています。

ちなみに筆者は入社前はRubyをやっていて、PHPは未経験でした。


  1. file_get_contents()fopen()などのファイル操作系関数で利用される機能 

シェア
ツイート
ブックマーク
トゥート