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() 的文件系统函数. 除了这些封装协 ...
随机推荐
- 自荐RedisViewer有情怀的跨平台Redis可视化客户端工具
# **自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer**[转载自 最美分享Coder 2019-09-17 06:31:00](https://www.toutiao.c ...
- 使用JAVA API获取hadoop集群的FileSystem
所需要配置的参数: Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs ...
- 大数据平台搭建 - Mysql在linux上的安装
一.简介 MySQL是一个关系型数据库系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 ...
- 360大牛 全面解读 PHP面试
360大牛全面解读PHP面试 第1章 课程介绍 让大家了解基本面试流程和面试的核心要求以及意义是什么并理解PHP面试考点主要以基础为核心,说明PHP面试考察范围. 第2章 PHP基础知识考察点 本章主 ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(一)系统状态监控
博客地址:http://www.moonxy.com 一.前言 如果你是一名 Linux 运维人员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.系统运行状态主要包括:系统负载.内存状态 ...
- Day 6 文件属性与命令执行流程
1. 第一列第一个字符 表示文件类型 rw-r--r-- 权限(下周) 4 这个文件被链接次数 root 文件的拥有者(用户) root 文件的拥有组(用户组 ==>家族) 2018 文 ...
- C#面试题目整理(一)
1.您在什么情况下会用到虚方法?它与接口有什么不同?当子类需要重新定义父类的一个方法时,父类的方法需要定义为虚方法:在定义接口的时候不能又方法体,但是虚方法可以有方法体,实现时,子类可以不实现父类的虚 ...
- 校园网打开IEEE 显示未登录
校园网访问IEEE 显示未登录,如图 解决办法 1.打开网络和共享中心 2.如图 3.把ipv6的钩去掉 4.把host文件(在C:\Windows\System32\drivers\etc)复制到桌 ...
- 解决mysql不能在查询A表的同时,更新A表的问题
方法: 运用中间表 UPDATE 表名 SET 字段名 = '' WHERE id in (SELECT a.id FROM (SELECT id FROM 表名 WHERE ISNULL(字段名)) ...
- vue中关于滚动条的那点事
vue中关于滚动条的那点事 不知道你有没有遇到过这种情况,有时当页面切换时,滚动条不在页面的顶端.最近半路加入一个项目,就遇到这种情况.(若只是为了解决此问题,可直接翻到最下方)下面谈谈解决此问题的过 ...