 Idea originating in 1950’s
                 Standard way to get Input and Output
                 A source or sink of data
Definitions




                 C – stdin, stderr, stdout
                 C++ iostream
Who uses them




                 Perl IO
                 Python io
                 Java
                 C#
These are the people you can blame for the PHP streams implementation
 We will write code (in pairs)
 There will be a quiz (with prizes)
 You get out what you put in – participate!

This is really 3 talks in one -
 Streams
 Filters
 Sockets
Abstracting I/O
 Access input and output generically
 Can write and read linearly
 May or may not be seekable
 Comes in chunks of data
 EVERYTHING
 include/require _once
 stream functions
 file system functions
 many other extensions
Stream
         Contexts

             Stream    Stream
ALL IO
              Filter   Wrapper
   Stream
    › Resource that exhibits a flow or succession of
     data
   Wrapper
    › Tells a stream how to handle specific
     protocols and encodings
   Context
    › A set of parameters and options to tell a
     stream (or filter) how to behave
   Scheme
    › The name of the wrapper to be used. file, http, https, ftp,
      etc.
   Target
    › Depends on the wrapper, filesystem uses a string path
      name, ssh2 uses a PHP resource

    home/bar/foo.txt
    file:///home/bar/foo.txt
    http://www.example.com/foo.txt
    ftp://user:pass@ftp.example.com/foo.txt

    php://filter/read=string.toupper|string.rot13/resource
    =http://www.example.com
 flock
 wrapper limitations
 non-existent pointers (infinite loops can
  and will happen)
 error handling
 Parameters
 Options
 Modify or enhance a stream


 stream_context_set_param
 stream_context_set_option
 stream_context_create
Streams available by default
 file://
 http://
 ftp://
 data://
 glob://
   SSL                     Phar
    ›   https://             › phar://
    ›   ftps://             Zlib
    ›   ssl://               › compress.zlib://
    ›   tls://               › zlib://
   SSH                     Bzip
    ›   ssh2.shell://        › compress.bz2://
    ›   ssh2.exec://
    ›   ssh2.tunnel://
    ›   ssh2.sftp://
    ›   ssh2.scp://
 Pipes
 STDIN, STDOUT, STDERR
 proc_open
 popen
 php://stdin
 php://stdout
 php://stderr
 php://output
 php://input
 php://filter (5.0.0)
 php://memory (5.1.0)
 php://temp (5.1.0)
1.   Get a Feed from Flickr -
     http://www.flickr.com/services/feeds/

2. No curl installed, allow_url_fopen is on
3. Display however you would like
Grab the feed as xml, pop it through
 simplexml, loop and display the output
 to a webpage
Userland Filters and Streams
 There are no interfaces
 Implement as though there were an
  interface
 Seekable is optional
 Flushable is optional
 Directory support is optional
 fopen
               file_get_contents

Information


                 Return true or false
                 $this->context will have any context
                  metadata
Code
   fread
                 fgets
                 file_get_contents
Information
                 etc…


                 Return string data or false
                 $this->context will have any context
                  metadata
Code
 fwrite
               file_put_contents

Information


                 get in a string of data to deal with
                 return how many bytes you wrote
Code
   feof
                 file_get_contents
                 fread
Information
                 etc…


                 Return true or false
                 $this->context will have any context
                  metadata
Code
 fclose
               file_get_contents

Information


                 Don’t return anything
                 any cleanup should go here
Code
 fstat calls stream_stat
 EVERYTHING ELSE uses url_stat
 Good idea to do both




   Return an array of data identical to stat()
 stream_seek
 stream_tell




   stream_flush
 mkdir
 rmdir
 dir_closedir
 dir_opendir
 dir_readdir
 dir_rewinddir
 stream_lock
 stream_cast
 rename
 unlink
Create a custom wrapper for any kind of
  network or shared memory storage you
  want (except s3 which is way overdone)

Implement at least the basics – extra points
  for more features
Wrapper for wincache (btw, porting this to
 apc would be a breeze)

Does basics + seek + flush (since we’re
 caching) + rename + unlink

No directories
Use Case land – when streams
make sense
 Data in s3
 Data locally during development
 Easy switch out if alternative storage is
  ever desired
 Storing image files
 Existing Zend Framework Code
 Register the s3:// wrapper
 Use a configuration setting for the stream
  to use for all images on the system
 Store and edit template files in a
  database
 Have the snappiness of including from
  disk
 Minimal Configuration
 db:// stream
 simple stream wrapper that looks for the
  template in the db, and writes it to the
  filesystem before returning the data
 The cached location is FIRST in the
  include path, so if it fails, the db stream
  gets hit
 Talk to mercurial (hg binary)
 hg communicates via command line
 continue to pipe additional commands
 Use proc_open to keep a pipe to the
  binary going
 Pass commands through stdin pipe as
  necessary
 Abstract this out to other binaries that
  are used by the system
