Slide 1

Slide 1 text

PHP で作られたゲテモノを色々紹介する (自作他作含めて) 五十嵐 進士 / sji / sj-i / @sji_ch   株式会社インフィニットループ

Slide 2

Slide 2 text

ゲテモノ = いっぷう変わったもの 上手物の対義語としての方の意図ではないのに注意

Slide 3

Slide 3 text

自己紹介 @sji_ch SNS 上のアイコンは GitHub が自動生成した奴

Slide 4

Slide 4 text

生まれも育ちも仙台

Slide 5

Slide 5 text

PHP カンファレンス仙台とかやった

Slide 6

Slide 6 text

ふつうのサラリーマン 株式会社インフィニットループ仙台支社所属 スマホゲーのサーバサイドプログラマ 地元が仙台や札幌の人とかはぜひ一緒に働きま しょう

Slide 7

Slide 7 text

Agenda PHP の主戦場と近況 色々な PHP プロジェクトの紹介 まとめ

Slide 8

Slide 8 text

PHP の主戦場と近況

Slide 9

Slide 9 text

PHP の主戦場は Web

Slide 10

Slide 10 text

PHP: Hypertext Preprocessor

Slide 11

Slide 11 text

複雑化していく Web の戦場で悪名を抱えつつ 生き残り続けた 複雑化が進む Web の世界 昔はもっと牧歌的だった ちょっと処理を間違えてもとにかくページが表示されれば上出来 沢山の部品を組み合わせて 1 つのサイト、システムを作る必要の高まり 各部品が少しずつ違う方向へボタンをかけ違えれば本当に動かない より安全で確実に動くシステムへの要求 PHP は様々な罵声を浴びながら時代の変化に適応

Slide 12

Slide 12 text

生き残った現在の PHP 構文の整理 「なぜこれができてこれができない」といった構文上の理不尽をほぼ感じない 安全堅実に使えない機能の段階的廃止 充実したエコシステム composer で管理される豊富なパッケージ群 広大なユーザベースによるネットにあふれた知見 型の表現力の向上、静的型検査さえ可能 JIT による CPU バウンドな処理の高速化 FFI での他言語の資産の活用やローレイヤへのアクセス Fiber ベースの非同期処理

Slide 13

Slide 13 text

「Web 以外には向かない」 「タスクに応じた言語選びを」 今でも?本当に?

Slide 14

Slide 14 text

ここまで前置き

Slide 15

Slide 15 text

色々な PHP プロジェクトの紹介

Slide 16

Slide 16 text

RubixML PHP による機械学習ライブラリ 行列・ベクトル計算用ライブラリである Tensor を利用 Tensor は Zephir で作られた拡張コードを持つ Zephir は PHP フレームワーク Phalcon のた めに作られた言語 https://rubixml.com/ https://zephir-lang.com/en https://phalcon.io/en-us

Slide 17

Slide 17 text

phpy PHP コードと Python コードを相互に呼び出せ るようにする PHP 拡張 光と闇があわさって最強に見える どっちが闇? 同じプロセス内で PHP と Python 両方の VM を 動かし、zval と PyObject を相互に変換 PyDict を PHP から読み書きするほうが Python で読み書きするより速い Python パッケージから PHP の IDE 用スタブの 生成も可能 examples ディレクトリに色々入っている Linux / Windows / macOS をサポート 作者は swoole の人 https://github.com/swoole/phpy

Slide 18

Slide 18 text

PHP Desktop PHP 処理系と Chrome と Web サーバの抱き合わ せ PHP アプリケーションをデスクトップアプリケ ーションのように配布して各ユーザの手元で動 かせる 最近はあまり更新されていない https://github.com/cztomczak/phpdesktop

Slide 19

Slide 19 text

NativePHP PHP 処理系と Electron / Tauri と Laravel の抱き 合わせ Laravel サーバと Electron / Tauri を同時に立ち上 げて HTTP 通信越しに操作 クロスプラットフォーム UI を作るのに React や Vue などを使ってもよい し Livewire も使える static-php-cli を通じバイナリをビルドして配布 するためのツールもある https://nativephp.com/

Slide 20

Slide 20 text

PHP-GTK3 PHP から GTK3 を叩く拡張 今でもちょいちょいコミットが入る 古くからある gtk.php.net のものとは別 https://github.com/scorninpc/php-gtk3

Slide 21

Slide 21 text

php-tkui PHP から Tcl/Tk を叩く FFI ライブラリ 拡張をいじれるのは選ばれし者なので FFI だと 多少メンテしやすい筈 選ばれし者 = PHP をやる気があって C を自由 に読み書きできる人、という母数の狭い人の 中でもさらに公開プロジェクトをメンテして いくくらいやる気のある人 https://github.com/skoro/php-tkui

