PHP stream_wrapper_register
<?php
/**
* 引用:http://php.net/manual/en/function.stream-wrapper-register.php
* 把变量当成文件读写的协议
*
* Class VariableStream
*/
class VariableStream
{
private $postition; // 当前的位置
private $varname; // 变量的名字 /**
* 打开
*
* @param $path
* @param $mode
* @param $options
* @param $opened_path
* @return bool
*/
public function stream_open($path, $mode, $options, &$opened_path)
{
$url = parse_url($path); $this->varname = $url['host'];
$this->postition = 0; return true;
} /**
* 读取
*
* @param $count
* @return string
*/
public function stream_read($count)
{ $p = $this->postition;
$ret = substr($GLOBALS[$this->varname], $p,$count);
$p += $count;
return $ret;
} /**
* 写入
*
* @param $data
* @return int
*/
public function stream_write($data)
{
$v = &$GLOBALS[$this->varname];
$l = strlen($data);
$p = &$this->postition;
$v = substr($v,0,$p) .$data.substr($v,$p+=$l); return $l;
} /**
* 返回位置
*
* @return mixed
*/
public function stream_tell()
{
return $this->postition;
} /**
* 寻位
*
* @param $offset
* @param $whence
* @return bool
*/
public function stream_seek($offset, $whence)
{
$dp = $p = &$this->postition;
$l = strlen($GLOBALS[$this->varname]); switch($whence)
{
case SEEK_SET:
$p = 0;
break;
case SEEK_END:
$p = $l;
break;
default:
return false;
}
$p += $offset;
$ret = ($p >= 0 || $p <= $l);
if(!$ret)
$this->postition = $dp;
return $ret;
} public function stream_eof()
{
return strlen($GLOBALS[$this->varname])== $this->postition;
}
} // 撤销已注册的同名协议
if(in_array('var',stream_get_wrappers()))
{
stream_wrapper_unregister('var');
}
// 注册自己的协议
stream_wrapper_register('var','VariableStream') or die('Failed to register protocol'); $myvar = "";
$fp = fopen('var://myvar','r+');
if(!$fp){
die('Failed to open the file!');
}
$str = "Hello the world!";
fwrite($fp,$str,strlen($str)); echo 'The length of the string is ' .strlen($myvar) ."\n";
echo 'The value of variable ,$myvar,is :' .$myvar ."\n";
echo 'The position of the cursor is :' .ftell($fp) ."\n";
echo 'Is at the end of the file :' .(feof($fp) ? 'true':'false') ."\n";
if(fseek($fp,-16,SEEK_END))
{
echo 'Now,the position is :' .ftell($fp);
}
PHP stream_wrapper_register的更多相关文章
- 如何执行字符串的PHP代码
如何执行字符串的PHP代码 最近因项目需要,引出一个议题:如何执行字符串的php代码(php和html混写). 注:传统情况下,php代码存储在文件中,直接运行文件即可.以下讨论的情况是,如果php代 ...
- [转] 基于PHP Stream Wrapper开发有趣应用场景
PHP Stream Wrapper 原文:http://blog.sina.com.cn/s/blog_502c8cc40100k40e.html ,主要是基于SAE环境讲述相应的应用场景,本文经过 ...
- LFI、RFI、PHP封装协议安全问题学习
本文希望分享一些本地文件包含.远程文件包含.PHP的封装协议(伪协议)中可能包含的漏洞 相关学习资料 http://www.ibm.com/developerworks/cn/java/j-lo-lo ...
- LFI & RFI & PHP封装协议之安全问题研究
目录 . 文件包含的基本概念 . LFI(Local File Include) . RFI(Remote File Include) . PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来 ...
- PHP 支持的协议/封装协议列表
附录 L. 支持的协议/封装协议列表 目录 文件系统 Socket HTTP 和 HTTPS FTP 和 FTPS PHP 输入/输出流 压缩流 Secure Shell 2 音频流 以下是 PHP ...
- PHP类和函数注释大全
每次要用PHP的某个功能的时候,都要去查一下,于是决定将PHP所有类和函数都整理出来,加上注释 大致实现 将php.jar文件解压,取出目录stubs 将stubs中的所有php文件中的注释去掉,并做 ...
- LFI/RFI总结
目录 0×01 文件包含简介 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间.这意味着您可以创建供所有网页引用的标准页眉或菜单 ...
- GeSHi Documentation
GeSHi Documentation Version 1.0.8.11 Authors: © 2004 - 2007 Nigel McNie © 2007 - 2012 Benny Baumann ...
- PHP stream相关协议及上下文选项和参数归纳
支持的协议和封装协议 PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen(). copy(). file_exists() 和 filesize() 的文件系统函数. 除了这些封装协 ...
随机推荐
- mysql数据库事务隔离原理
今天在学习JDBC的时候看到了关于MySQL的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说 ...
- StringBuilder和StringBuffer的区别
Java中StringBuilder和StringBuffer的区别分析 StringBUilder是线程不安全的(线程同步访问的时候会出问题),但是效率相对较高. (String类型使用加号进行拼接 ...
- 漫谈Java中的OOPS
什么是OOPS? 面向对象编程是一种编程概念,其工作原理是对象是程序中最重要的部分.它允许用户创建他们想要的对象,然后创建处理这些对象的方法.操作这些对象以获得结果是面向对象编程的目标. 面向对象编程 ...
- 松软科技课堂:索引器计时器Timer
在.NET中有三种计时器:1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会 ...
- Thinkphp5.0 仿百度糯米 开发多商家 电商平台(完整版)
目录第1章 课程简介第2章 需求分析第3章 快速掌握thinkphp5第4章 任性的TP5模块第5章 生活服务分类管理模块第6章 百度地图应用封装第7章 打造属于TP5自己的发送邮件服务第8章 商户模 ...
- Session和Cookie的用法及区别
1. Session.Cookie是什么 1.1 概念理解 要了解session和cookie是什么,先要了解以下几个概念. 1.1.1 无状态的HTTP协议 协议:是指计算机通信网络中两台计算机之间 ...
- windows下安装vue教程
前言:前段时间学习了下vue,也算是能简单开发了,今天就记录下怎么通过vue-cli来安装vue. 因vue是基于node环境的,如果你还不会安装的话,可以看下我的这个教程:安装node.js和npm ...
- React学习笔记(持续更新)
2.2页面加载过程 1.资源加载过程:URL->DNS查询->资源请求->浏览器解析 ①URL结构:http://www.hhh.com:80/getdata?pid=1#title ...
- 简单python爬虫案例(爬取慕课网全部实战课程信息)
技术选型 下载器是Requests 解析使用的是正则表达式 效果图: 准备好各个包 # -*- coding: utf-8 -*- import requests #第三方下载器 import re ...
- [Next] 初见next.js
next 简介 Next.js 是一个轻量级的 React 服务端渲染应用框架 next 特点 默认情况下由服务器呈现 自动代码拆分可加快页面加载速度 简单的客户端路由(基于页面) 基于 Webpac ...