介绍

在PHP中,"伪协议" 是一种特殊的协议,它并不涉及传统的网络传输,而是用于访问特定的PHP功能或资源。这些伪协议通常以 php:// 开头,并用于操作数据流、内存、进程的输入输出等。

常见的PHP伪协议

input、output

php://input: 只读流,用于读取原始的POST数据。可以多次读取并返回相同的内容。

$data = file_get_contents('php://input');

php://output: 可写流,用于向输出缓冲区写入数据。通常用于直接输出内容到浏览器。

$output = fopen('php://output', 'w');
fwrite($output, "Hello World");
fclose($output);

memory、temp

php://memory: 使用内存作为临时文件进行读写操作的流。在内存中保存数据,关闭流后数据将丢失。

php://temp: 类似于php://memory,但超过一定大小(默认2MB)后,数据将自动存储到磁盘的临时文件中。

$stream = fopen('php://memory', 'w+');
fwrite($stream, 'Some data');
rewind($stream); // 使文件位置指针重新定位到文件的开始位置
echo stream_get_contents($stream);
fclose($stream);

stdin、stdout、stderr

php://stdin: 只读流,允许访问PHP进程的标准输入。适用于从命令行或其他输入源读取数据。

$input = fgets(fopen('php://stdin', 'r')); // 读取一行
$input = file_get_contents('php://stdin'); // 读取整个输入 // 命令行交互获取姓名
echo "Please enter your name: ";
$name = trim(fgets(fopen('php://stdin', 'r')));
echo "Hello, $name!\n";

php://stdout: 可写流,允许访问PHP进程的标准输出。适用于命令行或其他输出目标写入数据。 输出数据到命令行或者将输出数据重定向到文件或其他进程。

fwrite(fopen('php://stdout', 'w'), "This message is displayed in the terminal.\n");

php://stderr: 可写流,允许访问PHP进程的标准错误输出。适用于向命令行或其他错误流目标写入错误消息。输出错误或警告信息,以便与标准输出区分开来。

fwrite(fopen('php://stderr', 'w'), "This is an error message.\n");

proc_open配合标准输入输出,执行简单shell命令

这段代码中,$descriptorspec对应的数组就分别打开了stdin,stdout,stderr。在执行command命令时,可与终端交互。

// 要执行的命令
$command = "ls -l"; // 指定要打开的管道和文件句柄
$descriptorspec = array(
0 => array("pipe", "r"), // stdin 标准输入,子进程从此管道读取数据
1 => array("pipe", "w"), // stdout 标准输出,子进程向此管道写入数据
2 => array("pipe", "w"), // stderr 标准错误,子进程向此管道写入错误信息
); // 用于接收打开的管道句柄
$pipes = array(); // 打开子进程
$process = proc_open($command, $descriptorspec, $pipes); // 检查子进程是否打开成功
if ($process === false) {
echo "Error opening process";
exit;
} // 关闭标准输入管道
fclose($pipes[0]); // 读取标准输出管道的内容
$output = stream_get_contents($pipes[1]); // 关闭标准输出管道
fclose($pipes[1]); // 获取子进程的退出代码
$return_value = proc_close($process); // 输出标准输出的内容
echo "Output: $output"; // 输出子进程的退出代码
echo "Return value: $return_value";

其他常见的PHP封装协议

file:// — 访问本地文件系统

允许读取和写入本地文件系统的文件。使用file://可以打开和操作文件,就像在文件路径前面加上file://一样。

fopen('file:///path/to/file.txt', 'r');

http:// 和 https:// — 访问HTTP(S) URLs

用于通过HTTP或HTTPS协议从远程服务器读取数据,类似于浏览器访问网页的方式。可以使用它来执行GET、POST请求等。

fopen('http://example.com', 'r');

ftp:// 和 ftps:// — 访问FTP(S) URLs

用于通过FTP协议从远程服务器上传或下载文件。支持匿名访问和带有用户名密码的认证。

fopen('ftp://user:password@ftp.example.com/file.txt', 'r');

zlib:// — 压缩流

提供对gzip压缩文件的读写操作。常用于处理压缩数据。

fopen('compress.zlib://example.gz', 'r');

data:// — 数据(基于RFC 2397)

允许内联数据作为文件资源来使用。data://协议通常用于处理base64编码的数据。

fopen('data://text/plain;base64,SGVsbG8gd29ybGQ=', 'r');

glob:// — 查找匹配的文件路径模式

用于根据指定的文件模式查找匹配的文件路径。类似于Linux的glob命令。

foreach (glob('glob://*.txt') as $filename) { echo $filename; }

phar:// — PHP归档

用于访问PHP归档文件(PHAR文件)中的内容。支持类似于ZIP的压缩文件结构。有些SDK使用该协议来打包和分发代码。

fopen('phar://archive.phar/file.txt', 'r');

ssh2:// — Secure Shell 2

提供通过SSH协议访问远程服务器的能力。适用于通过SSH传输文件或执行命令。

fopen('ssh2://username@hostname/path/to/file.txt', 'r');

rar:// — RAR

用于访问RAR压缩文件中的内容。适合处理RAR压缩包的文件提取。

fopen('rar://archive.rar/file.txt', 'r');

ogg:// — 音频流

