stream-php-streamwrapper-php-example-1-0

  • Examples
  • Example class registered as stream wrapper

  • Example class registered as stream wrapper
  • Example class registered as stream wrapper

    Example class registered as stream wrapper

    The example below implements a var:// protocol
    handler that allows read/write access to a named global variable
    using standard filesystem stream functions such as fread(). The var:// protocol implemented
    below, given the URL “var://foo” will read/write data to/from
    $GLOBALS[“foo”].

    Example #1 A Stream for reading/writing global
    variables

    <?php

    class VariableStream {
        var 
    $position;
        var 
    $varname;

        function stream_open($path$mode$options, &$opened_path)
        {
            
    $url parse_url($path);
            
    $this->varname $url["host"];
            
    $this->position 0;

            return true;
        }

        function stream_read($count)
        {
            
    $ret substr($GLOBALS[$this->varname], $this->position$count);
            
    $this->position += strlen($ret);
            return 
    $ret;
        }

        function stream_write($data)
        {
            
    $left substr($GLOBALS[$this->varname], 0$this->position);
            
    $right substr($GLOBALS[$this->varname], $this->position strlen($data));
            
    $GLOBALS[$this->varname] = $left $data $right;
            
    $this->position += strlen($data);
            return 
    strlen($data);
        }

        function stream_tell()
        {
            return 
    $this->position;
        }

        function stream_eof()
        {
            return 
    $this->position >= strlen($GLOBALS[$this->varname]);
        }

        function stream_seek($offset$whence)
        {
            switch (
    $whence) {
                case 
    SEEK_SET:
                    if (
    $offset strlen($GLOBALS[$this->varname]) && $offset >= 0) {
                         
    $this->position $offset;
                         return 
    true;
                    } else {
                         return 
    false;
                    }
                    break;

                case SEEK_CUR:
                    if (
    $offset >= 0) {
                         
    $this->position += $offset;
                         return 
    true;
                    } else {
                         return 
    false;
                    }
                    break;

                case SEEK_END:
                    if (
    strlen($GLOBALS[$this->varname]) + $offset >= 0) {
                         
    $this->position strlen($GLOBALS[$this->varname]) + $offset;
                         return 
    true;
                    } else {
                         return 
    false;
                    }
                    break;

                default:
                    return false;
            }
        }

        function stream_metadata($path$option$var
        {
            if(
    $option == STREAM_META_TOUCH) {
                
    $url parse_url($path);
                
    $varname $url["host"];
                if(!isset(
    $GLOBALS[$varname])) {
                    
    $GLOBALS[$varname] = '';
                }
                return 
    true;
            }
            return 
    false;
        }
    }

    stream_wrapper_register("var""VariableStream")
        or die(
    "Failed to register protocol");

    $myvar "";

    $fp fopen("var://myvar""r+");

    fwrite($fp"line1\n");
    fwrite($fp"line2\n");
    fwrite($fp"line3\n");

    rewind($fp);
    while (!
    feof($fp)) {
        echo 
    fgets($fp);
    }
    fclose($fp);
    var_dump($myvar);

    ?>

    The above example will output:

    line1
    line2
    line3
    string(18) "line1
    line2
    line3
    "