PHPカンファレンス関西2016

PHPカンファレンス関西2016に参加してきました。
がっつりメモを取れたものだけまとめを書いていきます。

PHPカンファレンス関西2016 スライドリンク集 #phpkansai

composerを早くするために必要だったもの

composerの概要

  • phpライブラリの依存関係解決ツール
  • モダンな開発をするためにはほぼ必須

コマンド説明

  • init プロジェクトセットアップ
  • require ライブラリの追加
  • update ライブラリのアップデート
  • install composer.jsonに従ってインストール

Composerは「使うだけ」を許さない

  • composerは全部パッケージとみなす
感染力が強い
  • packagist.org
    • 10万パッケージ以上
    • jsonがおいてあるだけ
    • 依存解決はcomposerが行う

composerが遅い理由

  • laravelのプロジェクトcreateが269秒…
  • アジアで遅い
    • packagist フランス
    • github アメリカ
    • 通信が凄まじく発生する
    • 光の速さが遅いせいでcomposerが遅い
  • 通信のレイテンシに敏感な作り
    • 開発者自身が遅さを実感できていないから解決されない

composerを速くする

海外サーバを近くする
  • packagist.jp
    • 日本内にミラーサイトを作って物理的な通信距離を短くする
  • github
    • ミラーはできないのでここは仕方ない
無駄なパケット往復を減らす
  • HTTP1.1のコネクションを使い回す
    • TCP,TLSのハンドシェイクを節約

prestissimo

  • composerプラグイン
  • 難しかったところ
    • composerの事情に合わせる
    • PHP5.3、Windowsなどなど…

本当に大事だったもの

  • 課題解決を諦めない精神
    • ストレス駆動

ORMユーザー対談

いろいろなORM

  • Eloquent
  • ActiveRecord
  • Doctrine
  • CakePHP ORM

2テーブル関係

N:1
  • Eloquent
    • SQLを2つ発行
  • Doctrine
    • 設定によってJOINするか2つ発行するか決まる
  • CakeORM
    • SQLを一つに
N+1問題
  • Eloqent
    • Book::with(‘hoge’)とすると先取りできる
  • Doctrine
    • EntityManager
    • 取得済みデータをキャッシュに乗せておく
      • かしこい!

オブジェクト同一性

  • $author->books[0]->author;
    • またauthorの検索クエリが発行される?
  • CakeORMはエラー
  • Eloquentはもう一回取得しに行ってしまう
  • DoctrineはEntityManagerがメモリに取っておいて同一オブジェクトを返す
    • かしこい!

100万件バッチ処理

  • バッファ/非バッファ
  • バッファしたらメモリあふれる
  • Cakeは非バッファで処理できる
    • イテレータを返すから1ループでGC
  • EloquentはLIMIT・OFFSETをかけて少しずつ処理する設定が必要
    • DBエンジニアそーだいさんが何か言おうとしてたけど止められてた

ビューのソースコードコンフリクトから解放されるPHPerのための次世代Webアプリケーション開発への道

ビューで困ってきた

  • HTML in PHP
  • Smarty/Twig
  • Ajax
  • Flux/Web Components
  • だんだんビューが変わってきた

Web Components

  • 標準化が進んできている
  • Polimer など -> WebComponents.org
  • ちょっと標準からずれてるWeb Components
    • ReactJS
    • AngularJS

Polymer

  • bowerとpolimer-cliをnpm install
  • サーバーサイドレンダリングはできない
    • SEO対策としては使いにくいかも

おすすめポイント

  • W3C標準に近い
  • 学習コストが低い
  • クロスブラウザ(Polyfill)
  • 既に多数のコンポーネントがある
  • ドキュメントが充実している
    • そうだPolymerを使おう

Laravel と DIコンテナ、コンポーネントの設計

Laravelの魅力

  • DIコンテナ
  • User
  • Components

DIコンテナとは

  • new productRepository -> container(‘productRepository’)
    • containerを経由してオブジェクトを操作することでクラスの差し替えがあとから行い易い
    • 依存性が低い
  • オブジェクトを格納するためのグローバル変数
そもそもDIとは
  • Dependency Injection
  • コンストラクタ
  • Setter
  • 関数実行時に取得する

コンテナへの登録

  • サービスプロバイダ内でsingletonやbindなどのメソッドを用いて行われる
  • 再利用可能にしておくと拡張したい場合に便利
  • 自動登録
    • コンテナに登録されていないキーでも自動で登録してnewしてくれる

LaravelにおけるDI

  • DIパターンで外部化された
  • public_function __construct(Request $request)
    • app(Request::class)
  • $app->bind(User::class,MyUser::class)
    • クラスの置き換えがこの1行でできる

プロジェクト間でコードを再利用したい

  • 疎結合のシステムを作っていく
  • DIをうまく使って再利用性の高い便利なコードを書きましょう
git subtree
  • システムの一部を別のリポジトリから取得できる
    • 別プロジェクトのソースをそのまま使える

PHPで作る非同期処理

非同期処理

  • こんな時欲しくなる
    • WebSocketを利用した通信
    • 動画エンコードや大量メール送信の重いリクエスト
    • マルチコアの恩恵をうけたい
    • 重たいI/O
  • マルチプロセス/マルチスレッド
  • イベントループ

PHPで実装

  • マルチプロセス
    • PCNTL(compile with –enable-pcntl)
    • pcntl_fork();
    • 別プロセスによる並列処理が可能
    • 独立した処理向き
  • マルチスレッド
    • pthreads(compile with –enable-zts)
    • 別スレッドを生成して並列処理が可能
    • 各スレッドの結果を利用して次の処理に移行できる
  • Job-Queue
    • Resque
    • Redisのpub/subを利用したjob-queue
    • 大量メール配信などに向いている
  • イベントループ
    • ReactPHP
    • PHPにイベントループの仕組みを導入するライブラリ
    • composer require react/react
    • React自体は非同期処理じゃない
    • プロミスもかける

LTで気になったもの

PHPerにもCoderDojoのメンターとしてお手伝いしてほしい その後

  • CoderDojoのメンター募集
  • 企業さんの支援も募集中
  • まだ子供の応募の方が多い
  • ドヤ顔したい人はメンターになってね

PHP7で脱!モッキングフレームワーク

  • モックオブジェクトを扱うためのフレームワーク
    • テストを行う上で必要な振る舞いを返すために用意されるオブジェクト
  • Mockery etc.
  • PHP7の無名クラスやTraitを使ってテスト
    • 難しいことはできない
    • 諦めが肝心
  • 沼は選んでハマるべし

SwiftMailer アップデート

  • PHP5.2が非対応化
  • PHP7が対応

ロングポーリング(Commet)の話

  • ポーリングとは
    • 定期的に問い合わせをする
    • 条件を満たした時に情報を受信
  • ロングポーリングとは
    • 問い合わせをして条件を満たすまで返答しない
    • メリット
      • 受信待ち状態からの応答は早い
    • デメリット
      • 短時間の高頻度更新が苦手

まとめ

家に帰ってブログ書いてバズらせるまでがPHPカンファレンスって言ってた。
東京(蒲田)も行ってブログ書こうと思います。

元記事はこちら

[雑記] PHPカンファレンス関西2016 #phpkansai