<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >使用远程文件</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="特点" HREF="features.html"><LINK REL="PREVIOUS" TITLE="对 PUT 方法的支持" HREF="features.file-upload.put-method.html"><LINK REL="NEXT" TITLE="连接处理" HREF="features.connection-handling.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="features.file-upload.put-method.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="features.connection-handling.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="features.remote-files" >章 39. 使用远程文件</A ></H1 ><P > 只要在 <TT CLASS="filename" >php.ini</TT > 文件中激活了 <CODE CLASS="option" >allow_url_fopen</CODE > 选项,就可以在大多数需要用文件名作为参数的函数中使用 <ACRONYM CLASS="acronym" >HTTP</ACRONYM > 和 <ACRONYM CLASS="acronym" >FTP</ACRONYM > 的 URL 来代替文件名。同时,也可以在 <A HREF="function.include.html" ><B CLASS="function" >include()</B ></A >、<A HREF="function.include-once.html" ><B CLASS="function" >include_once()</B ></A >、<A HREF="function.require.html" ><B CLASS="function" >require()</B ></A > 及 <A HREF="function.require-once.html" ><B CLASS="function" >require_once()</B ></A > 语句中使用 URL。PHP 所支持协议的更多信息参见<A HREF="wrappers.html" >附录 N</A >。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 要在 PHP 4.0.3 及其更早的版本中使用 URL 封装协议,需要在编译时用 <CODE CLASS="option" >--enable-url-fopen-wrapper</CODE > 参数来配置 PHP。 </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > Windows 版本的 PHP 4.3 版之前不支持以下函数的远程访问:<A HREF="function.include.html" ><B CLASS="function" >include()</B ></A >,<A HREF="function.include-once.html" ><B CLASS="function" >include_once()</B ></A >,<A HREF="function.require.html" ><B CLASS="function" >require()</B ></A >,<A HREF="function.require-once.html" ><B CLASS="function" >require_once()</B ></A > 以及<A HREF="ref.image.html" >参考 LXV, <I >Image 图像函数</I ></A >中的 imagecreatefromXXX 函数。 </P ></BLOCKQUOTE ></DIV ><P > 例如,可以用以下范例来打开远程 web 服务器上的文件,解析需要的输出数据,然后将这些数据用在数据库的检索中,或者简单地以和自己网站其它页面相同的风格输出其内容。 </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN7264" ></A ><P ><B >例 39-1. 获取远程文件的标题</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$file </font><font color="#007700">= </font><font color="#0000BB">fopen </font><font color="#007700">(</font><font color="#DD0000">"http://www.example.com/"</font><font color="#007700">, </font><font color="#DD0000">"r"</font><font color="#007700">);<br />if (!</font><font color="#0000BB">$file</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"<p>Unable to open remote file.\n"</font><font color="#007700">;<br /> exit;<br />}<br />while (!</font><font color="#0000BB">feof </font><font color="#007700">(</font><font color="#0000BB">$file</font><font color="#007700">)) {<br /> </font><font color="#0000BB">$line </font><font color="#007700">= </font><font color="#0000BB">fgets </font><font color="#007700">(</font><font color="#0000BB">$file</font><font color="#007700">, </font><font color="#0000BB">1024</font><font color="#007700">);<br /> </font><font color="#FF8000">/* This only works if the title and its tags are on one line */<br /> </font><font color="#007700">if (</font><font color="#0000BB">eregi </font><font color="#007700">(</font><font color="#DD0000">"<title>(.*)</title>"</font><font color="#007700">, </font><font color="#0000BB">$line</font><font color="#007700">, </font><font color="#0000BB">$out</font><font color="#007700">)) {<br /> </font><font color="#0000BB">$title </font><font color="#007700">= </font><font color="#0000BB">$out</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">];<br /> break;<br /> }<br />}<br /></font><font color="#0000BB">fclose</font><font color="#007700">(</font><font color="#0000BB">$file</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 如果有合法的访问权限,以一个用户的身份和某 FTP 服务器建立了链接,还可以向该 FTP 服务器端的文件进行写操作。仅能用该方法来创建新的文件;如果尝试覆盖已经存在的文件,<A HREF="function.fopen.html" ><B CLASS="function" >fopen()</B ></A > 函数的调用将会失败。 </P ><P > 要以“anonymous”以外的用户名连接服务器,需要指明用户名(可能还有密码),例如“ftp://user:password@ftp.example.com/path/to/file”(也可以在通过需要 Basic 认证的 HTTP 协议访问远程文件时使用相同的语法)。 </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN7271" ></A ><P ><B >例 39-2. 将数据保存到远程服务器</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$file </font><font color="#007700">= </font><font color="#0000BB">fopen </font><font color="#007700">(</font><font color="#DD0000">"ftp://ftp.example.com/incoming/outputfile"</font><font color="#007700">, </font><font color="#DD0000">"w"</font><font color="#007700">);<br />if (!</font><font color="#0000BB">$file</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">"<p>Unable to open remote file for writing.\n"</font><font color="#007700">;<br /> exit;<br />}<br /></font><font color="#FF8000">/* Write the data here. */<br /></font><font color="#0000BB">fwrite </font><font color="#007700">(</font><font color="#0000BB">$file</font><font color="#007700">, </font><font color="#0000BB">$_SERVER</font><font color="#007700">[</font><font color="#DD0000">'HTTP_USER_AGENT'</font><font color="#007700">] . </font><font color="#DD0000">"\n"</font><font color="#007700">);<br /></font><font color="#0000BB">fclose </font><font color="#007700">(</font><font color="#0000BB">$file</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 或许可以从以上范例中得到启发,用该技术来存储远程日志文件。但是正如以上提到的,在用 <A HREF="function.fopen.html" ><B CLASS="function" >fopen()</B ></A > 方式打开的 URL 中,仅能对新文件进行写操作。如果远程文件已经存在则 <A HREF="function.fopen.html" ><B CLASS="function" >fopen()</B ></A > 函数的操作将会失败。要做类似于分布式日志的事,可以参考 <A HREF="function.syslog.html" ><B CLASS="function" >syslog()</B ></A > 函数。 </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="features.file-upload.put-method.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="features.connection-handling.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >对 PUT 方法的支持</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="features.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >连接处理</TD ></TR ></TABLE ></DIV ></BODY ></HTML >