理解 PHP 中的 Streams,理解phpstreams
理解 PHP 中的 Streams,理解phpstreams
Streams 是PHP提供的一个强有力的工具,我们常常在不经意会使用到它,如果善加利用将大大提高PHP的生产力。 驾驭Streams的强大力量后,应用程序将提升到一个新的高度。
下面是PHP手册中对Streams的一段描述:
<p>Streams 是在PHP 4.3.0版本被引入的,它被用于统一文件、网络、数据压缩等类文件的操作方式,为这些类文件操作提供了一组通用的函数接口。简而言之,一个stream就是一个具有流式行为的资源对象。也就是说,我们可以用线性的方式来对stream进行读取和写入。并且可以用使用fseek()来跳转到stream内的任意位置。</p>
每个Streams对象都有一个包装类,在包装中可以添加处理特殊协议和编码的相关代码。PHP中已经内置了一些常用的包装类,我们也可以创建和注册自定义的包装类。我们甚至能够使用现有的context和filter对包装类进行修改和增强。
Stream 基础知识
Stream 可以通过
PHP默认的包装类是file://,也就是说我们在访问文件系统的时候,其实就是在使用一个stream。我们可以通过下面两种方式来读取文件中的内容,readfile('/path/to/somefile.txt')或者readfile('file:///path/to/somefile.txt'),这两种方式是等效的。如果你是使用readfile('http://google.com/'),那么PHP会选取HTTP stream包装类来进行操作。
正如上文所述,PHP提供了不少内建的包转类,protocol以及filter。 按照下文所述的方式,可以查询到本机所支持的包装类:
1 2 3 4 |
<?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());
|
在我机器上的输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Array
(
[0] => tcp
[1] => udp
[2] => unix
[3] => udg
[4] => ssl
[5] => sslv3
[6] => sslv2
[7] => tls
)
Array
(
[0] => https
[1] => ftps
[2] => compress.zlib
[3] => compress.bzip2
[4] => php
[5] => file
[6] => glob
[7] => data
[8] => http
[9] => ftp
[10] => zip
[11] => phar
)
Array
(
[0] => zlib.*
[1] => bzip2.*
[2] => convert.iconv.*
[3] => string.rot13
[4] => string.toupper
[5] => string.tolower
[6] => string. strip_tags
[7] => convert.*
[8] => consumed
[9] => dechunk
[10] => mcrypt.*
[11] => mdecrypt.*
)
|
提供的功能非常多,看上去还不错吧?
除了上述内建的Stream,我们还可以为 Amazon S3, MS Excel, Google Storage, Dropbox 甚至Twitter编写更多的第三方的Stream。
php:// 包装类
PHP中内建了本语言用于处理I/O stream的包装类。可以分为几类,基础的有php://stdin,php://stdout, 以及php://stderr,这3个stream分别映射到默认 的I/O资源。同时PHP还提供了php://input,通过这个包装类可以使用只读的方式访问POST请求中的raw body。 这是一项非常有用的功能,特别是在处理那些将数据负载嵌入到POST请求中的远程服务时。
下面我们使用cURL工具来做一个简单的测试:
1 |
curl -d "Hello World" -d "foo=bar&name=John" <a href="</code"><code class="php string">"http://localhost/dev/streams/php_input.php" >http://localhost/dev/streams/php_input.php
|
在PHP脚本中使用print_r($_POST)的测试结果如下所示:
1 2 3 4 5 |
Array
(
[foo] => bar
[name] => John
)
|
我们注意$_POST array中是无法访问到第一项数据的。但是如果我们使用readfile('php://input'),结果就不同了:
1 |
Hello World&foo=bar&name=John
|
PHP 5.1又增加了php://memory和php://tempstream这两个包转类,用于读写临时数据。正如包装类命名中所暗示的,这些数据被存储在底层系统中的内存或者临时文件中。
php://filter是一个元包装类,用于为stream增加filter功能。在使用readfile()或者file_get_contents()/stream_get_contents()打开stream时,filter将被使能。下面是一个例子:
1 2 3 4 5 6 |
<?php
// Write encoded data
file_put_contents ( "php://filter/write=string.rot13/resource=file:///path/to/somefile.txt" , "Hello World" );
// Read data and encode/decode
readfile( "php://filter/read=string.toupper|string.rot13/resource=http://www.google.com" );
|
在第一个例子中使用了一个filter来对保存到磁盘中的数据进行编码处理,在二个例子中,使用两个级联的filter来从远端的URL读取数据。使用filter能为你的应用带来极为强大的功能。
Stream上下文
context是一组stream相关的参数或选项,使用context可以修改或增强包装类的行为。例如使用context来修改HTTP包装器是一个常用到的使用场景。 这样我们就可以不使用cURL工具,就能完成一些简单的网络操作。下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php
$opts = array (
'http' => array (
'method' => "POST" ,
'header' => "Auth: SecretAuthTokenrn" .
"Content-type: application/x-www-form-urlencodedrn" .
"Content-length: " . strlen ( "Hello World" ),
'content' => 'Hello World'
)
);
$default = stream_context_get_default( $opts );
readfile( 'http://localhost/dev/streams/php_input.php' );
|
首先要定义一个options array,这是个二位数组,可以通过$array['wrapper']['option_name']的形式来访问其中的参数。(注意每个包装类中context的options是不同的)。然后调用stream_context_get_default()来设置这些option,stream_context_get_default()同时还会将默认的context作为结果返回回来。设置完成后,接下来调用readfile(),就会应用刚才设置好的context来抓取内容。
在上面的例子中,内容被嵌入到request的body中,这样远端的脚本就可以使用php://input来读取这些内容。同时,我们还能使用apache_request_headers()来获取request的header,如下所示:
1 2 3 4 5 6 7 |
Array
(
[Host] => localhost
[Auth] => SecretAuthToken
[Content-type] => application/x-www-form-urlencoded
[Content-length] => 11
)
|
在上面的例子中是修改默认context的参数,当然我们也可以创建一个新的context,进行交替使用。
1 2 3 |
<?php
$alternative = stream_context_create( $other_opts );
readfile( 'http://localhost/dev/streams/php_input.php' , false, $alternative );
|
结论
我们怎样在现实世界中驾驭stream的强大力量呢?使用stream能为我们的程序带来什么现实的好处? 正如前文介绍的那样,stream对所有文件系统相关的功能进行了抽象,所以我第一个想到的应用场景是使用虚拟文件系统的包装类来访问PaaS供应商提供的服务,比如说访问HeroKu或者AppFog,它们实际上都没有真正文件系统。 使用stream只要对我们的应用程序稍作修改,就可以将其移植到云端。 接下来--在我的下一篇文章中--我将介绍如何编写自定义的包装类以实现对特殊文件格式和编码格式的操作。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