1. Name 3 Built in PHP streams.
2. What is a Context? A Wrapper? A
   Stream?
3. How do you identify a stream?
4. Name two extensions that provide
   additional PHP streams.
 http://php.net/streams
 http://php.net/filesystem
 http://ciaranmcnulty.com/blog/2009/04/
  simplifying-file-operations-using-php-
  stream-wrappers
Because everyone needs to rot13
a file they open on the fly
 Performs operations on stream data
 Can be prepended or appended (even
  on the fly)
 Can be attached to read or write
 When a filter is added for read and write,
  two instances of the filter are created.
 Data has an input and output state
 When reading in chunks, you may need
  to cache in between reads to make
  filters useful
 Use the right tool for the job
   string filters
    › string.rot13
    › string.toupper
    › string.tolower
    › string.strip_tags
   convert filters
    › convert.*
       base64-encode
       base64-decode
       quoted-printable-encode
       quoted-printable-decode
   dechunk
    › decode remote HTTP chunked encoding
      streams
   consumed
    › eats data (that’s all it does)
 bzip.compress and bzip.compress
 convert.iconv.*
 zlib.inflate and zlib.deflate
 mcrypt.* and mdecrypt.*
 Extend an internal class php_user_filter
 It’s not abstract…
 Yes that’s a horrible name
 Remember this pre-dates php 5.0
  decisions
 onCreate
               basically a constructor
               Called every time PHP needs a new filter
Information
                (on every stream)

                 return true or false
Code
   php_user_filter
    › $this->filtername
    › $this->params
    › $this->stream
 onClose
               basically a destructor

Information




                 no return
Code
   MUST return
                  › PSFS_PASS_ON
                  › PSFS_FEED_ME
Information       › PSFS_ERR_FATAL
                 You get buckets of data and do stuff to
                  them
Code
 $in and $out are “bucket brigades”
  containing opaque “buckets” of data
 You can only touch buckets and
  brigades with the stream_bucket_*
  functions
 You get a bucket using
  stream_bucket_make_writeable
 Given a list of bad words (we’ll use the 7
  bad words), write a filter to remove them
  from text
 Given a commonly misspelled word, fix
  the spelling in the text
 I only did the bad words one, and
  created an extremely naïve regex that
  stripped the “bad” words from whatever
  text it finds.
 It buffers the entirety of the text before
  doing the replacement – this could be
  done by looking for word boundaries
  and doing it piecemeal to improve
  performance
1. What term is used to describe data
   handling in filters?
2. Name two built in filters you should be
   using and why.
3. What is the default mode filters are
   appended with?
4. What is the difference between
   appending and prepending a filter?
 http://php.net/streams
 http://php.net/filters
Putter about the network with me
   Socket
    › Bidirectional network stream that speaks a
      protocol
   Transport
    › Tells a network stream how to communicate
   Wrapper
    › Tells a stream how to handle specific
      protocols and encodings
 Network Stream, Network Transport,
  Socket Transport
 Slightly different behavior from a file
  stream
 Bi-directional data
   Sockets block
    › stream_set_blocking
    › stream_set_timeout
    › stream_select
 feof means “connection_closed”?
 huge reads or writes (think 8K)
 stream_get_meta_data is READ ONLY
 New APIS in streams and filesystem
  functions are replacements
 Extension is old and not really kept up to
  date (bit rot)
 Extension is more low level


 stream_socket_server
 stream_socket_client
 tcp
 udp
 unix
 udg
 SSL extension
    ›   ssl
    ›   sslv2
    ›   sslv3
    ›   tls
 Given two files of quotes, write a server
  with PHP streams methods to return
  random quotes, optionally allow client to
  pick which file to retrieve quotes from
 Given a simple tcp server that will return
  a random quote – make a client that
  pulls quotes for users
 socket_server.php – uses
  stream_socket_server and
  stream_accept
 socket_client.php – uses
  stream_socket_client and a bit of loop
  magic to make a little “cli” app
1. How is a socket different from a stream?
2. What transports does PHP provide by
   default?
3. Name the two most commonly used
   stream socket functions.
4. How can a user add additional
   transports to PHP?
 http://php.net/streams
 http://php.net/transports
 http://wikipedia.org/wiki/Unix_domain_s
  ocket
 http://tools.ietf.org/html/rfc1122
 Set of interfaces for streams
 Improved based filter class
 Wrappers for chmod and touch
 More tests!
 Any you have?
 http://emsmith.net
 http://joind.in/3439
 auroraeosrose@gmail.com
 IRC – freenode – auroraeosrose
 #php-gtk #coapp

