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() 的文件系统函数. 除了这些封装协 ...
随机推荐
- Charles 下载
本文参考:Charles 下载 Charles 下载 当前最新的版本是v4.2.8:官网下载页面:https://www.charlesproxy.com/latest-release/downloa ...
- Javaweb设置session过期时间
在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时 ...
- 松软科技课堂:SQL--RIGHTJOIN关键字
发布时间:2019/3/15 9:27:31 SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name ...
- ssh免密码登陆(集群多台机器之间免密码登陆)
1. 首先在配置hosts文件(每台机器都要) 进入root权限 vi /etc/hosts 添加每台机器的ip + 主机名,例如: 172.18.23.201 hadoop1 172.18.23.1 ...
- [Linux] Linux下undefined reference to ‘pthread_create’问题解决
问题的原因:pthread不是Linux下的默认的库,也就是在链接的时候,无法找到phread库中函数的入口地址,于是链接会失败. 解决:在gcc编译的时候,附加要加 -lpthread参数即可解决.
- 【linux】【docker】docker私服安装
前言 系统环境:Centos7.jdk1.8 docker私服:可以把项目通过dockerfile文件build成docker镜像,供其他环境拉取.部署在本地,私有化. 安装 dockerHUB私服 ...
- 使用file_get_contents() 发送GET、POST请求
服务器端执行HTTP请求,大家经常使用的就是CURL,curl工具的确是很好的数据文件传输工具,那么除此之外还有其他的工具能实现这个功能吗? 现在为你介绍一个很常见的工具 file_get_conte ...
- MybatisPlus报错Invalid bound statement (not found)的解决方案
今天使用MybatisPlus,测试时报错Invalid bound statement (not found) 使用自定义的mapper接口中的方法可以执行,而调用MybatisPlus中baseM ...
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- JS的运动1(从简单到复杂运动,从单一属性到多属性同时进行的运动过程分析)
js运动原理 运动基础 在js中,让一个元素动起来的最简单的方式,就是点击按钮,让元素移动.下面是一个简单的案例:(下面几个案例的的html和css都是采用这个为例) <!DOCTYPE htm ...