iis는 Microsoft Windows를 기반으로 Microsoft에서 제공하는 기본 인터넷 서비스이기 때문에 Linux에서는 사용할 수 없습니다. Windows 운영 체제 플랫폼에서 개발되었으므로 Windows 운영 체제에서만 실행하도록 제한됩니다.

우리 모두 알고 있듯이 파일이 사용 중이면 다른 프로세스가 해당 파일에 액세스하거나 변경할 수 없습니다. 이 경우 프로세스가 파일을 열려고 하면 운영 체제는 다른 프로세스가 해당 파일을 수정하지 못하도록 파일을 잠급니다. “다른 프로세스에서 사용 중이기 때문에 해당 프로세스에서 파일에 액세스할 수 없습니다.”는 Windows 컴퓨터에서 많은 사용자가 관찰하는 오류 메시지입니다. 이 오류는 WindowsOS와 WindowsServer의 다른 버전에서 발생하는 것으로 알려져 있습니다. 일반적으로 이 오류 메시지는 사용자의 Windows PC에서 Netsh 명령을 사용할 때 나타납니다. 이 오류가 발생하는 또 다른 상황은 IIS(인터넷 정보 서비스) M을 실행하려고 할 때입니다.

먼저 공식 홈페이지에 가서 소프트웨어 패키지를 다운로드하고 압축을 풀어보세요. 중국어 nginx 구성에서는 경로 문제가 발생하지 않는 것이 가장 좋습니다. Windows에서는 파일 경로를 "\", "\\"로 구분할 수 있습니다. 또는 "/" 기호. 하지만 "\"는 문제를 일으킬 가능성이 가장 높으므로 사용하지 않는 것이 좋습니다. 경로를 추가하지 마십시오. 그렇지 않으면 구성 파일 경로를 찾을 수 없습니다. 예를 들어, e 드라이브에 압축을 풀면 cmd 명령은 nginx.exe가 있는 폴더인 cde:\worksoftware\를 찾습니다. nginx-1.10.1을 실행한 후 먼저 nginx.conf 파일을 확인합니다. 실제로 nginx의 가장 중요하고 주요한 작업은 구성 파일이며 다른 것은 없습니다.

IIS에서 응용 프로그램 풀을 열려면: 1. IIS 관리자를 엽니다. 2. "응용 프로그램 풀" 노드로 이동합니다. 3. 대상 응용 프로그램 풀을 마우스 오른쪽 버튼으로 클릭하고 "관리"를 선택합니다. 4. "고급 설정" 탭을 클릭합니다. . 여기에서 애플리케이션 풀 구성을 확인하고 수정할 수 있습니다.

웹사이트 개발에 PHP를 사용할 때 문자 인코딩 문제가 발생할 수 있습니다. 특히 다른 웹 서버를 사용하는 경우 IIS와 Apache가 문자 인코딩을 다르게 처리하는 것을 볼 수 있습니다. IIS를 사용하면 UTF-8 인코딩을 사용할 때 잘못된 문자가 나타날 수 있지만 Apache를 사용할 때는 문제 없이 모든 것이 잘 작동합니다. 이 상황은 어떻게 해결되어야 할까요?

HTML 파일을 URL로 변환하려면 다음 단계를 포함하는 웹 서버가 필요합니다. 웹 서버를 얻습니다. 웹 서버를 설정합니다. HTML 파일을 업로드하세요. 도메인 이름을 만듭니다. 요청을 라우팅합니다.

iis 시작 실패에 대한 해결 방법: 1. 시스템 파일의 무결성을 확인합니다. 3. 관련 서비스를 시작합니다. 5. Windows 시스템을 재설정합니다. 8. 운영 체제 및 응용 프로그램을 업데이트하십시오. 9. 불필요한 소프트웨어를 너무 많이 설치하지 마십시오. 10. 중요한 데이터를 정기적으로 백업하십시오. 자세한 소개: 1. 시스템 파일의 무결성을 확인하고, 시스템 파일 검사 도구를 실행하고, 시스템 파일의 무결성을 확인하는 등의 작업을 수행합니다.

예, IIS 로그 파일을 삭제할 수 있습니다. 제거에는 IIS 관리자를 통해 웹 사이트 또는 응용 프로그램 풀을 선택하고 로그 파일 탭에서 로그 파일을 삭제하는 작업이 포함됩니다. 명령 프롬프트를 사용하여 로그 파일 저장 디렉터리(일반적으로 %SystemRoot%\System32\LogFiles\W3SVC1)로 이동한 후 del 명령을 사용하여 로그 파일을 삭제합니다. Log Parser와 같은 타사 도구를 사용하여 로그 파일을 자동으로 삭제합니다.
