Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPのstreamで遊ぶ

 PHPのstreamで遊ぶ

#phpblt 4回目で話したネタです

Hiraku NAKANO

April 21, 2016
Tweet

More Decks by Hiraku NAKANO

Other Decks in Technology

Transcript

  1. STREAMͰ༡Ϳ
    PHPBLT#4

    View Slide

  2. ͓લͩΕΑʁ
    Hiraku
    ▸ composerʹจ۟ݴͬͯΔਓ
    ▸ ޫ͕஗͍ͱจ۟ݴͬͯΔਓ
    ▸ PHPerྺ8೥͙Β͍

    View Slide

  3. STREAM
    ҙࣝͯ͠Δʁ

    View Slide

  4. PHPʹ͓͚Δ
    STREAM

    View Slide

  5. fopen, fclose, freadͳͲ
    CݴޠͰॻ͍ͯ͋Δ෦෼
    SplFileObject, file_get_contents
    ετϦʔϜ (file://, php://, http://ͳͲ)
    ਂ෵
    PHPer͕ීஈ

    ৮ͬͯΔॴ
    ΩϥΩϥͨ͠
    ΍ͭ

    View Slide

  6. ΋͏ͪΐͬͱਅ໘໨ͳઆ໌
    PHPͷSTREAMͱ͸
    ▸ UNIXͷϑΝΠϧهड़ࢠ(FD)ʹ૬౰͢ΔPHPػೳ
    ▸ resourceܕͷҰछ
    ▸ is_resource($fp) === true
    ▸ get_resource_type($fp) === 'stream'
    ▸ fopen()ͰऔΕΔ΄͔ɺSTDOUT΍STDIN΋͜ͷ஥ؒ

    View Slide

  7. ίʔυͰݴ͑͹
    $fs = fopen('hoge.txt', 'r');
    //↑これがストリームリソース
    $file = new SplFileObject('hoge.txt');
    //↑内部的にはストリームリソースが存在している

    View Slide

  8. ৭ʑछྨ͕͋Δ
    ▸ ϑΝΠϧύεͷઌ಄ͷ"file:// ..."ͷ෦෼Ͱ෼ذ͍ͯ͠Δ
    ▸ লུ͢Δͱfile://ͷҙຯʹͳΔ
    ▸ http:// ͱ͔ php:// ͱ͔ data:// ΋͋ΔΑ

    View Slide

  9. ΈΜͳҙࣝͤͣʹ

    ࢖͍ͬͯΔ͸ͣʂ

    View Slide

  10. PHPͷ"ετϦʔϜ"͕࣋ͭ
    ػೳ
    ϑΝΠϧγεςϜ

    Λந৅Խͨ͠΋ͷ
    ڊେͳσʔλΛѻ͑Δ
    ௨৴Λந৅Խ ฒߦॲཧ

    View Slide

  11. ໊લΑ͘ͳ͍ΑͶɻɻ
    ▸ Node.jsͷstreamsͱ͸ҧ͏
    ▸ σΟϨΫτϦͷ֓೦͕͋Δ
    ▸ ύΠϓͱ͔ιέοτͱ͔
    ▸ ඇಉظ͚ͨ͠Ε͹ࣗ෼Ͱॻ͘
    ▸ όΠφϦྻ͔͠ѻ͑ͳ͍

    View Slide

  12. STREAMͰ༡Ϳ

    View Slide

  13. fopen, fclose, freadͳͲ
    CݴޠͰॻ͍ͯ͋Δ෦෼
    SplFileObject, file_get_contents
    ετϦʔϜ (file://, php://, http://ͳͲ)
    ਂ෵
    PHPer͕ීஈ

    ৮ͬͯΔॴ
    ΩϥΩϥͨ͠
    ΍ͭ

    View Slide

  14. =حົͳ͜ͱ͕Ͱ͖Δ
    ਂ෵ʹ͍ۙͱ͍͏͜ͱ͸

    View Slide

  15. STREAMͰ༡Ϳ
    ωλ1

    View Slide

  16. ͝ଘ஌Ͱ͠ΐ͏͔
    ૊ΈࠐΈͷstream͸ফͤΔ
    ▸ stream_wrapper_unregisterؔ਺
    ▸ Ϋϥε΍ؔ਺͸(ී௨)ফͤͳ͍͚Ͳɺ

    stream͸ඪ४ػೳͰফͤΔ
    PHPͰػೳΛ
    ফͤΔͷ͸ΊͣΒ͍͠

    View Slide

  17. ͼͬ͘Γ͢Δ΄ͲPHP͕໾ʹཱͨͳ͘ͳΔtips
    stream_wrapper_unregister('file')
    ▸ file://ͷొ࿥Λফ͢
    ▸ require 'hoge.php'; Ͱ͖ͳ͘ͳΔ
    ▸ file_get_contents('hoge.php'); Ͱ͖ͳ͘ͳΔ
    Կ΋Ͱ͖ͳ͍ʂ

    View Slide

  18. ΍ͬͯΈΔ
    $ php -a
    Interactive shell
    php > stream_wrapper_unregister('file');
    php > echo file_get_contents('hoge.txt');
    PHP Warning: file_get_contents(): file:// wrapper is disabled in the server
    configuration in php shell code on line 1
    PHP Stack trace:
    PHP 1. {main}() php shell code:0
    PHP 2. file_get_contents() php shell code:1

    View Slide

  19. STREAMͰ༡Ϳ
    ωλ2

    View Slide

  20. ͝ଘ஌Ͱ͠ΐ͏͔
    ফͨ͠stream͸ࣗ࡞൛ʹஔ͖׵͑ΒΕΔ
    ▸ stream_wrapper_registerؔ਺
    ▸ streamWrapperͬΆ͍ΫϥεΛPHPͰ࣮૷ͯ͠ొ࿥
    ▸ http://php.net/manual/ja/class.streamwrapper.php
    stream૚ͰͷϞοΫԽ

    View Slide

  21. class Aori
    {
    private $finished = false;
    function stream_open($path, $mode, $options, &$opened_path) {
    return true;
    }
    function stream_read(int $count) {
    if ($this->finished) {
    return false;
    }
    $this->finished = true;
    return 'うるせーバーカ';
    }
    function stream_eof() {
    return $this->finished;
    }
    function stream_stat() {
    return [];
    }
    }
    stream_wrapper_unregister('file');
    stream_wrapper_register('file', 'Aori');

    View Slide

  22. php > require 's1.php';
    php > require 's1.php';
    うるせーバーカ
    php > require 's';
    うるせーバーカ
    php > echo file_get_contents('hoge');
    うるせーバーカ
    ἤͬͯ͘ΔPHP͕Ͱ͖ͨ

    View Slide

  23. STREAMͷϞοΫԽʂʂͬͯॻ͍͚ͨͲ
    ▸ requireͱ͔ͷΫϥεಡΈࠐΈ·ͰϞοΫԽ͞ΕͪΌ͏
    ▸ ݩͷfile://͕࢖͑ͳ͘ͳΔ
    ▸ ͭΑ͗ͯ͢໾ʹཱͨͳ͍…

    View Slide

  24. STREAMͰ༡Ϳ
    ωλ3

    View Slide

  25. PHP PREPROCESSOR

    View Slide

  26. ωλͩͬͨΜͰ͚͢Ͳ
    ͓୊
    ▸ setter/getterΛ୹͘ॻ͖͍ͨ...
    ▸ ϚδοΫϝιου͸νϟϥ͍͔Βݏ

    View Slide

  27. ϚΫϩͬΆ͍΋ͷΛ࡞Δ
    ▸ PHPͷίʔυΛు͘PHPͷίʔυΛॻ͘
    ▸ 1ճ࣮ߦͨ݁͠ՌΛrequire/file_get_contentsʹ౉͢
    ▸ ͱ͍͏ͷΛstreamWrapperͰ࡞Δ

    View Slide

  28. σϞ

    View Slide

  29. STREAM
    ໘ന͍Αʂ

    View Slide