uzullaがブログ

uzullaがブログです。

PHPの扱いづらいエラーをうまい感じにやるのとPHPerKaigi2019で登壇しますの話

今月末開催のPHPerKaigiがみえてきましたね!!

phperkaigi.jp

私もトークする予定です。

fortee.jp

さて、

結構昔にPHPのエラーの話をかきまして、

uzulla.hateblo.jp

uzulla.hateblo.jp

これらもだいぶ古くなったなあ、ということで最近PHP7.3と一緒につかっているタレをかいておきますね。

こちらが最近のタレの様子です

<?php
declare(strict_types=1);

// defines
define("START_MICRO_SEC", microtime(true)); // measure consume time.

// error handling settings
ini_set("display_errors", "0");
ini_set("display_startup_errors", "0");
ini_set('html_errors', "0");
error_reporting(E_ALL);
// Noticeを含むすべてのエラーをキャッチしてExceptionに変換
set_error_handler(function ($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});
// FatalErrorなどリカバリできないエラーをキャッチ
register_shutdown_function(function () {
    $error = error_get_last();
    if (!is_array($error) || !($error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_USER_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR))) {
        // 処理時間ログ
        if (getenv('LOGGING_CONSUME_TIME') !== false) {
            $consume_ms = (microtime(true) - START_MICRO_SEC) * 1000;
            error_log("consume time: " . sprintf("%.2f ms", $consume_ms));
            $memory = memory_get_peak_usage(false);
            error_log("consume memory: " . sprintf("%.2f kbyte", $memory / 1024));
        }
        return; // 正常終了系
    }

    // 異常終了系

    // Logging un-excepted output buffer(debug|error messages)
    $something = ob_get_contents();
    if (strlen($something) > 0) {
        error_log($something);
    }
    ob_end_clean();

    // Error Logging
    error_log("Uncaught Fatal Error: {$error['type']}:{$error['message']} in {$error['file']}:{$error['line']}");

    // response error
    if (!headers_sent()) {
        http_response_code(500);
    }
    echo "500 internal server error";
});

try {
    // enable output buffer
    ob_start();

    // ここから
    require(__DIR__ . "/vendor/autoload.php");
    echo "hello!";
    // ここまでにアプリを書く

    ob_end_flush();

} catch (\Throwable $e) {
    // Uncaught Exception

    // Logging un-excepted output buffer(debug|error messages)
    $something = ob_get_contents();
    if (strlen($something) > 0) {
        error_log($something);
    }
    ob_end_clean();

    // Stack trace Logging
    $error_class_name = get_class($e);
    error_log("Uncaught Exception {$error_class_name}: {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}\n{$e->getTraceAsString()}");

    // response error
    if (!headers_sent()) {
        http_response_code(500);
    }
    echo "500 internal server error";
}

こう、非常に富豪なHelloworldですが、まあこれくらいやっておくとだいぶ便利(主観です)かなと思います。

Noticeも通らないですし、へんなログ出力もなくなります。

ただ、Output bufferをつかっているので、フレームワークによっては少々食い合わせに注意が必要です。

これにもうちょっと継ぎ足すならログ周りかなとおもいますが、クリティカルなエラーのあとだとライブラリのロガーは挙動が怪しい事があるので、標準装備のerror_log()を使うほうが良いかなと思います。あ、あとPsyshでシェルに落ちるとかも便利ですよね。

まあ、なにやってんのかわかんねえ!という方もいらっしゃるかと思いますが、大丈夫、こういうのは普通の人は自分でかきません、有名なフレームワークにまかせましょう!!

…といったような話をPHPerKaigiでできるといいなとおもいますので、ぜひ皆さんご参加ください!!

練馬で僕と握手!!!

こちらからは以上です。

デブサミ2019で登壇してきました!!

f:id:uzulla:20190220195418p:plain

event.shoeisha.jp

「あの」、Developers summit 2019で登壇してきました!

発表資料はこちらです。

speakerdeck.com

きっかけとしては「城でカンファレンスやりましたよね?今年のデブサミは「SHARE YOUR FUN!」なのでいい感じに発表しませんか?」ということで近藤さんから登壇をさそっていただき、デブサミ初登壇ができました!ありがとうございます!

変わったトークなので?客入りはそこそこでしたが、質問に来てくれた方は片手では足りず。

なかなか皆さん興味をもって聞いていただけたのかなと思います。ありがとうございました!

f:id:uzulla:20190220195851p:plain

実は初デブサミ

