Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
shinjiigarashi
PDF, PPTX
5,018 views
PHP でファイルシステムを作ろう
- The slide used at a talk in PHPerKaigi 2021 - Write your own filesystems in PHP (via FFI and FUSE)
Technology
◦
Read more
1
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 72
2
/ 72
3
/ 72
4
/ 72
5
/ 72
6
/ 72
7
/ 72
8
/ 72
9
/ 72
10
/ 72
11
/ 72
12
/ 72
13
/ 72
14
/ 72
15
/ 72
16
/ 72
17
/ 72
18
/ 72
19
/ 72
20
/ 72
21
/ 72
22
/ 72
23
/ 72
24
/ 72
25
/ 72
26
/ 72
27
/ 72
28
/ 72
29
/ 72
30
/ 72
31
/ 72
32
/ 72
33
/ 72
34
/ 72
35
/ 72
36
/ 72
37
/ 72
38
/ 72
39
/ 72
40
/ 72
41
/ 72
42
/ 72
43
/ 72
44
/ 72
45
/ 72
46
/ 72
47
/ 72
48
/ 72
49
/ 72
50
/ 72
51
/ 72
52
/ 72
53
/ 72
54
/ 72
55
/ 72
56
/ 72
57
/ 72
58
/ 72
59
/ 72
60
/ 72
61
/ 72
62
/ 72
63
/ 72
64
/ 72
65
/ 72
66
/ 72
67
/ 72
68
/ 72
69
/ 72
70
/ 72
71
/ 72
72
/ 72
More Related Content
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
by
shinjiigarashi
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
by
Junichi Ishida
PDF
PHP 8 で Web 以外の世界の扉を叩く
by
shinjiigarashi
PDF
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
by
Kazuhiro Hara
PDF
PHPerに覚えて欲しい日本語の重要性
by
Rina Fukuda
PDF
H2O and php
by
Junichi Ishida
PDF
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
by
sasezaki
PDF
Phpstormちょっといい話
by
Hisateru Tanaka
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
by
shinjiigarashi
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
by
Junichi Ishida
PHP 8 で Web 以外の世界の扉を叩く
by
shinjiigarashi
クリーンな WordPress サイトのための PHP コーディングのお作法 ― 計画的に WordPress を拡張していくためのフレームワーク思考 |...
by
Kazuhiro Hara
PHPerに覚えて欲しい日本語の重要性
by
Rina Fukuda
H2O and php
by
Junichi Ishida
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
by
sasezaki
Phpstormちょっといい話
by
Hisateru Tanaka
What's hot
PDF
PHPカンファレンス2014の懇親会飛び込みLT資料
by
Junichi Ishida
PDF
8時間耐久 PHP構築の教室
by
Yusuke Ando
PDF
PhpStormで始める快適なWebアプリケーション開発 #phpcon2013
by
晃 遠山
PDF
PHP で実行中のスクリプトの動作を下から覗き見る
by
shinjiigarashi
PDF
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
by
sasezaki
PPTX
PHP基礎勉強会
by
Yuji Otani
PDF
ECMAScript没proposal追悼式
by
京大 マイコンクラブ
PPTX
PHPで並列処理する ライブラリを作った
by
Hironobu Saitoh
PPTX
JMeterをWebでしか設定できないサーバの設定自動化に使う
by
隆行 神戸
PDF
はじめてLaravelさわった 第86回php勉強会
by
Osamu Kawasaki
PDF
HTTPメッセージ、PHPの 事情ば分かっとっと?
by
sasezaki
PDF
あにみた!(PHPカンファレンス用資料)
by
Hiroyuki Ishiyama
PDF
PHPカンファレンス2016 初心者セッション
by
Hideo Kashioka
ODP
TwitterのStreaming ApiをPhpから使う
by
Hidenori Goto
PDF
Pythonはどうやってlen関数で長さを手にいれているの?
by
Takayuki Shimizukawa
PDF
PHPの今とこれから2016
by
Rui Hirokawa
PDF
RFC: "var" Deprecation
by
y-uti
PPTX
Pythonスタートアップ勉強会201109 python入門
by
Takayuki Shimizukawa
PHPカンファレンス2014の懇親会飛び込みLT資料
by
Junichi Ishida
8時間耐久 PHP構築の教室
by
Yusuke Ando
PhpStormで始める快適なWebアプリケーション開発 #phpcon2013
by
晃 遠山
PHP で実行中のスクリプトの動作を下から覗き見る
by
shinjiigarashi
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
by
sasezaki
PHP基礎勉強会
by
Yuji Otani
ECMAScript没proposal追悼式
by
京大 マイコンクラブ
PHPで並列処理する ライブラリを作った
by
Hironobu Saitoh
JMeterをWebでしか設定できないサーバの設定自動化に使う
by
隆行 神戸
はじめてLaravelさわった 第86回php勉強会
by
Osamu Kawasaki
HTTPメッセージ、PHPの 事情ば分かっとっと?
by
sasezaki
あにみた!(PHPカンファレンス用資料)
by
Hiroyuki Ishiyama
PHPカンファレンス2016 初心者セッション
by
Hideo Kashioka
TwitterのStreaming ApiをPhpから使う
by
Hidenori Goto
Pythonはどうやってlen関数で長さを手にいれているの?
by
Takayuki Shimizukawa
PHPの今とこれから2016
by
Rui Hirokawa
RFC: "var" Deprecation
by
y-uti
Pythonスタートアップ勉強会201109 python入門
by
Takayuki Shimizukawa
PHP でファイルシステムを作ろう
1.
PHP でファイルシステムを作ろう 五⼗嵐 進⼠
/ sji / sj-i / @sji_ch
2.
⾃⼰紹介 @sji_ch SNS 上でのアイコンは GitHub
が⾃動⽣成した奴
3.
⽣まれも育ちも仙台
4.
PHP カンファレンス仙台とかやった
5.
ふつうのサラリーマン 株式会社インフィニットループ仙台⽀社所属 スマホゲーのサーバサイドプログラマ
6.
⼀昨年娘ができた かわいい 絵本好き
7.
Agenda ファイルシステムとは FUSE とは PHP で
FUSE を利⽤する実例
8.
ファイルシステム
9.
ファイルシステムってこういうやつ
10.
ファイル コンピュータで扱う⼀まとまりのデータ ⽤途に合わせて⾊々なのを沢⼭使う
11.
⼈間はへっぽこ→分類整理が要る ⼈間の脳容量は有限 沢⼭ファイルあるとわけわかに ディレクトリ(フォルダ)で分類整理
12.
⼊れ⼦にして整理できる
13.
このへんのふわっとした仕組み全体=ファイルシステム コンピュータ上でファイルをどう扱うか 何をファイルとして扱うか どういう仕組みで管理するか 通常は OS がアプリケーションに提供
14.
余談︓任意階層のファイルシステムは Multics 由来︖ https://softwareengineering.stackexchange.com/questions/103487/what-was-the-
rst-hierarchical- le-system
15.
雑談︓元を辿ればアインシュタインのしわざ︖ Peter Neumann さんが
Multics のファイルシステムを設計 「アインシュタインとは2時間以上に渡り⾯会し<中略>こ の会話がきっかけとなって、私は階層的な抽象化やその他の 形の抽象化に⽣涯魅了されるようになりました」 http://www.csl.sri.com/users/neumann/
16.
無駄話︓Multi → Uni https://ja.wikipedia.org/wiki/Unixの歴史
17.
OS と ファイルシステム
18.
仮想ファイルシステムと具体的なファイルシステム
19.
ファイルシステムと⼀⼝に⾔ってもですよ どういう記憶媒体をどう利⽤してファイルやディレクトリ階層を表現するか ファイルやディレクトリへのアクセス権をどうする シンボリックリンクやハードリンク、ロックといった機構をどうする ファイルの破損に備えたデータの冗⻑化やジャーナリングの仕組みもどうしよう 各⽅式の間にトレードオフ 最適な仕組みは状況により異なる
20.
仮想ファイルシステム アプリケーションがファイルを扱う際のインターフェースを抽象化して提供 アクセス先に応じ具体的なファイルシステム実装が切り替わる 1 つのアプリケーションコードで⾊々な仕組みに対応できる
21.
これアレだよね、制御の反転て奴では︖︖︖ 具体的なファイルシステム(FAT とか EXT-4
とか)へのアク セス処理が、VFS のインターフェースを実装 アプリケーションからの扱いが統⼀できる カーネル的な扱いも⼀部統⼀できる
22.
しかしカーネルモードのプログラムを作るのはむずい
23.
もうわりと修羅の世界 カーネルと同じ権限でプログラムが動作 つまりちょっとした不具合でシステム全体がクラッシュ クラッシュしたらマシンの再起動が必要 セキュリティ的なリスクも勿論上がる
24.
OS よく分かりません OS はアプリケーションを楽に作って動かすためのもの アプリケーションプログラマに対して低レベルの実装詳細を隠蔽 多くのアプリケーションプログラマーは
OS 内部の機構をよく知らない
25.
そしてカーネルといえばネイティブコード
26.
何もかもアプリケーションと違う︕怖い︕
27.
ここで FUSE ですよ
28.
Filesystem in USEr
space ですよ
29.
FUSE は(雑に分けたら) 2
パート libfuse libc libc FUSE Ext3 ... VFS ls -l /tmp/fuse ./hello /tmp/fuse Kernel Userspace NFS CC BY SA 3.0 Unported ( ) FUSE structure.svg ( ) User:Sven@Wikipedia ( ) https://creativecommons.org/licenses/by-sa/3.0/deed.en https://commons.wikimedia.org/wiki/File:FUSE_structure.svg https://commons.wikimedia.org/wiki/User:Sven
30.
C の関数呼べばファイルシステムが作れるよ︕
31.
つまり C を使わなくてもいいってことだよ︕ Python: Ruby: Rust: Go: https://github.com/libfuse/python-fuse https://github.com/lwoggardner/rfusefs https://github.com/zargony/fuse-rs https://github.com/hanwen/go-fuse
32.
利⽤例は⾊々 SSHFS: s3fs: Docker Desktop: https://github.com/libfuse/sshfs https://github.com/s3fs-fuse/s3fs-fuse https://www.docker.com/blog/new- lesharing-implementation-in-docker-desktop-windows/
33.
Linux 以外でもいけるよ︕
34.
dokany (Windows) Windows 上で動くユーザモードでのファイルシステム作成⽤ライブラリ Linux
の FUSE 互換のラッパーライブラリを持つ 元々は未踏ユースで淺川浩紀さんという⼈が dokan というのを作っていた dokan の fork の dokanx の fork で今も更新されてるのが dokany https://github.com/dokan-dev/dokany
35.
macFUSE (Mac OS
X) Mac 版の FUSE Linux の FUSE の API のスーパーセットを提供 Linux ⽤の FUSE 実装がわりと簡単に移植できる https://osxfuse.github.io/
36.
PHP で FUSE
を叩く
37.
sj-i/php-fuse https://github.com/sj-i/php-fuse
38.
あなたと FUSE, 今すぐダウンロー ド composer require
sj-i/php-fuse
39.
備考: PHP 5
⽤だと C 拡張もあったよ https://github.com/gree/php-fuse
40.
API 紹介
41.
そもそもの VFS の話 アプリケーションがファイルアクセス⽤のシステムコールを 呼び出す open
とか read とか write とか VFS はアクセス先に応じ使うファイルシステム実装を振り分 け
42.
FUSE では OS
とユーザプロセスが通信 あらためてさっきの図 libfuse libc libc FUSE Ext3 ... VFS ls -l /tmp/fuse ./hello /tmp/fuse Kernel Userspace NFS CC BY SA 3.0 Unported (https://creativecommons.org/licenses/by-sa/3.0/deed.en) FUSE structure.svg (https://commons.wikimedia.org/wiki/File:FUSE_structure.svg) User:Sven@Wikipedia (https://commons.wikimedia.org/wiki/User:Sven) FUSE では VFS の処理振り分け先がユーザプロセスと通信 相⼿は FUSE の C ライブラリを使って作られたデーモン VFS からの open とか read とかの要求へ応答する
43.
実際の C のコード fuse_operations
という構造体へ open や read 等のコールバックを登録 fuse_operations を fuse_main() へ渡すとカーネル側からの通信を待つループに
44.
PHP から FFI
でも基本は⼀緒
45.
⽣の FFI が使い勝⼿びみょいので
PHP 側でラッパー⽤意
46.
たとえば、CData を避ける FFI で
C の構造体へアクセスする際には FFICData を通す stdClass ばりに型としては何もない奴 実⾏時 C の構造体のメンバが全部 FFICData のインスタン スの動的プロパティとして⼊る IDE や静的解析などによる型の⽀援を殆ど受けられない
47.
そうだラップしよう︕ fuse_operations と同じメンバを定義したクラスを⽤意 CData の
fuse_operations を⽣成してメンバの中⾝を詰めら れるメソッドを持つ 各メンバには psalm の callable ⽤型アノーテーションを付け る
48.
間違ったシグネチャは静的に怒られるよ︕
49.
でもやっぱり IDE の補完も欲しいよ︕
50.
オブジェクト指向ってやつでなんとかして︕ FuseOperations を取り出せるインターフェースとして、 Mountable を⽤意 FuseOperations
⾃体も Mountable の実装、$this を返すだけ
51.
マウントをとりまくろう︕ Mounter を⽤意 Mountable をとって指定されたパスへマウントする
52.
ザ・リッチインターフェース FilesystemInterface を⽤意 Mountable を継承 fuse_operations
へ詰めるコールバックと同じシグネチャのメ ソッドを全て持つ 50 メソッドくらいある
53.
めっちゃ補完される嬉しい
54.
余計な⼿間は trait で誤魔化す fuse_operations
は使うコールバックだけ詰めれば良い FilesystemInterface の全メソッド実装は⼤変 デフォルト実装を埋めるだけの trait を定義 メソッドの実装がこのデフォルト trait に由来するものの場合 fuse_operations に詰めない(Re ection で気合判定)
55.
数メソッド実装すればファイルシステムが作れる︕
56.
FS の実装例
57.
何か PHP らしいのをファイルシステムにしたい
58.
php-variable-fs (PHP といえば連想配列だよね︕) 連想配列とかオブジェクトは⼊れ⼦にできる 階層構造を持つデータということは⽐較的ファイルシステム 向き(︖) ライブラリとして
composer install できる https://github.com/sj-i/php-variable-fs
59.
var_dump みたいなノリで変数をマウントしよう︕ 連想配列をマウントした時点でプログラムの実⾏が停⽌ OS からのファイルアクセス⽤通信を待ち受ける状態に
60.
もちろん phpstorm からも開けるよ︕ファイルだからね︕
61.
wordpress-fs (PHP といえば
WordPress だよね︕) WordPress の記事データをファイルシステムへマウント https://github.com/sj-i/wpfs
62.
めんどくさいから細かいところは省くよ︕ WordPress の記事データはタクソノミーで階層化して⾒れる タクソノミーをディレクトリ扱いするとよさそう なのだが、準備時間の都合で今回は割愛 ID と
slug にもとづいたファイル名でずらっと記事データを並べる
63.
脱線︓PHP 以外はみんな WordPress
をマウントしてるよ︕ https://github.com/abhiyerra/wpfs https://github.com/kmbt/wpmount
64.
昨今はもう猫も杓⼦も Eloquent https://github.com/corcel/corcel
65.
phpstorm で記事が読み書きできるよ︕
66.
WordPress implements Filesystem ファイルなので
grep 記事データを検索できる ファイルなので sed で⼀括置き換えが可能 ファイルなので phpstorm から記事データを開ける ファイル操作をする全てのツールが WordPress の記事データへのアクセスに使える
67.
まとめ
68.
ね、簡単でしょう︖(実際に)
69.
かんたん(FUSE) × カンタン(FFI)
= 超簡単︕
70.
すべてが F(ilesystem) になる
71.
全てをマウントする⾔語、PHP
72.
おしまい
Download