Successfully reported this slideshow.
Your SlideShare is downloading. ×

PHP でファイルシステムを作ろう

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 72 Ad
Advertisement

More Related Content

Slideshows for you (20)

Similar to PHP でファイルシステムを作ろう (16)

Advertisement

Recently uploaded (20)

PHP でファイルシステムを作ろう

  1. 1. PHP でファイルシステムを作ろう 五⼗嵐 進⼠ / sji / sj-i / @sji_ch
  2. 2. ⾃⼰紹介 @sji_ch SNS 上でのアイコンは GitHub が⾃動⽣成した奴
  3. 3. ⽣まれも育ちも仙台
  4. 4. PHP カンファレンス仙台とかやった
  5. 5. ふつうのサラリーマン 株式会社インフィニットループ仙台⽀社所属 スマホゲーのサーバサイドプログラマ
  6. 6. ⼀昨年娘ができた かわいい 絵本好き
  7. 7. Agenda ファイルシステムとは FUSE とは PHP で FUSE を利⽤する実例
  8. 8. ファイルシステム
  9. 9. ファイルシステムってこういうやつ
  10. 10. ファイル コンピュータで扱う⼀まとまりのデータ ⽤途に合わせて⾊々なのを沢⼭使う
  11. 11. ⼈間はへっぽこ→分類整理が要る ⼈間の脳容量は有限 沢⼭ファイルあるとわけわかに ディレクトリ(フォルダ)で分類整理
  12. 12. ⼊れ⼦にして整理できる
  13. 13. このへんのふわっとした仕組み全体=ファイルシステム コンピュータ上でファイルをどう扱うか 何をファイルとして扱うか どういう仕組みで管理するか 通常は OS がアプリケーションに提供
  14. 14. 余談︓任意階層のファイルシステムは Multics 由来︖ https://softwareengineering.stackexchange.com/questions/103487/what-was-the- rst-hierarchical- le-system
  15. 15. 雑談︓元を辿ればアインシュタインのしわざ︖ Peter Neumann さんが Multics のファイルシステムを設計 「アインシュタインとは2時間以上に渡り⾯会し<中略>こ の会話がきっかけとなって、私は階層的な抽象化やその他の 形の抽象化に⽣涯魅了されるようになりました」 http://www.csl.sri.com/users/neumann/
  16. 16. 無駄話︓Multi → Uni https://ja.wikipedia.org/wiki/Unixの歴史
  17. 17. OS と ファイルシステム
  18. 18. 仮想ファイルシステムと具体的なファイルシステム
  19. 19. ファイルシステムと⼀⼝に⾔ってもですよ どういう記憶媒体をどう利⽤してファイルやディレクトリ階層を表現するか ファイルやディレクトリへのアクセス権をどうする シンボリックリンクやハードリンク、ロックといった機構をどうする ファイルの破損に備えたデータの冗⻑化やジャーナリングの仕組みもどうしよう 各⽅式の間にトレードオフ 最適な仕組みは状況により異なる
  20. 20. 仮想ファイルシステム アプリケーションがファイルを扱う際のインターフェースを抽象化して提供 アクセス先に応じ具体的なファイルシステム実装が切り替わる 1 つのアプリケーションコードで⾊々な仕組みに対応できる
  21. 21. これアレだよね、制御の反転て奴では︖︖︖ 具体的なファイルシステム(FAT とか EXT-4 とか)へのアク セス処理が、VFS のインターフェースを実装 アプリケーションからの扱いが統⼀できる カーネル的な扱いも⼀部統⼀できる
  22. 22. しかしカーネルモードのプログラムを作るのはむずい
  23. 23. もうわりと修羅の世界 カーネルと同じ権限でプログラムが動作 つまりちょっとした不具合でシステム全体がクラッシュ クラッシュしたらマシンの再起動が必要 セキュリティ的なリスクも勿論上がる
  24. 24. OS よく分かりません OS はアプリケーションを楽に作って動かすためのもの アプリケーションプログラマに対して低レベルの実装詳細を隠蔽 多くのアプリケーションプログラマーは OS 内部の機構をよく知らない
  25. 25. そしてカーネルといえばネイティブコード
  26. 26. 何もかもアプリケーションと違う︕怖い︕
  27. 27. ここで FUSE ですよ
  28. 28. Filesystem in USEr space ですよ
  29. 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. 30. C の関数呼べばファイルシステムが作れるよ︕
  31. 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. 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. 33. Linux 以外でもいけるよ︕
  34. 34. dokany (Windows) Windows 上で動くユーザモードでのファイルシステム作成⽤ライブラリ Linux の FUSE 互換のラッパーライブラリを持つ 元々は未踏ユースで淺川浩紀さんという⼈が dokan というのを作っていた dokan の fork の dokanx の fork で今も更新されてるのが dokany https://github.com/dokan-dev/dokany
  35. 35. macFUSE (Mac OS X) Mac 版の FUSE Linux の FUSE の API のスーパーセットを提供 Linux ⽤の FUSE 実装がわりと簡単に移植できる https://osxfuse.github.io/
  36. 36. PHP で FUSE を叩く
  37. 37. sj-i/php-fuse https://github.com/sj-i/php-fuse
  38. 38. あなたと FUSE, 今すぐダウンロー ド composer require sj-i/php-fuse
  39. 39. 備考: PHP 5 ⽤だと C 拡張もあったよ https://github.com/gree/php-fuse
  40. 40. API 紹介
  41. 41. そもそもの VFS の話 アプリケーションがファイルアクセス⽤のシステムコールを 呼び出す open とか read とか write とか VFS はアクセス先に応じ使うファイルシステム実装を振り分 け
  42. 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. 43. 実際の C のコード fuse_operations という構造体へ open や read 等のコールバックを登録 fuse_operations を fuse_main() へ渡すとカーネル側からの通信を待つループに
  44. 44. PHP から FFI でも基本は⼀緒
  45. 45. ⽣の FFI が使い勝⼿びみょいので PHP 側でラッパー⽤意
  46. 46. たとえば、CData を避ける FFI で C の構造体へアクセスする際には FFICData を通す stdClass ばりに型としては何もない奴 実⾏時 C の構造体のメンバが全部 FFICData のインスタン スの動的プロパティとして⼊る IDE や静的解析などによる型の⽀援を殆ど受けられない
  47. 47. そうだラップしよう︕ fuse_operations と同じメンバを定義したクラスを⽤意 CData の fuse_operations を⽣成してメンバの中⾝を詰めら れるメソッドを持つ 各メンバには psalm の callable ⽤型アノーテーションを付け る
  48. 48. 間違ったシグネチャは静的に怒られるよ︕
  49. 49. でもやっぱり IDE の補完も欲しいよ︕
  50. 50. オブジェクト指向ってやつでなんとかして︕ FuseOperations を取り出せるインターフェースとして、 Mountable を⽤意 FuseOperations ⾃体も Mountable の実装、$this を返すだけ
  51. 51. マウントをとりまくろう︕ Mounter を⽤意 Mountable をとって指定されたパスへマウントする
  52. 52. ザ・リッチインターフェース FilesystemInterface を⽤意 Mountable を継承 fuse_operations へ詰めるコールバックと同じシグネチャのメ ソッドを全て持つ 50 メソッドくらいある
  53. 53. めっちゃ補完される嬉しい
  54. 54. 余計な⼿間は trait で誤魔化す fuse_operations は使うコールバックだけ詰めれば良い FilesystemInterface の全メソッド実装は⼤変 デフォルト実装を埋めるだけの trait を定義 メソッドの実装がこのデフォルト trait に由来するものの場合 fuse_operations に詰めない(Re ection で気合判定)
  55. 55. 数メソッド実装すればファイルシステムが作れる︕
  56. 56. FS の実装例
  57. 57. 何か PHP らしいのをファイルシステムにしたい
  58. 58. php-variable-fs (PHP といえば連想配列だよね︕) 連想配列とかオブジェクトは⼊れ⼦にできる 階層構造を持つデータということは⽐較的ファイルシステム 向き(︖) ライブラリとして composer install できる https://github.com/sj-i/php-variable-fs
  59. 59. var_dump みたいなノリで変数をマウントしよう︕ 連想配列をマウントした時点でプログラムの実⾏が停⽌ OS からのファイルアクセス⽤通信を待ち受ける状態に
  60. 60. もちろん phpstorm からも開けるよ︕ファイルだからね︕
  61. 61. wordpress-fs (PHP といえば WordPress だよね︕) WordPress の記事データをファイルシステムへマウント https://github.com/sj-i/wpfs
  62. 62. めんどくさいから細かいところは省くよ︕ WordPress の記事データはタクソノミーで階層化して⾒れる タクソノミーをディレクトリ扱いするとよさそう なのだが、準備時間の都合で今回は割愛 ID と slug にもとづいたファイル名でずらっと記事データを並べる
  63. 63. 脱線︓PHP 以外はみんな WordPress をマウントしてるよ︕ https://github.com/abhiyerra/wpfs https://github.com/kmbt/wpmount
  64. 64. 昨今はもう猫も杓⼦も Eloquent https://github.com/corcel/corcel
  65. 65. phpstorm で記事が読み書きできるよ︕
  66. 66. WordPress implements Filesystem ファイルなので grep 記事データを検索できる ファイルなので sed で⼀括置き換えが可能 ファイルなので phpstorm から記事データを開ける ファイル操作をする全てのツールが WordPress の記事データへのアクセスに使える
  67. 67. まとめ
  68. 68. ね、簡単でしょう︖(実際に)
  69. 69. かんたん(FUSE) × カンタン(FFI) = 超簡単︕
  70. 70. すべてが F(ilesystem) になる
  71. 71. 全てをマウントする⾔語、PHP
  72. 72. おしまい

×