php-doc-en/appendices/wrappers.xml
Nuno Lopes 4075e438c3 fix
git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@151810 c90b9560-bf6c-de11-be94-00142212c4b1
2004-02-19 16:06:56 +00:00

772 lines
24 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Revision: 1.36 $ -->
<appendix id="wrappers">
<title>List of Supported Protocols/Wrappers</title>
<para>
The following is a list of the various URL style protocols that
PHP has built-in for use with the filesystem functions such as
<function>fopen</function> and <function>copy</function>.
In addition to these wrappers, as of <literal>PHP 4.3.0</literal>, you can write
your own wrappers using PHP script and
<function>stream_wrapper_register</function>.
</para>
<section id="wrappers.file">
<title>Filesystem</title>
<simpara>All versions of PHP. Explicitly using <filename>file://</filename> since <literal>PHP 4.3.0</literal></simpara>
<itemizedlist>
<listitem><simpara><filename>/path/to/file.ext</filename></simpara></listitem>
<listitem><simpara><filename>relative/path/to/file.ext</filename></simpara></listitem>
<listitem><simpara><filename>fileInCwd.ext</filename></simpara></listitem>
<listitem><simpara><filename>C:/path/to/winfile.ext</filename></simpara></listitem>
<listitem><simpara><filename>C:\path\to\winfile.ext</filename></simpara></listitem>
<listitem><simpara><filename>\\smbserver\share\path\to\winfile.ext</filename></simpara></listitem>
<listitem><simpara><filename>file:///path/to/file.ext</filename></simpara></listitem>
</itemizedlist>
<simpara>
<filename>file://</filename> is the default wrapper used with PHP and represents the local filesystem.
When a relative path is specified (a path which does not begin with /, \, \\, or a windows drive letter)
the path provided will be applied against the current working directory. In many cases this is the
directory in which the script resides unless it has been changed. Using the CLI sapi, this defaults
to the directory from which the script was called.
</simpara>
<simpara>
With some functions, such as <function>fopen</function> and <function>file_get_contents</function>,
<literal>include_path</literal> may be optionally searched for relative paths as well.
</simpara>
<para>
<table>
<title>Wrapper Summary</title>
<tgroup cols="2">
<thead>
<row>
<entry>Attribute</entry>
<entry>Supported</entry>
</row>
</thead>
<tbody>
<row>
<entry>Restricted by <literal>allow_url_fopen</literal>.</entry>
<entry>No</entry>
</row>
<row>
<entry>Allows Reading</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Writing</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Appending</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Simultaneous Reading and Writing</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>stat</function></entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>unlink</function></entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>rename</function></entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>mkdir</function></entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>rmdir</function></entry>
<entry>Yes</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section id="wrappers.http">
<title>HTTP and HTTPS</title>
<simpara>PHP 3, PHP 4. <filename>https://</filename> since <literal>PHP 4.3.0</literal></simpara>
<itemizedlist>
<listitem><simpara><filename>http://example.com</filename></simpara></listitem>
<listitem><simpara><filename>http://user:password@example.com</filename></simpara></listitem>
<listitem><simpara><filename>https://example.com</filename></simpara></listitem>
<listitem><simpara><filename>https://user:password@example.com</filename></simpara></listitem>
</itemizedlist>
<simpara>Allows read-only access to files/resources via HTTP 1.0,
using the HTTP GET method. A <literal>Host:</literal> header is sent with the request
to handle name-based virtual hosts. If you have configured
a <link linkend="ini.user-agent">user_agent</link> string using
your ini file or the stream context, it will also be included
in the request.
</simpara>
&warn.ssl-non-standard;
<simpara>
Redirects have been supported since PHP 4.0.5; if you are using
an earlier version you will need to include trailing slashes in
your URLs. If it's important to know the URL of the resource where
your document came from (after all redirects have been processed),
you'll need to process the series of response headers returned by the
stream.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
/* Prior to PHP 4.3.0 use $http_response_header
instead of stream_get_meta_data() */
foreach(stream_get_meta_data($fp) as $response) {
/* Were we redirected? */
if (substr(strtolower($response), 0, 10) == 'location: ') {
/* update $url with where we were redirected to */
$url = substr($response, 10);
}
}
?>
]]>
</programlisting>
</informalexample>
<simpara>
The stream allows access to the <emphasis>body</emphasis> of
the resource; the headers are stored in the
<varname>$http_response_header</varname> variable.
Since <literal>PHP 4.3.0</literal>, the headers are available using
<function>stream_get_meta_data</function>.
</simpara>
<simpara>
HTTP connections are read-only; you cannot write data or copy
files to an HTTP resource.
</simpara>
<note>
<simpara>HTTPS is supported starting from <literal>PHP 4.3.0</literal>, if you
have compiled in support for OpenSSL.
</simpara>
</note>
<para>
<table>
<title>Wrapper Summary</title>
<tgroup cols="2">
<thead>
<row>
<entry>Attribute</entry>
<entry>Supported</entry>
</row>
</thead>
<tbody>
<row>
<entry>Restricted by <literal>allow_url_fopen</literal>.</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Reading</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Writing</entry>
<entry>No</entry>
</row>
<row>
<entry>Allows Appending</entry>
<entry>No</entry>
</row>
<row>
<entry>Allows Simultaneous Reading and Writing</entry>
<entry>N/A</entry>
</row>
<row>
<entry>Supports <function>stat</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>unlink</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>rename</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>mkdir</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>rmdir</function></entry>
<entry>No</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>Context options (as of <literal>PHP 5.0.0</literal>)</title>
<tgroup cols="3">
<thead>
<row>
<entry>Name</entry>
<entry>Usage</entry>
<entry>Default</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>method</literal></entry>
<entry>
<constant>GET</constant>, <constant>POST</constant>, or
any other HTTP method supported by the remote server.
</entry>
<entry><constant>GET</constant></entry>
</row>
<row>
<entry><literal>header</literal></entry>
<entry>Additional headers to be sent during request. Values
in this option will override other values (such as
<literal>User-agent:</literal>, <literal>Host:</literal>,
and <literal>Authentication:</literal>).
</entry>
<entry></entry>
</row>
<row>
<entry><literal>user_agent</literal></entry>
<entry>Value to send with User-Agent: header. This value will
only be used if user-agent is <emphasis>not</emphasis> specified
in the <literal>header</literal> context option above.
</entry>
<entry>
&php.ini; setting: <literal>user_agent</literal>
</entry>
</row>
<row>
<entry><literal>content</literal></entry>
<entry>
Additional data to be sent after the headers. Typically used
with POST or PUT requests.
</entry>
<entry></entry>
</row>
<row>
<entry><literal>proxy</literal></entry>
<entry>
URI specifying address of proxy server. (e.g.
<literal>tcp://proxy.example.com:5100</literal> ).
</entry>
<entry></entry>
</row>
<row>
<entry><literal>request_fulluri</literal></entry>
<entry>
When set to &true;, the entire URI will be used when
constructing the request. (i.e.
<literal>GET http://www.example.com/path/to/file.html HTTP/1.0</literal>).
While this is a non-standard request format, some
proxy servers require it.
</entry>
<entry>&false;</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<title>Underlying socket stream context options</title>
<simpara>
Additional context options may be supported by the
<link linkend="transports.inet">underlying transport</link>
For <literal>http://</literal> streams, refer to context
options for the <literal>tcp://</literal> transport. For
<literal>https://</literal> streams, refer to context options
for the <literal>ssl://</literal> transport.
</simpara>
</note>
</section>
<section id="wrappers.ftp">
<title>FTP and FTPS</title>
<simpara>PHP 3, PHP 4. <filename>ftps://</filename> since <literal>PHP 4.3.0</literal></simpara>
<itemizedlist>
<listitem><simpara><filename>ftp://example.com/pub/file.txt</filename></simpara></listitem>
<listitem><simpara><filename>ftp://user:password@example.com/pub/file.txt</filename></simpara></listitem>
<listitem><simpara><filename>ftps://example.com/pub/file.txt</filename></simpara></listitem>
<listitem><simpara><filename>ftps://user:password@example.com/pub/file.txt</filename></simpara></listitem>
</itemizedlist>
<simpara>
Allows read access to existing files and creation of new files
via FTP. If the server does not support passive mode ftp, the
connection will fail.
</simpara>
<simpara>
You can open files for either reading or writing, but not both
simultaneously. If the remote file already exists on the ftp
server and you attempt to open it for writing but have not specified
the context option <literal>overwrite</literal>, the connection
will fail. If you need to overwrite existing files over ftp,
specify the <literal>overwrite</literal> option in the context
and open the file for writing. Alternatively, you can
use the <link linkend="ref.ftp">FTP extension</link>.
</simpara>
<note>
<title>Appending</title>
<simpara>
As of <literal>PHP 5.0.0</literal> files may be appended via the
<literal>ftp://</literal> URL wrapper. In prior versions, attempting
to append to a file via <literal>ftp://</literal> will result in failure.
</simpara>
</note>
<simpara>
<filename>ftps://</filename> was introduced in <literal>PHP 4.3.0</literal>.
It is the same as <filename>ftp://</filename>,
but attempts to negotiate a secure connection with the ftp server.
If the server does not support SSL, then the connection falls back
to regular unencrypted ftp.
</simpara>
<note>
<simpara>FTPS is supported starting from <literal>PHP 4.3.0</literal>, if you
have compiled in support for OpenSSL.
</simpara>
</note>
<para>
<table>
<title>Wrapper Summary</title>
<tgroup cols="3">
<thead>
<row>
<entry>Attribute</entry>
<entry><literal>PHP 4</literal></entry>
<entry><literal>PHP 5</literal></entry>
</row>
</thead>
<tbody>
<row>
<entry>Restricted by <literal>allow_url_fopen</literal>.</entry>
<entry>Yes</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Reading</entry>
<entry>Yes</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Writing</entry>
<entry>Yes (new files only)</entry>
<entry>Yes (new files/existing files with <parameter>overwrite</parameter>)</entry>
</row>
<row>
<entry>Allows Appending</entry>
<entry>No</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Simultaneous Reading and Writing</entry>
<entry>No</entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>stat</function></entry>
<entry>No</entry>
<entry>
<function>filesize</function>, <function>filetype</function>,
<function>file_exists</function>, <function>is_file</function>,
and <function>is_dir</function> elements only.
</entry>
</row>
<row>
<entry>Supports <function>unlink</function></entry>
<entry>No</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>rename</function></entry>
<entry>No</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>mkdir</function></entry>
<entry>No</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Supports <function>rmdir</function></entry>
<entry>No</entry>
<entry>Yes</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
<table>
<title>Context options (as of <literal>PHP 5.0.0</literal>)</title>
<tgroup cols="3">
<thead>
<row>
<entry>Name</entry>
<entry>Usage</entry>
<entry>Default</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>overwrite</literal></entry>
<entry>
Allow overwriting of already existing files on remote server.
Applies to write mode (uploading) only.
</entry>
<entry>&false; (Disabled)</entry>
</row>
<row>
<entry><literal>resume_pos</literal></entry>
<entry>
File offset at which to begin transfer.
Applies to read mode (downloading) only.
</entry>
<entry>0 (Beginning of File)</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<title>Underlying socket stream context options</title>
<simpara>
Additional context options may be supported by the
<link linkend="transports.inet">underlying transport</link>
For <literal>ftp://</literal> streams, refer to context
options for the <literal>tcp://</literal> transport. For
<literal>ftps://</literal> streams, refer to context options
for the <literal>ssl://</literal> transport.
</simpara>
</note>
</section>
<section id="wrappers.php">
<title>PHP input/output streams</title>
<simpara>
<literal>PHP 3.0.13</literal> and up, <filename>php://output</filename>
and <filename>php://input</filename> since <literal>PHP 4.3.0</literal>,
<filename>php://filter</filename> since <literal>PHP 5.0.0</literal>
</simpara>
<itemizedlist>
<listitem><simpara><filename>php://stdin</filename></simpara></listitem>
<listitem><simpara><filename>php://stdout</filename></simpara></listitem>
<listitem><simpara><filename>php://stderr</filename></simpara></listitem>
<listitem><simpara><filename>php://output</filename></simpara></listitem>
<listitem><simpara><filename>php://input</filename></simpara></listitem>
<listitem><simpara><filename>php://filter</filename></simpara></listitem>
</itemizedlist>
<simpara>
<filename>php://stdin</filename>, <filename>php://stdout</filename>
and <filename>php://stderr</filename> allow access to
the corresponding input or output stream of the PHP process.
</simpara>
<simpara>
<filename>php://output</filename> allows you to write to the
output buffer mechanism in the same way as
<function>print</function> and <function>echo</function>.
</simpara>
<simpara>
<filename>php://input</filename> allows you to read raw POST data.
It is a less memory intensive alternative to
<varname>$HTTP_RAW_POST_DATA</varname> and does not need any
special &php.ini; directives.
</simpara>
<simpara>
<filename>php://stdin</filename> and
<filename>php://input</filename> are read-only, whereas
<filename>php://stdout</filename>,
<filename>php://stderr</filename> and
<filename>php://output</filename> are write-only.
</simpara>
<simpara>
<filename>php://filter</filename> is a kind of meta-wrapper designed
to permit the application of filters to a stream at the time of
opening. This is useful with all-in-one file functions such as
<function>readfile</function>, <function>file</function>, and
<function>file_get_contents</function> where there is otherwise
no opportunity to apply a filter to the stream prior the contents
being read.
</simpara>
<simpara>
The <filename>php://filter</filename> target takes the following
&apos;parameters&apos; as parts of its &apos;path&apos;.
</simpara>
<itemizedlist>
<listitem>
<para>
<literal>/resource=&lt;stream to be filtered&gt;</literal>
(<emphasis>required</emphasis>) This parameter must be located at
the end of your <filename>php://filter</filename> specification and
should point to the stream which you want filtered.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* This is equivalent to simply:
readfile("http://www.example.com");
since no filters are actually specified */
readfile("php://filter/resource=http://www.example.com");
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
<listitem>
<para>
<literal>/read=&lt;filter list to apply to read chain&gt;</literal>
(<emphasis>optional</emphasis>) This parameter takes one or more
filternames separated by the pipe character <literal>|</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* This will output the contents of
www.example.com entirely in uppercase */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* This will do the same as above
but will also ROT13 encode it */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
<listitem>
<para>
<literal>/write=&lt;filter list to apply to write chain&gt;</literal>
(<emphasis>optional</emphasis>) This parameter takes one or more
filternames separated by the pipe character <literal>|</literal>.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
/* This will filter the string "Hello World"
through the rot13 filter, then write to
example.txt in the current directory */
file_set_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
]]>
</programlisting>
</informalexample>
</para>
</listitem>
<listitem>
<simpara>
<literal>/&lt;filter list to apply to both chains&gt;</literal>
(<emphasis>optional</emphasis>) Any filter lists which are not
prefixed specifically by <literal>read=</literal> or
<literal>write=</literal> will be applied to both the read and
write chains (as appropriate).
</simpara>
</listitem>
</itemizedlist>
<para>
<table>
<title>
Wrapper Summary (For <literal>php://filter</literal>,
refer to summary of wrapper being filtered.)
</title>
<tgroup cols="2">
<thead>
<row>
<entry>Attribute</entry>
<entry>Supported</entry>
</row>
</thead>
<tbody>
<row>
<entry>Restricted by <literal>allow_url_fopen</literal>.</entry>
<entry>No</entry>
</row>
<row>
<entry>Allows Reading</entry>
<entry>
<literal>php://stdin</literal> and
<literal>php://input</literal> only.
</entry>
</row>
<row>
<entry>Allows Writing</entry>
<entry>
<literal>php://stdout</literal>,
<literal>php://stderr</literal>, and
<literal>php://output</literal> only.
</entry>
</row>
<row>
<entry>Allows Appending</entry>
<entry>
<literal>php://stdout</literal>,
<literal>php://stderr</literal>, and
<literal>php://output</literal> only. (Equivalent to writing)
</entry>
</row>
<row>
<entry>Allows Simultaneous Reading and Writing</entry>
<entry>No. These wrappers are unidirectional.</entry>
</row>
<row>
<entry>Supports <function>stat</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>unlink</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>rename</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>mkdir</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>rmdir</function></entry>
<entry>No</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
<section id="wrappers.compression">
<title>Compression Streams</title>
<simpara><filename>zlib:</filename> PHP 4.0.4 - PHP 4.2.3 (systems with fopencookie only)</simpara>
<simpara><filename>compress.zlib://</filename> and <filename>compress.bzip2://</filename> PHP 4.3.0 and up</simpara>
<itemizedlist>
<listitem><simpara><filename>zlib:</filename></simpara></listitem>
<listitem><simpara><filename>compress.zlib://</filename></simpara></listitem>
<listitem><simpara><filename>compress.bzip2://</filename></simpara></listitem>
</itemizedlist>
<simpara>
<filename>zlib:</filename> works like <function>gzopen</function>, except that the
stream can be used with <function>fread</function> and the other
filesystem functions. This is deprecated as of <literal>PHP 4.3.0</literal> due
to ambiguities with filenames containing ':' characters; use
<filename>compress.zlib://</filename> instead.
</simpara>
<simpara>
<filename>compress.zlib://</filename> and
<filename>compress.bzip2://</filename> are equivalent to
<function>gzopen</function> and <function>bzopen</function>
respectively, and operate even on systems that do not support
fopencookie.
</simpara>
<para>
<table>
<title>Wrapper Summary</title>
<tgroup cols="2">
<thead>
<row>
<entry>Attribute</entry>
<entry>Supported</entry>
</row>
</thead>
<tbody>
<row>
<entry>Restricted by <literal>allow_url_fopen</literal>.</entry>
<entry>No</entry>
</row>
<row>
<entry>Allows Reading</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Writing</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Appending</entry>
<entry>Yes</entry>
</row>
<row>
<entry>Allows Simultaneous Reading and Writing</entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>stat</function></entry>
<entry>
No, use the normal <literal>file://</literal> wrapper
to stat compressed files.
</entry>
</row>
<row>
<entry>Supports <function>unlink</function></entry>
<entry>
No, use the normal <literal>file://</literal> wrapper
to unlink compressed files.
</entry>
</row>
<row>
<entry>Supports <function>rename</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>mkdir</function></entry>
<entry>No</entry>
</row>
<row>
<entry>Supports <function>rmdir</function></entry>
<entry>No</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</section>
</appendix>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->