タグ

ブックマーク / blog.shin1x1.com (66)

  • OPcache オペコードキャッシュの仕組み - Shin x Blog

    エントリでは、PHP の内部実装(php-src)から OPcache のオペコードキャッシュの仕組みを見ていきます。 OPcache にはいくつかの機能がありますが、ここでは共有メモリへのオペコードキャッシュと preload が対象です。ファイルベースのキャッシュと JIT については触れません。 サマリ オペコードキャッシュ preload オペコードキャッシュと preload の比較 オペコードキャッシュ キャッシュデータレイアウト グローバル変数、マクロ キャッシュデータ構造体 オペコードキャッシュ: ZCSG(hash) キャッシュエントリ: zend_accel_hash_entry キャッシュデータ初期化 OPcache 処理の有効化 PHP ファイルコンパイル処理でのキャッシュ制御 persistent_compile_file() の主な処理 zend_accel_

    OPcache オペコードキャッシュの仕組み - Shin x Blog
    shin1x1
    shin1x1 2024/07/24
    書きました
  • PHP に新しい演算子を実装するチュートリアル - Shin x Blog

    PHP に新しい演算子を実装するチュートリアルの紹介です。 www.sitepoint.com 新たなトークン、AST ノード、オペコードを実装するための修正ポイントや、PHP コードからオペコード実行までの実装を(部分的ですが)手軽に知ることできる良い内容でした。 ここでは PHP 8.3.9 をベースに手順をなぞっていきます。変更箇所の詳細は元エントリに解説があるので、そちらを参考にしてください。 実装仕様 PHP コードの実行 Scanner の変更 Zend/zend_language_scanner.l Zend/zend_language_parser.y 動作確認 Parser の変更 Zend/zend_language_parser.y Zend/zend_ast.h Compiler の変更 Zend/zend_compile.c Executor の変更 Zend/z

    PHP に新しい演算子を実装するチュートリアル - Shin x Blog
    shin1x1
    shin1x1 2024/07/17
    書きました
  • PHP のオートロードはいつ実行されるか - Shin x Blog

    下記エントリを書いたところ、ではいつオートローダによって PHP ファイルが読み込まれるのかという質問をいただきました。 blog.shin1x1.com このエントリでは、オートロードの仕組みを交えて、どのようなケースでオートローダが実行されるかをまとめました。 なお、このエントリではクラスの名称をクラス名としていますが、これはインターフェイス、トレイト、enumの名称も含んでいます。 オートローダが実行される条件 オートロード関数の登録 オートローダが実行される PHP コード オートローダが実行されない PHP コード 引数によってオートローダが実行される関数 オートローダ実行の仕組み zend_lookup_class_ex() spl_perform_autoload() 型検査 さいごに オートローダが実行される条件 オートローダは以下の条件を満たした時に実行されます。 spl

    PHP のオートロードはいつ実行されるか - Shin x Blog
    shin1x1
    shin1x1 2024/06/19
    書きました
  • php-fpm リクエストサイクル - Shin x Blog

    php-fpm がリクエストを処理しているサイクルをざっくりとまとめました。 php-fpm ワーカープロセスの生成 リクエストループ 1) リクエスト接続待ち listen_socket の生成 FastCGI リクエスト 2) リクエスト開始処理 実行PHPファイルパスの決定 スーパーグローバルへの格納 3) PHPファイル実行 4) リクエスト終了処理 PHP コード実行リソースの解放 max_requests チェック FastCGI クライアントとの通信 接続開始 リクエスト読み取り レスポンス書き込み 接続終了 さいごに php-fpm ワーカープロセスの生成 php-fpm は FastCGI リクエストを処理する SAPI 実装の一つです。いわば、PHP コードを実行する FastCGI サーバです。prefork 型となっており、nginx 等からの FastCGI リク

    php-fpm リクエストサイクル - Shin x Blog
    shin1x1
    shin1x1 2024/06/12
    書きました
  • use 文は PHP ファイルを読み込まない - Shin x Blog

    PHP の use 文では、クラス名や関数名、定数、名前空間などのエイリアスを設定できます。 <?php use App\Foo; use App\Bar as ABar; $foo = new Foo(); $bar = new ABar(); https://www.php.net/manual/ja/language.namespaces.importing.php この use 文は指定したシンボルにエイリアスを設定する、言い方を変えると名前空間をインポートするもので、オートロードでクラス定義 PHP ファイルを読み込むものではありません。*1 例えば、上記コードの場合、use 文の時点で App\Foo や App\Bar に対するオートロードは動作しません。 この動きを確認してみます。 use 文のみを実行 use 文でオートロードが動作するかは下記のようなコードで簡単に確かめ

    use 文は PHP ファイルを読み込まない - Shin x Blog
    shin1x1
    shin1x1 2024/06/05
    書きました
  • php-fpm(php) をビルドして gdb でデバッグ実行できる Docker Compose 環境を作った - Shin x Blog

    php-fpmphp コマンドを php-src からビルドして、gdb コマンドでデバッグ実行できる Docker Compose 環境を作りました。 github.com 利用方法 gdb コマンド php-src の .gdbinit さいごに 利用方法 リポジトリを git コマンドでチェックアウトして、make コマンドを実行します。make コマンドを実行すると、php-src からソースをチェックアウトして、Debian の Docker コンテナで php-fpmphp コマンドをビルドします。 $ make # ビルド完了後 $ docker compose run --rm php-fpm /php-src/php/bin/php -v PHP 8.3.8-dev (cli) (built: Jun 1 2024 04:00:02) (NTS DEBUG)

    php-fpm(php) をビルドして gdb でデバッグ実行できる Docker Compose 環境を作った - Shin x Blog
    shin1x1
    shin1x1 2024/06/04
    書きました
  • Docker Compose で php-fpm が発行するシステムコールを見る - Shin x Blog

    php-fpm の挙動を確認するために発行されるシステムコールを簡単に確認できる Docker Compose 環境を作りました。 github.com システムコール strace-php-fpm strace オプション php-fpm が発行するシステムコール例 ini ファイルの探索 nginx からの FastCGI リクエスト PHP ファイルの読み込み さいごに 参考 システムコール システムコールは、php-fpm のようなユーザプログラムが、ファイル操作やネットワーク通信、プロセス制御のようなカーネルが提供する機能を利用する仕組みです。PHP コードは PHP(ここでは php-fpm)で実行する必要があるので、php-fpm が発行するシステムコールを確認することで php-fpmPHP コードがどのように動作しているかを知る手掛かりになります。 システムコールを

    Docker Compose で php-fpm が発行するシステムコールを見る - Shin x Blog
    shin1x1
    shin1x1 2024/05/21
    書きました
  • 「PHPコードの実行モデルを理解する」をPHPカンファレンス香川2024で発表しました - Shin x Blog

    2024/05/11 に玉藻公園内 披雲閣で開催された PHP カンファレンス香川 2024 にて、「PHPコードの実行モデルを理解する」を発表してきました。 発表資料 日頃実行している PHP コードがどのように実行されているかをざっくりとイメージして頂くために、PHP コードの実行モデルと、身近な SAPI である php-fpm(mod_php)と php コマンドの実行モデルをご紹介しました。 X や発表後の会話では、やはり php-fpm(mod_php) の Laravel アプリケーションではリクエスト毎に 400 ファイル以上をコンパイルしている(OPcache 未使用の場合)話の反応が多かったです。 カンファレンスのような多様な人が集まる場では、知っている人にとっての「当たり前」を共有する発表も大事だなとあらためて感じました。こういった発表もやっていきたいですね。 Tog

    「PHPコードの実行モデルを理解する」をPHPカンファレンス香川2024で発表しました - Shin x Blog
    shin1x1
    shin1x1 2024/05/14
    書きました
  • 「制約の力 - 状態を限定する -」を PHP カンファレンス福岡 2023 で発表しました - Shin x Blog

    2023/06/24 に福岡ファッションビルで開催された PHP カンファレンス福岡 2023 にて、「制約の力 - 状態を限定する -」を発表してきました。 発表資料 Togetter: https://togetter.com/li/2173469 制約を活用して、状態を想定されたものに限定して、不要な複雑さを排除しようという内容でした。 発表では、状態を限定されたものにするという考え方を伝えたいと思っていたので、制約の活用例については、発表時間を考慮してカットしていました。公開している資料では、カットした部分や補足なども加えています。 開発を行なっていく中で、考慮しないとならないは増えていく一方ですので、考えることをいかに減らすかという視点は長くシステムを運用していく上で大切になってくるポイントの一つだと思います。(不要な複雑さを抱えたままのシステムをメンテナンスしていくことの大変さ

    「制約の力 - 状態を限定する -」を PHP カンファレンス福岡 2023 で発表しました - Shin x Blog
    shin1x1
    shin1x1 2023/06/27
    書きました
  • 現代のソフトウェア工学を示す「継続的デリバリーのソフトウェア工学」 - Shin x Blog

    年末年始に「継続的デリバリーのソフトウェア工学」を読みました。新年を迎えて、気分を一新して開発を始めるのに良いでした。 ソフトウェア開発に役立つプラクティスを示した 学びのエキスパート 複雑さ管理のエキスパート 実践的なツール データに基づく指標 ソースコードに限らずに広く適用 ソフトウェア開発者としての矜持 TDD あちら側とこちら側 「継続的デリバリー」は 1 要素 さいごに ソフトウェア開発に役立つプラクティスを示した ソフトウェア工学とは、ソフトウェアの実際的な問題に対する効率的、経済的な解を見つけるための経験的、科学的アプローチの応用のことである。 1.2 「ソフトウェア工学と何か」 書では、ソフトウェア開発の現場で役立つプラクティスを、ソフトウェア工学としてまとめています。ここでいう科学的アプローチとは、「特徴づけ」「仮説の定立」「予測」「実験」という形で思考を組み立て

    現代のソフトウェア工学を示す「継続的デリバリーのソフトウェア工学」 - Shin x Blog
    shin1x1
    shin1x1 2023/01/08
    書きました
  • GitHub Actions で amd64/arm64 両対応の Docker イメージをビルド - Shin x Blog

    PHP 開発環境の Docker イメージとして公開している shin1x1/php-dev イメージの arm64 対応を行いました。従来の amd64 も必要なので、マルチアーキテクチャビルドでイメージを生成するようにしています。 shin1x1/php-dev については下記を参照で。 blog.shin1x1.com Docker Buildx による multi-arch ビルド Docker Buildx は Buildkit でビルド機能を拡張する Docker CLI プラグインです。Buildx にはマルチアーキテクチャビルド機能があるので、これを利用します。 docs.docker.com 実行の流れを掴むために M1 MacDocker DesktopBuildx を利用してビルドしてみます。Docker Desktop 4.3.1 には Buildx が

    GitHub Actions で amd64/arm64 両対応の Docker イメージをビルド - Shin x Blog
    shin1x1
    shin1x1 2021/12/15
    書きました
  • 「ドメインをモデリングして PHP コードに落とし込む」を発表しました / PHP カンファレンス 2021 - Shin x Blog

    2021/10/02, 03 にオンラインで開催された PHP カンファレンス 2021 にて「ドメインをモデリングして PHP コードに落とし込む」を発表しました。 発表資料 Sample code: https://github.com/shin1x1/domain-modeling-with-php Togetter: https://togetter.com/li/1783062 joind.in: https://joind.in/talk/650b0 ドメインモデルという共通概念をモデリングし、それをコードに反映するという内容です。 去年は事前に録画して自分で再生した のですが、今年はライブでやりました。やっぱりライブは良いですね。話し出しはモニタに向かって話す違和感がありましたけど、途中から調子が掴めてきました。 Discord をチラ見していたのですが、リアルタイムでどんど

    「ドメインをモデリングして PHP コードに落とし込む」を発表しました / PHP カンファレンス 2021 - Shin x Blog
    shin1x1
    shin1x1 2021/10/06
    書きました
  • level=0 から始める PHPStan(Larastan) 導入ガイド - Shin x Blog

    PHP にはアプリケーションを実行せずに静的にコード品質をチェックする静的解析ツールがいくつかあります。有名なところでは、PHPStan や Psalm、Phan、PHPMD などがあります。エントリでは、まだこうした静的解析ツールを導入していないプロジェクト向けに PHPStan 導入の流れをまとめてみました。 3(4) 行まとめ サンプルコード PHPStan とは 適用方針 Playground PHPStan のインストール Composer Composer(Larastan) Docker 設定ファイルの作成 PHPStan の実行 主なエラー(level=0) baseline ファイルの作成 baseline ファイルの修正 CI での自動実行 GitHub Actions の設定 ブランチ保護ルール さいごに 3(4) 行まとめ composer もしくは Docker

    level=0 から始める PHPStan(Larastan) 導入ガイド - Shin x Blog
    shin1x1
    shin1x1 2021/08/25
    書きました
  • ソフトウェア設計原則は変更容易性に通ず - Shin x Blog

    色々な原則や方法論はあれど、つまるところいかに変更容易性を確保するかと言う話に帰結するのでは。極論すれは、正しく動いていて変更する必要が無ければどのような作りになっていても構わない。一方、Web アプリケーションを稼働し続ける上で全く変更しなくて良いということもない。— Masashi Shinbara (@shin1x1) 2021年5月30日 ソフトウェア設計、開発には多くの原則や方法論がある。例えば、DRY 原則や SOLID 原則、デザインパターンにレイヤードアーキテクチャ、クリーンアーキテクチャなどある。さらに DDD にも多くの原則や方法論が含まれている。これらを変更容易性を高めるための手段として原則や方法論を捉えるというのがエントリの論旨である。 原則や方法論の捉え方 変更容易性 質的な変更と副次的な変更 外部変更容易性と内部変更容易性 原則を適用する指針 さいごに 原則

    ソフトウェア設計原則は変更容易性に通ず - Shin x Blog
    shin1x1
    shin1x1 2021/06/02
    書きました。
  • Laravel 8 対応版「PHP フレームワーク Laravel Web アプリケーション開発」を執筆しました - Shin x Blog

    2018 年に出版された「PHP フレームワーク Laravel Web アプリケーション開発」の Laravel 8 対応版 を共著で執筆しました。 前回は Laravel 5.5(LTS) がターゲットだったのですが、あれから 3 年近く経過して Laravel 8 が最新バージョンとなったので、こちらに対応するために内容をアップデートしています。 私は、8 章のコンソールアプリケーションと 9 章のテストを担当しました。 開発現場のお供に Web アプリケーション 開発の現場で Laravel を使うことを前提に各機能を解説したです。ある意味、Laravel を触ることが目的ではなく、Laravel を使って Web アプリケーションを開発することが目的の方に向けたともいえます。 1 章こそ、チュートリアルなどで良くある環境設定からサンプルアプリケーションを構築する流れですが、2

    Laravel 8 対応版「PHP フレームワーク Laravel Web アプリケーション開発」を執筆しました - Shin x Blog
    shin1x1
    shin1x1 2021/05/27
    書きました
  • Software Design 2021年5月号に PHP 8 の記事を寄稿しました - Shin x Blog

    Software Design 2021年5月号に PHP 8 の記事を寄稿しました。 Software Design (ソフトウェアデザイン) 2021年5月号 [雑誌] 発売日: 2021/04/16メディア: KindlePHP 8 でコーディングはどこまで変わる? 担当したのは、PHP 8 特集の第 1 章「PHP 8 でコーディングはどこまで変わる?」です。 PHP 8 をそろそろ触ってみようかなという方向けに、PHP 8 で追加された新しい文法と PHP 7 で動作していたコードの移行に関する注意点を解説しています。 PHP 8 の新機能を試したり、移行に関する情報はキャッチアップしていたつもりでしたが、いざ解説を書くとなると見落としていたところや気づいたことがあり、個人的にも良い学びになりました。ページ数の関係で削った箇所もあったので、いずれ blog にでも書ければと思

    Software Design 2021年5月号に PHP 8 の記事を寄稿しました - Shin x Blog
    shin1x1
    shin1x1 2021/04/16
    書きました
  • 「PHP 8 で作る JSON パーサ」を発表しました / PHP カンファレンス 2020 - Shin x Blog

    2020/12/12 にオンラインで開催された PHP カンファレンス 2020 にて「PHP 8 で作る JSON パーサ」を発表しました。 発表資料 sample code: https://github.com/shin1x1/php8-toy-json-parser 発表で紹介したコードは、phpcon2020 タグになります。 https://github.com/shin1x1/php8-toy-json-parser/releases/tag/phpcon2020 Togetter: https://togetter.com/li/1636454 これまでパーサを書いたことが無い方を対象に Lexer(字句解析器) と Parser(構文解析器) からなる JSON パーサの実装を解説しました。 JSON は LL(1) なので、先頭から 1 文字づつ読んでいけばパースできま

    「PHP 8 で作る JSON パーサ」を発表しました / PHP カンファレンス 2020 - Shin x Blog
    shin1x1
    shin1x1 2020/12/16
    コードの書き納め、書き初めに JSON パーサをどうぞ
  • PHP 8 の新機能を使ってコードを書いた雑感 - Shin x Blog

    PHP カンファレンス 2020 の登壇のために PHP 8 で JSON パーサを書いてみました。 https://github.com/shin1x1/php8-toy-json-parser いくつか PHP 8 の新機能を使ったのでその雑感です。 Constructor Property Promotion Named arguments Union Types Match expression Attribute さいごに Constructor Property Promotion https://www.php.net/releases/8.0/en.php#constructor-property-promotion TypeScript のようにスッキリ書けるのが良いです。 コンストラクタ仮引数にアクセス修飾子を足すだけなので、慣れないと一瞬戸惑うかもしれません。以前 T

    PHP 8 の新機能を使ってコードを書いた雑感 - Shin x Blog
    shin1x1
    shin1x1 2020/12/11
    書きました
  • PHP 8 Attribute シンタックスの変遷 - Shin x Blog

    PHP 8 の新機能の一つ、Attribute の形式が紆余曲折ありながら最終的に #[] となりました。実用上は #[] 形式だけ覚えておけば良いのですが、シンタックスの変遷は興味深いものだったので残しておこうと思います。 Attribute Attribute 仕様の変遷 8.0.0alpha1: <<>> 8.0.0alpha2 8.0.0beta1: @@ @@ の問題 8.0.0beta4: #[] #[] の注意点 さいごに Attribute PHP 8 の Attribute は、他のプログラミング言語によくあるアノテーションです。クラスやメソッド、プロパティ、関数に付与することで任意の処理を追加することができます。PHP では従来 Doc コメントでこれを指定する文化がありましたが、これを言語仕様として実装したものです。 <?php declare(strict_type

    PHP 8 Attribute シンタックスの変遷 - Shin x Blog
    shin1x1
    shin1x1 2020/09/30
    書きました
  • 事業会社の現場 - 「Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち」 - Shin x Blog

    @makoga さんから「Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち」を送って頂きました。ありがとうございました。 VOYAGE GROUP にある 5 つの事業会社についてそれぞれの事業を支えるシステムの開発、運用、改善といった内容を在籍するエンジニアへのインタビュー形式でまとめられたです。 事業会社の現場 システムは一度開発して終わりではなく、事業を継続し続ける限りその開発運用をしていくとになります。5 社ではそれぞれ別の事業を営んでおり、それぞれのコンテキストがあります。書では、システム開発における様々な意思決定(主にシステムの改善)と施策を行ってきたかという話がメインとなっているのですが、具体的な施策だけではなくその背後にあるコンテキストも含めて語られているのが大きいな特徴です。 システム開発は無数の意思決定の上に成り立っており、それぞれの

    事業会社の現場 - 「Engineers in VOYAGE ― 事業をエンジニアリングする技術者たち」 - Shin x Blog
    shin1x1
    shin1x1 2020/08/21
    レビューを書きました。内容について話したくなる良い本でした。