Skip to content
This repository has been archived by the owner on Feb 11, 2018. It is now read-only.

Example

Andrey F. Mindubaev edited this page May 2, 2013 · 3 revisions

Put example.php to document root with installed Composer and run.

example.php

<?php

  require_once "vendor/autoload.php";

  /**
   * Function is used in code below |
   *                                v
   * Log files status
   * - Add file to Log-list
   * - Show status
   * - Remove file from Log-list if it is not exists any more
   */
  function logWrapperFS()
  {
    static $counter = 0, $files = array();

    $counter++;

    $newfiles = func_get_args();
    foreach ($newfiles as $filename) {
      if (!in_array($filename, $files)) {
        $files[] = $filename;
      }
    }

    foreach ($files as $key => $filename) {
      $pos = strpos($filename, "://");
      if ($pos !== false && !in_array(substr($filename, 0, $pos), stream_get_wrappers())) {
        continue;
      }
      if (file_exists($filename)) {
        if (is_file($filename)) {
          $content = " == '" . file_get_contents($filename) . "'";
        } else {
          $content = " == DIR";
        }
      } else {
        $content = " (not exists)";
        unset($files[$key]);
      }
      echo sprintf('%1$03d: %2$s%3$s', $counter, $filename, $content) . "\n";
    }
    echo "\n";
  }

  /**
   * Init check
   */
  $dir0_0 = "./dir1";
  if (file_exists($dir0_0) && !@rmdir($dir0_0)) {
    die("Please delete './dir1'");
  }

  /**
   * Create './file1.txt'
   */
  $filename0_0 = "./file1.txt";
  if (!@file_put_contents($filename0_0, "qwerty")) {
    die("Could not create file './file1.txt'");
  }

  /**
   * File './file1.txt' exists
   * File contains 'qwerty'
   */
  logWrapperFS($filename0_0);
  //  001: ./file1.txt == 'qwerty'

  /**
   * Register Virtual File System
   */
  JooS\Stream\Wrapper_FS::register("virtual-fs1", __DIR__);
  $filename1_0 = "virtual-fs1://file1.txt";

  /**
   * Virtual file 'virtual-fs://file1.txt' exists
   */
  logWrapperFS($filename1_0);
  //  002: ./file1.txt == 'qwerty'
  //  002: virtual-fs1://file1.txt == 'qwerty'

  /**
   * Create virtual directory, rename virtual file
   */
  $dir1_0 = "virtual-fs1://dir1";
  mkdir($dir1_0);
  $filename1_1 = "virtual-fs1://dir1/file2.txt";
  rename($filename1_0, $filename1_1);

  /**
   * Real file './file1.txt' still exists
   */
  logWrapperFS($dir1_0, $filename1_1);
  //  003: ./file1.txt == 'qwerty'
  //  003: virtual-fs1://file1.txt (not exists)
  //  003: virtual-fs1://dir1 == DIR
  //  003: virtual-fs1://dir1/file2.txt == 'qwerty'

  /**
   * Put new contents to renamed virtual file
   */
  file_put_contents($filename1_1, "asdf");

  /**
   * Real file is still the same
   * New virtual file contains 'asdf'
   */
  logWrapperFS();
  //  004: ./file1.txt == 'qwerty'
  //  004: virtual-fs1://dir1 == DIR
  //  004: virtual-fs1://dir1/file2.txt == 'asdf'

  /**
   * Commit changes
   */
  JooS\Stream\Wrapper_FS::commit("virtual-fs1");

  $dir0_1 = "./dir1";
  $filename0_1 = "./dir1/file2.txt";

  /**
   * Real file './file1.txt' was moved to new real directory
   * New real file contains 'asdf'
   * Virtual file is still the same
   */
  logWrapperFS($dir0_1, $filename0_1);
  //  005: ./file1.txt (not exists)
  //  005: virtual-fs1://dir1 == DIR
  //  005: virtual-fs1://dir1/file2.txt == 'asdf'
  //  005: ./dir1 == DIR
  //  005: ./dir1/file2.txt == 'asdf'

  /**
   * Delete virtual file and directory
   */
  unlink($filename1_1);
  rmdir($dir1_0);

  /**
   * New real file exists
   * Virtual file and directory deleted
   */
  logWrapperFS();
  //  006: virtual-fs1://dir1 (not exists)
  //  006: virtual-fs1://dir1/file2.txt (not exists)
  //  006: ./dir1 == DIR
  //  006: ./dir1/file2.txt == 'asdf'

  /**
   * Unregister stream wrapper
   * Cancel all changes after last commit
   */
  JooS\Stream\Wrapper_FS::unregister("virtual-fs1");

  /**
   * PHP stream unregistered, virtual files are not exists
   * New real file still contains 'asdf'
   */
  logWrapperFS();
  //  007: ./dir1 == DIR
  //  007: ./dir1/file2.txt == 'asdf'

  /**
   * Cleanup
   */
  unlink($filename0_1);
  rmdir($dir0_1);

  /**
   * All files deleted
   */
  logWrapperFS($filename0_0);
  //  008: ./dir1 (not exists)
  //  008: ./dir1/file2.txt (not exists)
  //  008: ./file1.txt (not exists)
?>
Clone this wiki locally