Slide 22

Slide 22 text

Z-Engine library FFI 経由で PHP VM 自体の機能を呼び出すライ ブラリ 演算子オーバーロードや final の実行時除去な ど、「拡張にならできる」が PHP で可能 作者が多忙であまり OSS 活動の時間がとれない らしく、最近更新されていない https://github.com/lisachenko/z-engine

Slide 23

Slide 23 text

Reli 拙作の PHP VM 解析ツール FFI 経由でシステムコールを呼び別プロセスの PHP 処理系のメモリ内容を読む コールトレースをサンプリングして取得すれば 遅い処理がわかる speedscope 形式などでフレームグラフの出力 も可能 メモリ内容を JSON ダンプすればメモリリーク やメモリボトルネックを jq で調べられる adsr/phpspy にインスパイアされて作った https://github.com/reliforp/reli-prof

Slide 24

Slide 24 text

php-meta-sapi PHP の FFI で PHP 処理系を読み込み PHP スク リプトによる SAPI を実装する実験 隔離されたサンドボックス(別の処理系環境) に細かく干渉しながらのスクリプト実行が可能 NTS な環境へ ZTS な処理系を読み込める つまり ZTS 向けのマルチスレッド拡張を NTS 環境へアドオン可能 作者は phpspy と同じ人 https://github.com/adsr/php-meta-sapi

Slide 25

Slide 25 text

sj-i/php-fuse PHP でファイルシステムを作る拙作ライブラリ FFI 経由で libfuse を通じて FUSE を叩く 連想配列や WordPress をファイルシステムとし てマウントしたりできる grep やエディタ、ファイラなどファイル操作を 行うツールで PHP スクリプト内のデータを操作 できる PHPerKaigi 2021 で発表 最近メンテしていないが面白い使い方を思いつ いたので弄りたい https://github.com/sj-i/php-fuse

Slide 26

Slide 26 text

FlappyPHPant PHP 製の Flappy Bird ライクな 2D ゲーム という GLFW のバインディングを作っ ている その上に更に というゲームフレームワー クを作っている https://github.com/phpgl/flappyphpant php-glfw VISU

Slide 27

Slide 27 text

PHP Tower Defense 同じ作者の 3D ゲーム こちらも VISU を使っている https://github.com/phpgl/php-towerdefense

Slide 28

Slide 28 text

solcoud/Counter-Strike 某ゲームライクな FPS サーバの PHP 実装 「某ゲーム」といってもプロジェクト名でモ ロバレだけど…… 今のところクライアント側は Electron で JS を使 って実装 https://github.com/solcloud/Counter-Strike

Slide 29

Slide 29 text

pmmp/PocketMine-MP Minecraft: Bedrock Edition 用の PHP によるサー バ実装 10 年以上前からあるプロジェクト 元々は Minecraft Portable Edition とそのプロト コルの解析を行うよう始まったらしい 内部的に pthreads 拡張を使ってマルチスレッド で動作 更新の止まった本家を fork して PHP 8.1 や 8.2 にも対応したもの https://github.com/pmmp/PocketMine-MP https://github.com/pmmp/ext-pmmpthread

Slide 30

Slide 30 text

まとめ

Slide 31

Slide 31 text

PHP の主戦場は Web

Slide 32

Slide 32 text

PHP はその主戦場へ引きこもってレベルを上げ続けた なろう系にそういうの幾つかありそう

Slide 33

Slide 33 text

レベルを上げすぎて今や他の戦場でもわりと戦える 人的資源やエコシステムがある

Slide 34

Slide 34 text

動的言語の柔軟性と静的型解析による安全性 成熟した OOP 機能 充実したパッケージ群 JIT と FFI

Slide 35

Slide 35 text

今や PHP は世界最強、ではなくとも、 まずまず十分に強力な言語

Slide 36

Slide 36 text

AI 分野でもシステムプログラミングでもゲームでも 何でも作れる

Slide 37

Slide 37 text

PHP で大規模なゲームサーバも作れる 今回紹介した OSS プロジェクトより大規模なものも 腕の良い PHPer が何人も集まってって作るような それが何年も毎日フルタイムでコードをコミットして作っていくような

Slide 38

Slide 38 text

え、PHP でゲームサーバを作るのを 毎日の仕事にしているような会社が 北海道にあるって?

Slide 39

Slide 39 text

仙台にも拠点があるって?

Slide 40

Slide 40 text

そう、株式会社インフィニットループです We are hiring!