Writing and using php streams and sockets tek11

  • 2.
     Idea originatingin 1950’s  Standard way to get Input and Output  A source or sink of data Definitions  C – stdin, stderr, stdout  C++ iostream Who uses them  Perl IO  Python io  Java  C#
  • 3.
    These are thepeople you can blame for the PHP streams implementation
  • 4.
     We willwrite code (in pairs)  There will be a quiz (with prizes)  You get out what you put in – participate! This is really 3 talks in one -  Streams  Filters  Sockets
  • 5.
  • 6.
     Access inputand output generically  Can write and read linearly  May or may not be seekable  Comes in chunks of data
  • 7.
     EVERYTHING  include/require_once  stream functions  file system functions  many other extensions
  • 8.
    Stream Contexts Stream Stream ALL IO Filter Wrapper
  • 9.
    Stream › Resource that exhibits a flow or succession of data  Wrapper › Tells a stream how to handle specific protocols and encodings  Context › A set of parameters and options to tell a stream (or filter) how to behave
  • 10.
    Scheme › The name of the wrapper to be used. file, http, https, ftp, etc.  Target › Depends on the wrapper, filesystem uses a string path name, ssh2 uses a PHP resource home/bar/foo.txt file:///home/bar/foo.txt http://www.example.com/foo.txt ftp://user:[email protected]/foo.txt php://filter/read=string.toupper|string.rot13/resource =http://www.example.com
  • 12.
     flock  wrapperlimitations  non-existent pointers (infinite loops can and will happen)  error handling
  • 13.
     Parameters  Options Modify or enhance a stream  stream_context_set_param  stream_context_set_option  stream_context_create
  • 15.
  • 16.
     file://  http:// ftp://  data://  glob://
  • 17.
    SSL  Phar › https:// › phar:// › ftps://  Zlib › ssl:// › compress.zlib:// › tls:// › zlib://  SSH  Bzip › ssh2.shell:// › compress.bz2:// › ssh2.exec:// › ssh2.tunnel:// › ssh2.sftp:// › ssh2.scp://
  • 21.
     Pipes  STDIN,STDOUT, STDERR  proc_open  popen
  • 22.
     php://stdin  php://stdout php://stderr  php://output  php://input  php://filter (5.0.0)  php://memory (5.1.0)  php://temp (5.1.0)
  • 24.
    1. Get a Feed from Flickr - http://www.flickr.com/services/feeds/ 2. No curl installed, allow_url_fopen is on 3. Display however you would like
  • 25.
    Grab the feedas xml, pop it through simplexml, loop and display the output to a webpage
  • 27.
  • 28.
     There areno interfaces  Implement as though there were an interface  Seekable is optional  Flushable is optional  Directory support is optional
  • 29.
     fopen  file_get_contents Information  Return true or false  $this->context will have any context metadata Code
  • 30.
    fread  fgets  file_get_contents Information  etc…  Return string data or false  $this->context will have any context metadata Code
  • 31.
     fwrite  file_put_contents Information  get in a string of data to deal with  return how many bytes you wrote Code
  • 32.
    feof  file_get_contents  fread Information  etc…  Return true or false  $this->context will have any context metadata Code
  • 33.
     fclose  file_get_contents Information  Don’t return anything  any cleanup should go here Code
  • 34.
     fstat callsstream_stat  EVERYTHING ELSE uses url_stat  Good idea to do both  Return an array of data identical to stat()
  • 35.
  • 36.
     mkdir  rmdir dir_closedir  dir_opendir  dir_readdir  dir_rewinddir
  • 37.
  • 38.
    Create a customwrapper for any kind of network or shared memory storage you want (except s3 which is way overdone) Implement at least the basics – extra points for more features
  • 39.
    Wrapper for wincache(btw, porting this to apc would be a breeze) Does basics + seek + flush (since we’re caching) + rename + unlink No directories
  • 40.
    Use Case land– when streams make sense
  • 41.
     Data ins3  Data locally during development  Easy switch out if alternative storage is ever desired  Storing image files
  • 42.
     Existing ZendFramework Code  Register the s3:// wrapper  Use a configuration setting for the stream to use for all images on the system
  • 43.
     Store andedit template files in a database  Have the snappiness of including from disk  Minimal Configuration
  • 44.
     db:// stream simple stream wrapper that looks for the template in the db, and writes it to the filesystem before returning the data  The cached location is FIRST in the include path, so if it fails, the db stream gets hit
  • 45.
     Talk tomercurial (hg binary)  hg communicates via command line  continue to pipe additional commands
  • 46.
     Use proc_opento keep a pipe to the binary going  Pass commands through stdin pipe as necessary  Abstract this out to other binaries that are used by the system
  • 47.
    1. Name 3Built in PHP streams. 2. What is a Context? A Wrapper? A Stream? 3. How do you identify a stream? 4. Name two extensions that provide additional PHP streams.
  • 48.
     http://php.net/streams  http://php.net/filesystem http://ciaranmcnulty.com/blog/2009/04/ simplifying-file-operations-using-php- stream-wrappers
  • 50.
    Because everyone needsto rot13 a file they open on the fly
  • 51.
     Performs operationson stream data  Can be prepended or appended (even on the fly)  Can be attached to read or write  When a filter is added for read and write, two instances of the filter are created.
  • 53.
     Data hasan input and output state  When reading in chunks, you may need to cache in between reads to make filters useful  Use the right tool for the job
  • 54.
    string filters › string.rot13 › string.toupper › string.tolower › string.strip_tags
  • 55.
    convert filters › convert.*  base64-encode  base64-decode  quoted-printable-encode  quoted-printable-decode  dechunk › decode remote HTTP chunked encoding streams  consumed › eats data (that’s all it does)
  • 56.
     bzip.compress andbzip.compress  convert.iconv.*  zlib.inflate and zlib.deflate  mcrypt.* and mdecrypt.*
  • 57.
     Extend aninternal class php_user_filter  It’s not abstract…  Yes that’s a horrible name  Remember this pre-dates php 5.0 decisions
  • 58.
     onCreate  basically a constructor  Called every time PHP needs a new filter Information (on every stream)  return true or false Code
  • 59.
    php_user_filter › $this->filtername › $this->params › $this->stream
  • 60.
     onClose  basically a destructor Information  no return Code
  • 61.
    MUST return › PSFS_PASS_ON › PSFS_FEED_ME Information › PSFS_ERR_FATAL  You get buckets of data and do stuff to them Code
  • 63.
     $in and$out are “bucket brigades” containing opaque “buckets” of data  You can only touch buckets and brigades with the stream_bucket_* functions  You get a bucket using stream_bucket_make_writeable
  • 64.
     Given alist of bad words (we’ll use the 7 bad words), write a filter to remove them from text  Given a commonly misspelled word, fix the spelling in the text
  • 65.
     I onlydid the bad words one, and created an extremely naïve regex that stripped the “bad” words from whatever text it finds.  It buffers the entirety of the text before doing the replacement – this could be done by looking for word boundaries and doing it piecemeal to improve performance
  • 67.
    1. What termis used to describe data handling in filters? 2. Name two built in filters you should be using and why. 3. What is the default mode filters are appended with? 4. What is the difference between appending and prepending a filter?
  • 68.
  • 69.
    Putter about thenetwork with me
  • 70.
    Socket › Bidirectional network stream that speaks a protocol  Transport › Tells a network stream how to communicate  Wrapper › Tells a stream how to handle specific protocols and encodings
  • 71.
     Network Stream,Network Transport, Socket Transport  Slightly different behavior from a file stream  Bi-directional data
  • 72.
    Sockets block › stream_set_blocking › stream_set_timeout › stream_select  feof means “connection_closed”?  huge reads or writes (think 8K)  stream_get_meta_data is READ ONLY
  • 73.
     New APISin streams and filesystem functions are replacements  Extension is old and not really kept up to date (bit rot)  Extension is more low level  stream_socket_server  stream_socket_client
  • 75.
     tcp  udp unix  udg  SSL extension › ssl › sslv2 › sslv3 › tls
  • 76.
     Given twofiles of quotes, write a server with PHP streams methods to return random quotes, optionally allow client to pick which file to retrieve quotes from  Given a simple tcp server that will return a random quote – make a client that pulls quotes for users
  • 77.
     socket_server.php –uses stream_socket_server and stream_accept  socket_client.php – uses stream_socket_client and a bit of loop magic to make a little “cli” app
  • 78.
    1. How isa socket different from a stream? 2. What transports does PHP provide by default? 3. Name the two most commonly used stream socket functions. 4. How can a user add additional transports to PHP?
  • 79.
     http://php.net/streams  http://php.net/transports http://wikipedia.org/wiki/Unix_domain_s ocket  http://tools.ietf.org/html/rfc1122
  • 80.
     Set ofinterfaces for streams  Improved based filter class  Wrappers for chmod and touch  More tests!  Any you have?
  • 81.
     http://emsmith.net  http://joind.in/3439 [email protected]  IRC – freenode – auroraeosrose  #php-gtk #coapp