デブ(デブではなくて、デブ的な意味で)なのに一度も参加したことがなかった。

感想としては規模がでかいな!という感じですね、そしてスタッフがなんかプロっぽい(実際ホテルの人がサーブとかしているしな)。

様々なカンファレンスに(といっても偏ってる気もするが)参加していますが、商業のカンファレンスにはあんまりいかないのでやはり新鮮に感じますね。

f:id:uzulla:20190220195704p:plain
(控室もシャンデリアバーンですごい)

色々勝手がわからず、同じ枠に登壇した小西さんに色々サポートしていただきました、本当にありがとうございました。

フィリピンから直行だったので

PHPという通貨をさわりたい!」という理由で(?)前日までフィリピンにいました。

1000PHPを崩すのにめちゃめちゃ苦労した渡航が終わり、登壇日の朝4時に羽田に帰国というエクストリーム登壇だったのもあり、他のトークはあんまり聞けなかったのが心残りです。

今度はちゃんと聴講できるスケジュールで参加したいですね。

f:id:uzulla:20190220200042p:plain
(アカツキさんのスペースで開催された非公式懇親会での15秒トークで「今日はフィリピンからきました」という嘘ではない小ネタをいれたら「フィリピンの人なんですか?」といわれてしまって(まあ当然ですね)すいません!となった)

しかし、いつか私がデブサミに登壇することがあればPHPの話をするのだろう…とPHPerとして考えていましたが、まさかこんな形で登壇することになるとはね。まあ自分が楽しいとおもってやっている趣味が評価されるというのはとても嬉しいものです、光栄でした!

こちらからは以上です!ありがとうございました!

f:id:uzulla:20190220195540p:plain
(ビズリーチさんのPHP水の様子です、うれしいですね!)

PHPerKaigi 2019にトーク応募しました!!

phperkaigi.jp

PHPerKaigi、トーク募集が21日の月曜正午までです!(挨拶)

追記: スポンサーもまだ募集中だとのことです (1/31(木)まで)

ということで遅くなりましたが、トークを何本かつっこみました!!

どれもこれも、皆さんの仕事にいますぐ役立つかといわれれば、まあそうでもないな…といういつもの私らしいトークになります。

果たして、どれかは通るだろうか、通ったらがんばります!

皆さんも月曜昼までにトークを応募しよう!!

チケット販売も開始しています、要チェックです、要チェックというか速やかに買おう!!後でっていうと忘れるよ!!

以下は応募(予定)のトーク概要です。どれか通るといいけど、本当に通るか、通ったとしてどれが通るかは不明です、聞きたいものがあれば、ブクマとかコメントとか選択してスターとかで教えてください。

「帰ってきた!平成最後のオレオレフレーワークの作り方」

fortee.jp

フレームワークと聞いて、皆さんは何を思い浮かべますか?Laravel?Symfony?Zend?Slim? 今はいろいろなフレームワークがありますね!

ただ、そうしたフレームワークは古代存在しませんでした(諸説ある)。よって昭和の人間はもれなく皆自分でフレームワークを書いていたと言い伝えられています。

とはいえ、前述の通り平成の今は素晴らしいフレームワークが十分に普及していますよね。平成も終わる今、本トークタイトルのようにオレオレフレームワークを書く意味があるのだろうか。その疑問はたしかに一理あります。むしろ書くなとも言われています。それはタブーだと。

ところで、フレームワークとは枠組みです、枠組みは内面を支えるものです。つまりフレームワークを書く事で自分の内面を知ることに繋がります(?)。そう、自分を知るためにもFWを書くべきです(??)。

※ いきなりスピリチュアルっぽいですが、深読みは不要です!

あと数ヶ月で平成が終わります、平成の終わりにオレオレフレームワークをつくり、自分を知りましょう!

自分を知り、そして…!

(勢いで)以下のようなアジェンダを予定しておりますが、予定です。

  • 空のファイルから全部書いたことがない人へ
  • フレームワークとはスタイル・ベストプラクティスである
  • 最大公約数とパラダイム、時代の移り変わり
  • オレオレフレームワーカーの「はしか」
  • 模倣にはじまり、オリジナルを見出し、そして「大人」になっていく
  • まとめ

北海道のトークを進化させたものですが、時間が短いので切り口は変わります。

PHPApache+mod_phpで十分(?)」

PHPはApache+mod_phpで十分(?) by うずら | トーク | PHPerKaigi 2019 #phperkaigi - fortee.jp

