php中流的访问

访问流

PHP用户空间中所有的文件I/O处理都是通过php 4.3引入的php流包装层处理的. 在内部, 扩展代码可以选择使用stdio或posix文件处理和本地文件系统或伯克利域套接字进行通信, 或者也可以调用和用户空间流I/O相同的API.

流的概览

通常, 直接的文件描述符相比调用流包装层消耗更少的CPU和内存; 然而, 这样会将实现某个特定协议的所有工作都堆积到作为扩展开发者的你身上. 通过挂钩到流包装层, 你的扩展代码可以透明的使用各种内建的流包装, 比如HTTP, FTP, 以及它们对应的SSL版本, 另外还有gzip和bzip2压缩包装. 通过include特定的PEAR或PECL模块, 你的代码还可以访问其他协议, 比如SSH2, WebDav, 甚至是Gopher!

本章将介绍内部基于流工作的基础API. 后面到第16章"有趣的流"中, 我们将看到诸如应用过滤器, 使用上下文选项和参数等高级概念.

打开流

尽管是一个统一的API, 但实际上依赖于所需的流的类型, 有四种不同的路径去打开一个流. 从用户空间角度来看, 这四种不同的类别如下(函数列表只代表示例, 不是完整列表):

<?php
    /* fopen包装
     * 操作文件/URI方式指定远程文件类资源 */
    $fp = fopen($url, $mode);
    $data = file_get_contents($url);
    file_put_contents($url, $data);
    $lines = file($url);  

    /* 传输
     * 基于套接字的顺序I/O */
    $fp = fsockopen($host, $port);
    $fp = stream_socket_client($uri);
    $fp = stream_socket_server($uri, $options);  

    /* 目录流 */
    $dir = opendir($url);
    $files = scandir($url);
    $obj = dir($url);  

    /* "特殊"的流 */
    $fp = tmpfile();
    $fp = popen($cmd);
    proc_open($cmd, $pipes);
?>

无论你打开的是什么类型的流, 它们都存储在一个公共的结构体php_stream中.

fopen包装

我们首先从实现fopen()函数开始. 现在你应该已经对创建扩展骨架很熟悉了, 如果还不熟悉, 请回到第5章"你的第一个扩展"复习一下, 下面是我们实现的fopen()函数:

PHP_FUNCTION(sample5_fopen)
{
    php_stream *stream;
    char *path, *mode;
    int path_len, mode_len;
    int options = ENFORCE_SAFE_MODE | REPORT_ERRORS;  

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
            &path, &path_len, &mode, &mode_len) == FAILURE) {
        return;
    }
    stream = php_stream_open_wrapper(path, mode, options, NULL);
    if (!stream) {
        RETURN_FALSE;
    }
    php_stream_to_zval(stream, return_value);
}

php_stream_open_wrapper()的目的应该是完全绕过底层. path指定要读写文件名或URL, 读写行为依赖于mode的值.

options是位域的标记值集合, 这里是设置为下面介绍的一组固定值:

USE_PATH将php.ini文件中的include_path应用到相对路径上. 内建函数fopen()在指定第三个参数为TRUE时将会设置这个选项.

STREAM_USE_URL设置这个选项后, 将只能打开远端URL. 对于php://, file://, zlib://, bzip2://这些URL包装器并不认为它们是远端URL.

ENFORCE_SAFE_MODE尽管这个常量这样命名, 但实际上设置这个选项后仅仅是启用了安全模式(php.ini文件中的safe_mode指令)的强制检查. 如果没有设置这个选项将导致跳过safe_mode的检查(不论INI设置中safe_mode如何设置)

REPORT_ERRORS在指定的资源打开过程中碰到错误时, 如果设置了这个选项则将产生错误报告.

STREAM_MUST_SEEK对于某些流, 比如套接字, 是不可以seek的(随机访问); 这类文件句柄, 只有在特定情况下才可以seek. 如果调用作用域指定这个选项, 并且包装器检测到它不能保证可以seek, 将会拒绝打开这个流.

STREAM_WILL_CAST如果调用作用域要求流可以被转换到stdio或posix文件描述符, 则应该给open_wrapper函数传递这个选项, 以保证在I/O操作发生之前就失败STREAM_ONLY_GET_HEADERS标识只需要从流中请求元数据. 实际上这是用于http包装器, 获取http_response_headers全局变量而不真正的抓取远程文件内容.

STREAM_DISABLE_OPEN_BASEDIR类似safe_mode检查, 不设置这个选项则会检查INI设置open_basedir, 如果指定这个选项则可以绕过这个默认的检查

STREAM_OPEN_PERSISTENT告知流包装层, 所有内部分配的空间都采用持久化分配, 并将关联的资源注册到持久化列表中.

IGNORE_PATH如果不指定, 则搜索默认的包含路径. 多数URL包装器都忽略这个选项.

IGNORE_URL提供这个选项时, 流包装层只打开本地文件. 所有的is_url包装器都将被忽略.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 函数
, fopen
, safe_mode
, 检查
, Stream模块
包装
访问php中方法、php模拟浏览器访问、php统计访问量代码、nginx访问php变成下载、php访问url,以便于您获取更多的相关知识。

