localdisk

PHP とか Java とか Web とか好きなことを書きます。

PHPカンファレンス関西の感想と100万件バッチで死なないLaravel

2016年7月16日(土) に開催された PHP カンファレンス関西 2016 に行ってきました。

conference.kphpug.jp

会場は、昨年と同じブリーゼプラザ(大阪西梅田)で行われました。uzulla さんのエントリにあるように綺麗でオシャレ感漂うビルです。

さて、ここからは聞いたセッションの感想等を。

[基調講演] Composerを速くするために必要だったもの

speakerdeck.com

移動の都合で、はじめのほうを聞き逃してしまったんですけど、最高でした。僕はもう Composer ないと生きていけないし、それをより速くしてくれた Hiraku さんには感謝しかない。 本当に必要だったのは問題を向き合うこと という言葉にはしびれました。

大量のデータで困ってませんか?

Google BigQuery のお話。こういうPHPほとんどでてこない話が聞けるというのも、PHPカンファレンスらしくてよいところ。僕は触ったことがないのですが何かしらのデータを分析するときに使ってみたいなぁ。

ORMユーザー対談 〜Laravel/Doctrine/CakePHP3〜

殴り合いを期待して…というのは冗談で普通に和やかな空気でした。で、最後のほうで「100万件バッチどうする?」という話が出ました。ORM使ってるとこういう大量データのバッチ処理が問題になるのですが、カジュアルに Post::all() とかやると死にます。なので今回は死なない方法をここに書いておきます。5.2.33 以上で使えます。

gist.github.com

44行目に注目してください cursor メソッドを使っています。これは 5.2.33 から追加されました*1。内部でジェネレータを使っているのでメモリ不足で死ななくて最高です。

Laravel は 100万件バッチでも死なない。これだけははっきりと真実を伝えたかった。

あ、あと、MySQLのオプションを変えたいときは config/database.phpoption を変えるとよいです。

fideloper.com

追記

100万件とか作るコマンドも貼っておきます。

gist.github.com

php artisan make:post 1000000 とかやればおk。プログレスバーが使えて便利。こんな感じでバルクインサートできます。

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

人がすごかった。演台の前に体育座りで聴いてた人もいた。この時間はスポンサーブース回ったりEC-Cubeの講演をちら見したり。

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

この講演も人気で入れず。残念。あ、そうそう。動画が公開されるらしいですよ。PHPカンファレンス福岡も先日動画を公開したのでよかったらご覧ください。

PHPerに知ってほしいDB設計の話

speakerdeck.com

そーだい さんの講演はなにげに PHPカンファレンス北海道、福岡、やぱちーと全て聴いています。少しずつアップデートされているのがわかって楽しいです。

LT

で、LT。僕も一枠頂いたのでテストで簡単なモックを作りたいときは無名クラスでいいのではないかという話をさせていただきました。

懇親会

飲んだり食べたり。午前2時くらいまでワイワイやってました。

まとめ

楽しかった!また来るぞ!!

追記

id:sasezaki さんよりコメントをいただいたので、軽く計測してみました。

環境

OS: Mac OS X 10.11.6 CPU: Intel Core i5 2.7 GHz メモリ: 16 GB

Vagrant

Laravel Homestead 使用 CPU: 1 メモリ: 2G

posts テーブル

mysql> show columns from posts;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255)     | NO   |     | NULL    |                |
| body       | text             | NO   |     | NULL    |                |
| created_at | timestamp        | YES  |     | NULL    |                |
| updated_at | timestamp        | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

計測方法

こんな感じに書いてみました。

<?php

class FetchPost extends Command
{

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $start = microtime(true);
        $posts = Post::cursor();
        foreach ($posts as $post) {
            $this->line($post->body);
        }
        $usage          = number_format(memory_get_usage());
        $peakUsage      = number_format(memory_get_peak_usage());
        $processingTime = (microtime(true) - $start) * 1000;

        $this->info(sprintf("\nMemory: %s / %s bytes\nTime: %f ms", $usage, $peakUsage, $processingTime));
    }
}

計測結果

Memory: 8,126,624 / 426,113,968 bytes
Time: 723790.810108 ms

12分くらい。

*1:カジュアルに機能を足しすぎだよなぁとは思う