支持的协议和封装协议
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize()
的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
Note: 用于描述一个封装协议的 URL 语法仅支持 scheme://... 的语法。 scheme:/ 和 scheme: 语法是不支持的。
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
http://检测重定向后最终的 URL
- <?php
- $url = 'http://www.example.com/redirecting_page.php';
- $fp = fopen($url, 'r');
- $meta_data = stream_get_meta_data($fp);
- foreach ($meta_data['wrapper_data'] as $response) {
- /* 我们是否被重定向了? */
- if (strtolower(substr($response, 0, 10)) == 'location: ') {
- /* 更新我们被重定向后的 $url */
- $url = substr($response, 10);
- }
- }
- ?>
data:// — 数据(RFC 2397)
- <?php
- // 打印 "I love PHP"
- echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
- ?>
glob:// — 查找匹配的文件路径模式
- <?php
- // 循环 ext/spl/examples/ 目录里所有 *.php 文件
- // 并打印文件名和文件尺寸
- $it = new DirectoryIterator("glob://ext/spl/examples/*.php");
- foreach($it as $f) {
- printf("%s: %.1FK ", $f->getFilename(), $f->getSize()/1024);
- }
- ?>
php:// — 访问各个输入/输出流(I/O streams)
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://stdin, php://stdout 和 php://stderr
php://stdin、php://stdout 和
php://stderr 允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开 php://stdin
并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。 注意 PHP 在这方面的行为有很多 BUG 直到 PHP
5.2.1。 推荐你简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器。
php://stdin 是只读的, php://stdout 和 php://stderr 是只写的。
php://input
php://input 是个可以访问请求的原始数据的只读流。 POST
请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。
而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data
潜在需要更少的内存。 enctype="multipart/form-data"
的时候 php://input 是无效的。
Note: 在 PHP 5.6 之前 php://input
打开的数据流只能读取一次; 数据流不支持 seek 操作。 不过,依赖于 SAPI 的实现,请求体数据被保存的时候, 它可以打开另一个
php://input 数据流并重新读取。 通常情况下,这种情况只是针对 POST 请求,而不是其他请求方式,比如 PUT 或者
PROPFIND。
php://output
php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
php://fd
php://fd 允许直接访问指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。
php://memory 和 php://temp
php://memory 和 php://temp 是一个类似文件
包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp
会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置的决定和 sys_get_temp_dir() 的方式一致。
php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。
php://filter
php://filter 是一种元封装器,
设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和
file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。
php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。
php://filter 参数
名称 描述
resource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表>
任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
php://temp/maxmemory:
- <?php
- // Set the limit to 5 MB.
- $fiveMBs = 5 * 1024 * 1024;
- $fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
- fputs($fp, "hello ");
- // Read what we have written.
- rewind($fp);
- echo stream_get_contents($fp);
- ?>
php://filter/resource=<待过滤的数据流>:这个参数必须位于 php://filter 的末尾,并且指向需要过滤筛选的数据流。
- <?php
- /* 这简单等同于:
- readfile("http://www.example.com");
- 实际上没有指定过滤器 */
- readfile("php://filter/resource=http://www.example.com");
- ?>
php://filter/read=<读链需要应用的过滤器列表>:这个参数采用一个或以管道符 | 分隔的多个过滤器名称。
- <?php
- /* 这会以大写字母输出 www.example.com 的全部内容 */
- readfile("php://filter/read=string.toupper/resource=http://www.example.com");
- /* 这会和以上所做的一样,但还会用 ROT13 加密。 */
- readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
- ?>
php://filter/write=<写链需要应用的过滤器列表>:这个参数采用一个或以管道符 | 分隔的多个过滤器名称。
- <?php
- /* 这会通过 rot13 过滤器筛选出字符 "Hello World"
- 然后写入当前目录下的 example.txt */
- file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
- ?>
上下文(Context)选项和参数:
PHP 提供了多种上下文选项和参数,可用于所有的文件系统或数据流封装协议。上下文(Context)由
stream_context_create() 创建。选项可通过 stream_context_set_option() 设置,参数可通过
stream_context_set_params() 设置。
套接字上下文选项 — 套接字上下文选项列表
HTTP context 选项 — HTTP context 的选项列表
FTP context options — FTP context option listing
SSL 上下文选项 — SSL 上下文选项清单
CURL context options — CURL 上下文选项列表
Phar 上下文(context)选项 — Phar 上下文(context)选项列表
Context 参数 — Context 参数列表
套接字上下文选项
bindto
用户PHP访问网络的指定的IP地址(IPv4或IPv6其中的一个)和/或 端口号,这个语法是 ip:port. Setting the IP
backlog
Used to limit the number of outstanding connections in the socket's listen queue.
- <?php
- // connect to the internet using the '192.168.0.100' IP
- $opts = array(
- 'socket' => array(
- 'bindto' => '192.168.0.100:0',
- ),
- );
- // connect to the internet using the '192.168.0.100' IP and port '7000'
- $opts = array(
- 'socket' => array(
- 'bindto' => '192.168.0.100:7000',
- ),
- );
- // connect to the internet using port '7000'
- $opts = array(
- 'socket' => array(
- 'bindto' => '0:7000',
- ),
- );
- // create the context...
- $context = stream_context_create($opts);
- // ...and use it to fetch the data
- echo file_get_contents('http://www.example.com', false, $context);
- ?>
SSL 上下文选项
ssl:// 和 tls:// 传输协议上下文选项清单。
peer_name string
要连接的服务器名称。如果未设置,那么服务器名称将根据打开 SSL 流的主机名称猜测得出。
verify_peer boolean
是否需要验证 SSL 证书。
默认值为 FALSE.
verify_peer_name boolean
Require verification of peer name.
默认值为 TRUE.
allow_self_signed boolean
是否允许自签名证书。需要配合 verify_peer 参数使用(注:当 verify_peer 参数为 true 时才会根据 allow_self_signed 参数值来决定是否允许自签名证书)。
默认值为 FALSE
cafile string
当设置 verify_peer 为 true 时, 用来验证远端证书所用到的 CA 证书。 本选项值为 CA 证书在本地文件系统的全路径及文件名。
capath string
如果未设置 cafile,或者 cafile 所指的文件不存在时,
会在 capath 所指定的目录搜索适用的证书。 该目录必须是已经经过哈希处理的证书目录。 (注:所谓 hashed certificate
目录是指使用类似 c_rehash 命令将目录中的 .pem 和 .crt
文件扫描并提取哈希码,然后根据此哈希码创建文件链接,以便于快速查找证书)
local_cert string
本地证书路径。 必须是 PEM 格式,并且包含本地的证书及私钥。 也可以包含证书颁发者证书链。
passphrase string
local_cert 文件的密码。
CN_match string
期望远端证书的 CN 名称。 PHP 会进行有限的通配符匹配, 如果服务器给出的 CN 名称和本地访问的名称不匹配,则视为连接失败。
Note: 在PHP 5.6.0中,这个选项已废弃,替换为 peer_name。
verify_depth integer
如果证书链条层次太深,超过了本选项的设定值,则终止验证。
默认情况下不限制证书链条层次深度。
ciphers string
设置可用的密码列表。 可用的值参见: » ciphers(1)。
默认值为 DEFAULT.
capture_peer_cert boolean
如果设置为 TRUE 将会在上下文中创建 peer_certificate 选项, 该选项中包含远端证书。
capture_peer_cert_chain boolean
如果设置为 TRUE 将会在上下文中创建 peer_certificate_chain 选项, 该选项中包含远端证书链条。
SNI_enabled boolean
设置为 TRUE 将启用服务器名称指示(server name indication)。 启用 SNI 将允许同一 IP 地址使用多个证书。
SNI_server_name string
如果设置此参数,那么其设置值将被视为 SNI 服务器名称。 如果未设置,那么服务器名称将基于打开 SSL 流的主机名称猜测得出。
Note: 在PHP 5.6.0中,这个选项已废弃,替换为 peer_name。
disable_compression boolean
如果设置,则禁用 TLS 压缩,有助于减轻恶意攻击。
peer_fingerprint string | array
当远程服务器证书的摘要和指定的散列值不相同的时候, 终止操作。
当使用 string 时, 会根据字符串的长度来检测所使用的散列算法:“md5”(32 字节)还是“sha1”(40 字节)。
当使用 array 时, 数组的键表示散列算法名称,其对应的值是预期的摘要值。
从一个活动连接中打开字节流:
- <?php
- $session = ssh2_connect('example.com', 22);
- ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
- '/home/username/.ssh/id_rsa', 'secret');
- $stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
- ?>
CURL上下文选项
CURL 上下文选项在 CURL 扩展被编译(通过 --with-curlwrappers configure选项)时可用
method string
GET,POST,或者其他远程服务器支持的 HTTP 方法。
默认为 GET.
header string
额外的请求标头。这个值会覆盖通过其他选项设定的值(如: User-agent:,Host:, ,Authentication:)。
user_agent string
设置请求时 User-Agent 标头的值。
默认为 php.ini 中的 user_agent 设定。
content string
在头部之后发送的额外数据。这个选项在 GET 和 HEAD 请求中不使用。
proxy string
URI,用于指定代理服务器的地址(例如 tcp://proxy.example.com:5100)。
max_redirects integer
最大重定向次数。1 或者更小则代表不会跟随重定向。
默认为 20.
curl_verify_ssl_host boolean
校验服务器。
默认为 FALSE
Note:
这个选项在 HTTP 和 FTP 协议中均可使用。
curl_verify_ssl_peer boolean
要求对使用的SSL证书进行校验。
默认为 FALSE
Note:
这个选项在 HTTP 和 FTP 协议中均可使用。
获取一个页面,并以POST发送数据
- <?php
- $postdata = http_build_query(
- array(
- 'var1' => 'some content',
- 'var2' => 'doh'
- )
- );
- $opts = array('http' =>
- array(
- 'method' => 'POST',
- 'header' => 'Content-type: application/x-www-form-urlencoded',
- 'content' => $postdata
- 'timeout' => 1
- )
- );
- $context = stream_context_create($opts);
- $result = file_get_contents('http://example.com/submit.php', false, $context);
- ?>
HTTP context 选项
提供给 http:// 和 https:// 传输协议的 context 选项。 transports.
method string
远程服务器支持的 GET,POST 或其它 HTTP 方法。
默认值是 GET。
header string
请求期间发送的额外 header 。在此选项的值将覆盖其他值 (诸如 User-agent:, Host: 和 Authentication:)。
user_agent string
要发送的 header User-Agent: 的值。如果在上面的 header context 选项中没有指定 user-agent,此值将被使用。
默认使用 php.ini 中设置的 user_agent。
content string
在 header 后面要发送的额外数据。通常使用POST或PUT请求。
proxy string
URI 指定的代理服务器的地址。(e.g. tcp://proxy.example.com:5100).
request_fulluri boolean
当设置为 TRUE 时,在构建请求时将使用整个 URI 。(i.e. GET http://www.example.com/path/to/file.html HTTP/1.0)。 虽然这是一个非标准的请求格式,但某些代理服务器需要它。
默认值是 FALSE.
follow_location integer
跟随 Location header 的重定向。设置为 0 以禁用。
默认值是 1。
max_redirects integer
跟随重定向的最大次数。值为 1 或更少则意味不跟随重定向。
默认值是 20。
protocol_version float
HTTP 协议版本。
默认值是 1.0。
Note:
PHP 5.3.0 以前的版本没有实现分块传输解码。 如果此值设置为 1.1 ,与 1.1 的兼容将是你的责任。
timeout float
读取超时时间,单位为秒(s),用 float 指定(e.g. 10.5)。
默认使用 php.ini 中设置的 default_socket_timeout。
ignore_errors boolean
即使是故障状态码依然获取内容。
默认值为 FALSE.
忽略重定向并获取 header 和内容
- <?php
- $url = "http://www.example.org/header.php";
- $opts = array('http' =>
- array(
- 'method' => 'GET',
- 'max_redirects' => '0',
- 'ignore_errors' => '1'
- )
- );
- $context = stream_context_create($opts);
- $stream = fopen($url, 'r', false, $context);
- // header information as well as meta data
- // about the stream
- var_dump(stream_get_meta_data($stream));
- // actual data at $url
- var_dump(stream_get_contents($stream));
- fclose($stream);
- ?>