みなさんPHPでサービス提供していますか?何をつかって提供していますか?

Nginx+php-fpm?h2o+php-cgiIIS+php-fpm?swoole?builtin server?HHVM?Roadrunner?PHP-pm?いやいや、Apache+mod_phpですよね?あるいは諸般の事情でapache+php-cgiかもしれない。

Apache+mod_phpはいろんな人が「いまどきApacheとかないわ〜」とか「もうそもそも考えてもいなかった」とか言っています。でもどう考えてもapache+mod_phpで8割のケースは十分ですよね???

(勿論、皆さんが2割のケースにいらっしゃるかもしれない、それを否定するわけではありません。勿論そうなら泣く泣く(???)Apacheを使わないのは正しいのでしょう)

これらを比較して、mod_phpを見直しましょう!

「ちょっとまって!そのベンチ直線番長じゃないですか?」

fortee.jp

PHPがまた早くなった!そういう話結構多いですよね。僕もぐんぐんと伸びるグラフやベンチを貼って「PHPははやくなった!他の言語に負けていない!」とか言ってみる事もしばしば(?)あります。

でも、そうなのかな?本当にPHPって速いのかな?本当に十分に速ければ、皆がg○とかに民族移動しなくてもよいのでは…?(諸説あります)

いやいやでも結構PHPも速い(ような気がする)し…。

ということでPHPでよく見る「ベンチの欺瞞」あるいは「現実との乖離」、「先入観」について書いてみます。

「私が気になる最近の謎PHPライブラリ一挙紹介100連発!」

fortee.jp

私には「Packagist監視おじさん」として活動する顔があります(自称です)。@call_user_funcというTwitter botで、Packagistに投稿されるパッケージを日々監視しています。

Packagistに日々大量に登録されるライブラリですが、私が最近気になっているパッケージをたくさん紹介いたします!

※ 100連発とかいてありますが、これは「たくさん」という意味であり、本当に100連発になるか未定です、っていうか多分ならない。

聞いたこともない、みたこともない、日本では知られていない、本当に流行っているとは思っていなかった様々なパッケージに付いてご紹介いたします。

httpdと(mod_php|php-fpm|php-cgi)のカンケイの話」

fortee.jp

PHPにはhttpdがない(諸説あります)

そうすると様々な方法で、Httpd(ApacheやNginx)と付き合っていく必要がありますね、

そのあたりの設定についてコピペで済ませる人が多いですが、それってどうなのっておもいませんか?(えっ、おもわない?)

実は「よく知られている(検索で出てくる)設定はセキュリティ的にまずい」、「あるフレームワークだとなんか動かない」とか、しばしば見かける話だったりします。

様々な設定項目を確認して、それぞれの意味を見直してみませんか?

秘伝のconfからの脱出を図りましょう!

AWS lambda の(準公式)PHPサポートが好きになれない!」

fortee.jp

先日、AWSのLambdaでPHPがサポートされました!

しかし…ネイティブサポートというわけではなかったですね(残念)まあ、色々な都合はわかる所です、PHPのバージョンが固定されないという意味ではよいですよね!

※ 別に5.4に長いことロックされていた某サービスに文句をいっているわけではない

それはそうとして、発表直後こそ大喜びした私ですが、公開されたコードを読んで少々うーん?と思う所もありました。

「これはたしかにPHPだ、PHP-ismになるようにしてある。でも、こうしなくてもよいのでは…?」

他の言語バインディングなどを確認し、PHPならではの設計となっていることに疑問を覚えた私。「こういうふうにしたほうが良いのでは?」というお話をいたします。*1

また、普通のウェブアプリを普段書いている方向けに、これがどういった構造なのか(使い方ではない)、「一見微妙に見えるこの実装」がなぜ良いのか(勝手なエスパーで)、などをお話してみたいと思います。

注意: このトーク自体がLambdaを使う上で直接的に役立つかというと、多分役立ちません!

以上

以上です!

いつも「みんな早くCFPだして!」って急かす側なのに、今回は応募がおそくなってすみませんでした…。

(普段1〜2本しかださないが、今年は頑張ってたくさん提案してみたから、というのもある)

ちなみにトークが通ろうが通らまいが、PHPerKaigiには参加します!みなさんぜひPHPerKaigi会場でお会いしましょう!

phperkaigi.jp

チケット販売開始してるし、トーク応募は月曜日の12時(正午)までだよ!!

追記: スポンサーもまだ募集中だとのことです (1/31(木)まで)

*1:自作が完成したら、それの話をします