时间: 2024-09-17 04:29:18

php中流的访问的相关文章

php扩展和嵌入式编程基础

php的生命周期详解 php变量的研究 php内存管理详解 安装构建php环境 编写第一个php扩展 php函数的返回值 php扩展函数接受参数 php如何在数组和哈希表上工作 PHP的资源数据类型 php4的对象详解 详解php5对象 详解php的启动过程 php的INI设置 php中流的访问 php中流的实现 php中有趣的流 php源代码的配置和链接 php的扩展自动生成 设置嵌入php的宿主环境 php的高级嵌入式

使用.NET访问 Internet(1) Paul

Microsoft .NET 框架提供 Internet 服务的分层的.可扩展的和托管的实现,您可以将这些 Internet 服务快速而轻松地集成到您的应用程序中.您的应用程序可建立在可插接式协议的基础之上以便自动利用新的 Internet 协议,或者它们可以使用 Windows 套接字接口的托管实现来使用套接字级别上的网络. 介绍可插接式协议 Microsoft .NET 框架提供分层的.可扩展的和托管的 Internet 服务实现,您可以将它们快速而轻松地集成到您的应用程序中.System.

解决win7系统唤醒休眠状态出现“拒绝访问”错误的方法

  windows休眠状态是指将所有运行的实时数据存储到硬盘上,并且关闭一切不必要的硬件从而节省电量,无论你所使用的windows是哪个版本,系统都能够让用户自动进入休眠状态,当然在你没有关闭休眠功能的前提下,不过在近期有部分win7用户反映,将系统从休眠状态唤醒时,出现"拒绝访问"的错误,对于该问题我们如何解决呢?下面看为您带来的解决方法! 解决win7系统唤醒休眠状态出现"拒绝访问"错误的方法 第一步.进入Win7系统后,我们在键盘中按"Win+R&q

win7系统下无法访问xp系统的共享怎么办?

  win7系统下无法访问xp系统的共享怎么办?: 1.双击打开"网上邻居",然后单击左侧的"设置家庭或小型办公网络": 2.单击两次"下一步"之后,如果通过无线网络连接的办公网络,则勾选"忽略已断开的网络硬件"后,单击"下一步":

访问本页面 您的浏览器需要支持JavaScript的解决办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 百度site:首页出现"访问本页面,您的浏览器需要支持JavaScript".这样的情况,对于一个刚刚引起搜索引擎重视的新站来说是相当大的打击,需要尽快找出原因跟解决办法. 首先分析原因,用站长工具模拟搜索引擎蜘蛛抓取,结果却是"访问本页面,您的浏览器需要支持JavaScript".用谷歌管理员工具中实

win7系统桌面所有文件都无法重命名提示“目标文件夹访问被拒绝”如何解决

  win7系统桌面所有文件都无法重命名提示"目标文件夹访问被拒绝"如何解决 具体步骤: 1.打开"计算机",定位到C:UsersAdministratorDesktop ; 2.在空白处单击右键,选择"属性"; 3.在"安全"标签中点击"编辑"按钮; 4.选择你登录的帐户名如:Administrator,将"用户名"权限设置"完全控制"后面的"允许&quo

电脑中通过IIS访问svc出错提示无法提供网页的解决方法

  1.以管理员身份运行PowerShell; 2.输入命令get-windowsfeature,并按回车键查看到.Net framework 4.5的"HTTP 激活"显示未安装; 3.输入命令进行安装:Add-WindowsFeature -name NET-WCF-HTTP-Activation45; 4.再次通过命令get-windowsfeature查看安装后的结果,然后再次访问svc时,便可正常打开了.

QQ浏览器不能访问银行网站怎么办

  最近,不少QQ浏览器的用户们都在反映,为什么QQ浏览器打不开一行网站?为什么QQ浏览器不能访问银行网站?用浏览器我们经常会访问各种网站包括银行网站,但在使用QQ浏览器去访问的时候却发现不能够访问银行网站,这时怎么回事呢,我们应该要怎样才能够正常访问银行网站呢?下面小编为大家介绍一下QQ浏览器访问银行网站的方式. QQ浏览器不能访问银行网站怎么办 QQ浏览器不能访问银行网站的原因可能是因为内核的兼容性,所以我们需要将QQ浏览器调成IE渲染模式,方法就是带开一个网页在空白处右键,将高速渲染模式切

win7系统休眠状态却提示“拒绝访问”该怎么办

  休眠状态是windows系统的一种省电模式,但win7 64位系统进入休眠状态后所运行的实时数据都会暂时储存到硬盘中,并且关闭不需要的硬件,这样就可以延长硬件的使用寿命,也能不关闭电脑达到最佳省电状态,当我们要唤醒系统时也是非常简单,只要移动鼠标或按下键盘任何键就可以轻松实现.在系统进入休眠状态被唤醒时出错并提示"拒绝访问"窗口,这给我们操作系统带来一定的麻烦,出现这种故障现象其实可以通过命令来修复,具体解决方法如下: 1.在键盘中按"Win+R"组合键打开运行