用于读取Ogg格式的音频流。通常在音频处理应用中使用。

fopen('ogg://stream.ogg', 'r');

expect:// — 处理交互式的流

用于处理交互式命令行操作。可以在PHP脚本中控制和操作交互式命令。

fopen('expect://command', 'r');

PHP伪协议(PHP://、Pseudo-Protocols)和其他常用协议的更多相关文章

  1. Java Web学习总结(21)——http协议响应状态码大全以及常用状态码

    http协议响应状态码大全以及常用状态码 当我们在浏览网页或是在查看服务器日志时,常会遇到3位数字的状态码,这3位数字是什么意思呢?其实,这3位数字是HTTP状态码,用来表示网页服务器HTTP响应状态 ...

  2. 协议的分用以及wireshark对协议的识别

    在TCP/IP详解一书中谈到了协议的分用,书中的图1-8如上.图1-8可以很好地解释在互联网的分层结构中,底层的协议头是如何承载上层的不同的协议的.对于链路层而言,以太网首部中有不同帧类型用于表示以太 ...

  3. IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。

    IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMA ...

  4. Samba 服务使用的端口和协议(是一组TCP UDP协议的组合,主要使用CIFS协议,有一个Java例子)

    Samba服务所使用的端口和协议: 1)Port 137 (UDP) - NetBIOS 名字服务 : nmbd 2)Port 138 (UDP) - NetBIOS 数据报服务 3)Port 139 ...

  5. TR069协议向导——一个帮助你了解TR069协议的简明教程(一)

    您也能够到下面地址下载: http://download.csdn.net/source/993034 1.为什么须要TR069    随着VoIP.IPTV等越来越多IP终端设备的普及(尤其在家庭中 ...

  6. SuperSocket入门(五)-常用协议实现模版及FixedSizeReceiveFilter示例

             Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包,分包就难以避免.SuperSocket内置了命令行 ...

  7. 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧

    串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...

  8. IP协议号 IP首部中有8位协议号,用于指明IP的上层协议.

    IP协议号   IP首部中有8位协议号,用于指明IP的上层协议. 0 HOPOPT IPv6 逐跳选项 1 ICMP Internet 控制消息 2 IGMP Internet 组管理 3 GGP 网 ...

  9. IPSec协议;IPv6为何增加对IPSec协议的支持

      IPSec由一系列的协议组成,除IP层的协议完全结构外,还包括了AH.ESP.ISAKMP.ISAKMP的因特网IP安全解释域.IKE.OAKLEY密钥协议确定等.ESP和AH定义协议.载荷头的格 ...

  10. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

随机推荐

  1. 对国产AI计算框架要有一定的包容力——记“mindspore”使用过程中的“不良反应”

    看mindspore的官方文档,居然有502错误,恶心到了: 打开Eager模式的链接,报错:

  2. 附038.Kubernetes_v1.30.3高可用部署架构二

    部署组件 该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm .kubelet .kubectl. kubeadm介绍 Kubeadm 为构建 Kubernete ...

  3. Pintia 天梯地图 dijkstra进阶

    7-14 天梯地图 - SMU 2024 spring 天梯赛3(补题) (pintia.cn) dijkstra进阶做法,包含路径记录,以及按权重统计路径条件等; 不过最开始我一直将优先队列开的最大 ...

  4. CH05_数组

    CH05_数组 概述 定义:一组相同类型的数据的集合. 描述: 1.数组中的每个元素都是相同的数据类型 2.数组是由连续的内存位置组成的. 3.数组索引是从0开始 一维数组 语法: 1.数据类型 数组 ...

  5. c++高效位运算函数之 __builtin_

    https://www.cnblogs.com/tldr/p/11288935.html int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比 ...

  6. 瑞芯微 | 如何固定以太口地址为指定ip?ifplugd妙用

    rxw的RK3568的evb1公板,有2个以太口, 默认UI界面只能配置eth0,无法配置eth1, 实际应用中,有时需要一旦有网线插入,就需要该地址设置为指定IP地址. 本文介绍2个最简单的方法实现 ...

  7. OpenPCDet复现过程记录

    0.前言 OpenPCDet项目之前我就复现过,一个很优秀的项目,这几天又需要用到这个项目,再次复现遇到了不少问题,特此记录复现的流程 1.环境准备 1.1.前置条件 以下是我安装的版本 CUDA 1 ...

  8. 聊一聊 C# 中让人惶恐的 Bitmap

    一:背景 1. 讲故事 在.NET高级调试的旅程中,我常常会与 Bitmap 短兵相接,它最大的一个危害就是会让程序抛出匪夷所思的 OutOfMemoryException,也常常会让一些.NET开发 ...

  9. Visual Studio Code 配置文件关联

    在编写 Linux 的 .service 文件的时候,我发现 .service 文件的本质是 INI 文件.然而 VS Code 却并没有使用 INI 格式进行语法高亮.于是我通过如下设置使 VS C ...

  10. 一个小小空格问题引起的bug

    程序员会遇到一种情况,一个bug排查到最后是由一个很小的问题导致的.在昨天的日常搬砖中遇到一个问题,耽搁了我大半天的时间,最后查明原因让我很无语. 首先介绍一下背景,我是做算法模型训练,目前手上的工作 ...