<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >fopen</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="Filesystem 文件系统函数" HREF="ref.filesystem.html"><LINK REL="PREVIOUS" TITLE="fnmatch" HREF="function.fnmatch.html"><LINK REL="NEXT" TITLE="fpassthru" HREF="function.fpassthru.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="refentry" 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="function.fnmatch.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="function.fpassthru.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><H1 ><A NAME="function.fopen" ></A >fopen</H1 ><DIV CLASS="refnamediv" ><A NAME="AEN53306" ></A ><P > (PHP 3, PHP 4, PHP 5)</P >fopen -- 打开文件或者 URL</DIV ><DIV CLASS="refsect1" ><A NAME="AEN53309" ></A ><H2 >说明</H2 >resource <B CLASS="methodname" >fopen</B > ( string filename, string mode [, bool use_include_path [, resource zcontext]] )<BR ></BR ><P > <B CLASS="function" >fopen()</B > 将 <CODE CLASS="parameter" >filename</CODE > 指定的名字资源绑定到一个流上。如果 <CODE CLASS="parameter" >filename</CODE > 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 <CODE CLASS="parameter" >filename</CODE > 当成一个普通的文件名继续执行下去。 </P ><P > 如果 PHP 认为 <CODE CLASS="parameter" >filename</CODE > 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了<A HREF="features.safe-mode.html#ini.safe-mode" >安全模式</A >或者 <A HREF="features.safe-mode.html#ini.open-basedir" >open_basedir</A > 则会应用进一步的限制。 </P ><P > 如果 PHP 认为 <CODE CLASS="parameter" >filename</CODE > 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 <A HREF="ref.filesystem.html#ini.allow-url-fopen" >allow_url_fopen</A > 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 所支持的协议列表见<A HREF="wrappers.html" >附录 N</A >。某些协议(也被称为 <TT CLASS="literal" >wrappers</TT >)支持 <TT CLASS="literal" >context</TT > 和/或 <TT CLASS="filename" >php.ini</TT > 选项。参见相应的页面哪些选项可以被设定(例如 <TT CLASS="filename" >php.ini</TT > 中用于 <TT CLASS="literal" >http</TT > wrapper 的 <TT CLASS="literal" >user_agent</TT > 值)。 </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B >对 context 的支持是 PHP 5.0.0 添加的。有关 <TT CLASS="literal" >context</TT > 的说明见<A HREF="ref.stream.html" >参考 CLX, <I >Stream Functions</I ></A >。</P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 自 PHP 4.3.2 起,对所有区别二进制和文本模式的平台默认模式都被设为二进制模式。如果在升级后脚本碰到问题,尝试暂时使用 <TT CLASS="literal" >'t'</TT > 标记,直到所有的脚本都照以下所说的改为更具移植性以后。 </P ></BLOCKQUOTE ></DIV ><P > <CODE CLASS="parameter" >mode</CODE > 参数指定了所要求到该流的访问类型。可以是以下: <DIV CLASS="table" ><A NAME="AEN53356" ></A ><P ><B >表 1. <B CLASS="function" >fopen()</B > 中 <CODE CLASS="parameter" >mode</CODE > 的可能值列表</B ></P ><TABLE BORDER="1" CLASS="CALSTABLE" ><COL><COL><THEAD ><TR ><TH ><CODE CLASS="parameter" >mode</CODE ></TH ><TH >说明</TH ></TR ></THEAD ><TBODY ><TR ><TD ><TT CLASS="literal" >'r'</TT ></TD ><TD > 只读方式打开,将文件指针指向文件头。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'r+'</TT ></TD ><TD > 读写方式打开,将文件指针指向文件头。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'w'</TT ></TD ><TD > 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'w+'</TT ></TD ><TD > 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'a'</TT ></TD ><TD > 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'a+'</TT ></TD ><TD > 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'x'</TT ></TD ><TD > 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 <B CLASS="function" >fopen()</B > 调用失败并返回 <TT CLASS="constant" ><B >FALSE</B ></TT >,并生成一条 <TT CLASS="constant" ><B >E_WARNING</B ></TT > 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 <TT CLASS="literal" >open(2)</TT > 系统调用指定 <TT CLASS="literal" >O_EXCL|O_CREAT</TT > 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 </TD ></TR ><TR ><TD ><TT CLASS="literal" >'x+'</TT ></TD ><TD > 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 <B CLASS="function" >fopen()</B > 调用失败并返回 <TT CLASS="constant" ><B >FALSE</B ></TT >,并生成一条 <TT CLASS="constant" ><B >E_WARNING</B ></TT > 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 <TT CLASS="literal" >open(2)</TT > 系统调用指定 <TT CLASS="literal" >O_EXCL|O_CREAT</TT > 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 </TD ></TR ></TBODY ></TABLE ></DIV > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 不同的操作系统家族具有不同的行结束习惯。当写入一个文本文件并想插入一个新行时,需要使用符合操作系统的行结束符号。基于 Unix 的系统使用 <TT CLASS="literal" >\n</TT > 作为行结束字符,基于 Windows 的系统使用 <TT CLASS="literal" >\r\n</TT > 作为行结束字符,基于 Macintosh 的系统使用 <TT CLASS="literal" >\r</TT > 作为行结束字符。 </P ><P > 如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。 </P ><P > Windows 下提供了一个文本转换标记(<TT CLASS="literal" >'t'</TT >)可以透明地将 <TT CLASS="literal" >\n</TT > 转换为 <TT CLASS="literal" >\r\n</TT >。与此对应还可以使用 <TT CLASS="literal" >'b'</TT > 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 <TT CLASS="literal" >'b'</TT > 或者用 <TT CLASS="literal" >'t'</TT > 作为 <CODE CLASS="parameter" >mode</CODE > 参数的最后一个字符。 </P ><P > 默认的转换模式依赖于 SAPI 和所使用的 PHP 版本,因此为了便于移植鼓励总是指定恰当的标记。如果是操作纯文本文件并在脚本中使用了 <TT CLASS="literal" >\n</TT > 作为行结束符,但还要期望这些文件可以被其它应用程序例如 Notepad 读取,则在 mode 中使用 <TT CLASS="literal" >'t'</TT >。在所有其它情况下使用 <TT CLASS="literal" >'b'</TT >。 </P ><P > 在操作二进制文件时如果没有指定 <TT CLASS="literal" >'b'</TT > 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 <TT CLASS="literal" >\r\n</TT > 字符的奇怪问题。 </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 为移植性考虑,强烈建议在用 <B CLASS="function" >fopen()</B > 打开文件时总是使用 <TT CLASS="literal" >'b'</TT > 标记。 </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > 再一次,为移植性考虑,强烈建议你重写那些依赖于 <TT CLASS="literal" >'t'</TT > 模式的代码使其使用正确的行结束符并改成 <TT CLASS="literal" >'b'</TT > 模式。 </P ></BLOCKQUOTE ></DIV ><P > 如果也需要在 <A HREF="ini.core.html#ini.include-path" >include_path</A > 中搜寻文件的话,可以将可选的第三个参数 <CODE CLASS="parameter" >use_include_path</CODE > 设为 '1' 或 <TT CLASS="constant" ><B >TRUE</B ></TT >。 </P ><P > 如果打开失败,本函数返回 <TT CLASS="constant" ><B >FALSE</B ></TT >。 </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN53445" ></A ><P ><B >例 1. <B CLASS="function" >fopen()</B > 例子</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$handle </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"/home/rasmus/file.txt"</font><font color="#007700">, </font><font color="#DD0000">"r"</font><font color="#007700">);<br /></font><font color="#0000BB">$handle </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"/home/rasmus/file.gif"</font><font color="#007700">, </font><font color="#DD0000">"wb"</font><font color="#007700">);<br /></font><font color="#0000BB">$handle </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 /></font><font color="#0000BB">$handle </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"ftp://user:password@example.com/somefile.txt"</font><font color="#007700">, </font><font color="#DD0000">"w"</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 如果在用服务器模块版本的 PHP 时在打开和写入文件上遇到问题,记住要确保所使用的文件是服务器进程所能够访问的。 </P ><P > 在 Windows 平台上,要小心转义文件路径中的每个反斜线,或者用斜线。 <DIV CLASS="informalexample" ><P ></P ><A NAME="AEN53451" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$handle </font><font color="#007700">= </font><font color="#0000BB">fopen</font><font color="#007700">(</font><font color="#DD0000">"c:\\data\\info.txt"</font><font color="#007700">, </font><font color="#DD0000">"r"</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV > </P ><DIV CLASS="warning" ><P ></P ><TABLE CLASS="warning" BORDER="1" WIDTH="100%" ><TR ><TD ALIGN="CENTER" ><B >警告</B ></TD ></TR ><TR ><TD ALIGN="LEFT" ><P >当使用 SSL 时,Microsoft IIS 将违反协议不发送 close_notify 标记就关闭连接。PHP 将在到达数据尾端时报告 "SSL: Fatal Protocol Error"。要绕过此问题,应将 <A HREF="ref.errorfunc.html#ini.error-reporting" >error_reporting</A > 级别降低为不包括警告。PHP 4.3.7 及更高版本可以在当使用 https:// 封装协议打开流的时候检测出有此问题的 IIS 服务器并抑制警告。如果使用 <A HREF="function.fsockopen.html" ><B CLASS="function" >fsockopen()</B ></A > 来创建一个 ssl:// 套接字,则需要自己检测并抑制警告信息。</P ></TD ></TR ></TABLE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B >当<A HREF="features.safe-mode.html" >安全模式</A >被激活时,PHP 将检查被操作的目录是否和正在执行的脚本有相同的 UID(所有者)。</P ></BLOCKQUOTE ></DIV ><P > 参见<A HREF="wrappers.html" >附录 N</A >,<A HREF="function.fclose.html" ><B CLASS="function" >fclose()</B ></A >,<A HREF="function.fgets.html" ><B CLASS="function" >fgets()</B ></A >,<A HREF="function.fread.html" ><B CLASS="function" >fread()</B ></A >,<A HREF="function.fwrite.html" ><B CLASS="function" >fwrite()</B ></A >,<A HREF="function.fsockopen.html" ><B CLASS="function" >fsockopen()</B ></A >,<A HREF="function.file.html" ><B CLASS="function" >file()</B ></A >,<A HREF="function.file-exists.html" ><B CLASS="function" >file_exists()</B ></A >,<A HREF="function.is-readable.html" ><B CLASS="function" >is_readable()</B ></A >,<A HREF="function.stream-set-timeout.html" ><B CLASS="function" >stream_set_timeout()</B ></A > 和 <A HREF="function.popen.html" ><B CLASS="function" >popen()</B ></A >。 </P ></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="function.fnmatch.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="function.fpassthru.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >fnmatch</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="ref.filesystem.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >fpassthru</TD ></TR ></TABLE ></DIV ></BODY ></HTML >