PHP
文件系统 | File System

fopen

fopen

(PHP 4, PHP 5, PHP 7)

fopen - 打开文件或URL

描述

resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

fopen()将指定的指定资源绑定filename到流。

参数

filename

如果filename格式为“scheme:// ...”,则假定它是一个URL,PHP将搜索该方案的协议处理程序(也称为包装器)。如果没有注册该协议的包装,PHP将发出通知帮助您跟踪脚本中的潜在问题,然后像filename指定常规文件一样继续。

如果PHP已经决定filename指定一个本地文件,那么它将尝试在该文件上打开一个流。该文件必须可供PHP访问,因此您需要确保文件访问权限允许访问。如果您启用了安全模式或open_basedir,则可能会采用进一步的限制。

如果PHP决定filename指定一个注册的协议,并且该协议被注册为网络URL,则PHP将检查以确保allow_url_fopen已启用。如果关闭,PHP将发出警告,并且fopen调用将失败。

注意:支持的协议列表可以在支持的协议和包装器中找到。某些协议(也称为包装器)支持上下文和/或php.ini选项。请参阅正在使用的协议的特定页面,以获取可设置的选项列表。(例如http wrapper 使用的php.ini值user_agent)。

在Windows平台上,请小心避免文件路径中使用的任何反斜杠,或使用正斜杠。

<?php $handle = fopen("c:\\folder\\resource.txt", "r" ?>

mode

mode参数指定您需要访问流的访问类型。它可能是以下任何一种:

模式描述
'r'仅供阅读; 将文件指针放在文件的开头。
'r+'开放阅读和写作; 将文件指针放在文件的开头。
'w'仅供写作使用; 将文件指针放在文件的开头,并将文件截断为零。如果文件不存在,请尝试创建它。
'w +'开放阅读和写作; 将文件指针放在文件的开头,并将文件截断为零。如果文件不存在,请尝试创建它。
'a'仅供写作使用; 将文件指针放在文件的末尾。如果文件不存在,请尝试创建它。在这种模式下,fseek()不起作用,写入总是被附加。
'a+'开放阅读和写作; 将文件指针放在文件的末尾。如果文件不存在,请尝试创建它。在这种模式下,fseek()只影响读取位置,写入总是附加的。
'x'创建并打开只能写入; 将文件指针放在文件的开头。如果该文件已经存在,则fopen()调用将返回FALSE并生成级别为E_WARNING的错误。如果文件不存在,请尝试创建它。这相当于为底层open(2)系统调用指定O_EXCL | O_CREAT标志。
'x+'创造并开放阅读和写作; 否则它具有与'x'相同的行为。
'c'只打开文件以便写入。如果该文件不存在,则会创建该文件。如果存在,它不会被截断(与'w'相对),也不会调用此函数(与'x'一样)。文件指针位于文件的开头。如果希望在尝试修改文件之前获取咨询锁(参见flock()),这可能很有用,因为在获得锁之前使用'w'可截断文件(如果需要截断,可以使用ftruncate()在请求锁之后使用)。
'c+'打开文件阅读和写作;否则它具有与'c'相同的行为。
'e'在打开的文件描述符上设置close-on-exec标志。仅在POSIX.1-2008符合系统编译的PHP中可用。

注意:不同的操作系统系列具有不同的行结束约定。当您编写文本文件并要插入换行符时,您需要为操作系统使用正确的换行符。基于Unix的系统使用\ n作为行尾字符,基于Windows的系统使用\ r \ n作为行尾字符,而基于Macintosh的系统使用\ r作为行尾字符。如果在编写文件时使用了错误的行结尾字符,则可能会发现打开这些文件的其他应用程序将“看起来很有趣”。Windows提供了一个文本模式翻译标志('t'),它将透明地将\ n转换为\ r \ n当处理文件时。相反,您也可以使用'b'强制执行二进制模式,这将不会转换您的数据。要使用这些标志,请指定'b''t'作为mode参数的最后一个字符。默认翻译模式取决于您正在使用的SAPI和PHP版本,所以我们鼓励您始终为便携性原因指定适当的标志。如果您使用纯文本文件并且使用\ n在脚本中划定行尾,但您希望您的文件可以使用记事本等应用程序读取,则应该使用't'模式。你应该使用'b'在所有其他情况下。如果您在使用二进制文件时未指定“b”标志,则可能会遇到有关数据的奇怪问题,包括破损的图像文件和\ r \ n字符中的奇怪问题。

注意:为便于移植,强烈建议您在使用fopen()打开文件时始终使用'b'标志。

注意:为便于移植,强烈建议您重新编写使用或依赖't'模式的代码,以便它使用正确的行结束符和'b'模式。

use_include_path

可选的第三个use_include_path参数可以设置为'1',或者TRUE您也想在include_path中搜索文件。

context

注意:使用PHP 5.0.0添加了上下文支持。有关上下文的描述,请参阅流。

返回值

返回成功或FALSE错误时的文件指针资源。

错误/异常

如果打开失败,E_WARNING则会生成级别错误。您可以使用@来抑制此警告。

更新日志

描述
7.0.16, 7.1.2'e'选项被添加。
5.2.6添加了'c'和'c +'选项
4.3.2从PHP 4.3.2开始,对于区分二进制和文本模式的所有平台,默认模式设置为二进制。如果您在升级后遇到脚本问题,请尝试使用't'标志作为解决方法,直到您如前所述使脚本更具可移植性

例子

Example #1 fopen() examples

<?php $handle = fopen("/home/rasmus/file.txt", "r" $handle = fopen("/home/rasmus/file.gif", "wb" $handle = fopen("http://www.example.com/", "r" $handle = fopen("ftp://user:password@example.com/somefile.txt", "w" ?>

注意

警告

使用SSL时,Microsoft IIS将通过关闭连接而不发送close_notify指示符来违反协议。当您到达数据结尾时,PHP将报告为“SSL:致命协议错误”。要解决此问题,应将error_reporting的值降低到不包含警告的级别。当您使用https://封装器打开流时,PHP可以检测到有问题的IIS服务器软件,并会取消警告。当使用fsockopen()创建一个ssl://套接字时,开发人员负责检测并抑制此警告。

注意:启用安全模式后,PHP会检查脚本所在的目录是否与正在执行的脚本具有相同的UID(所有者)。

注意:如果您在读取和写入文件时遇到问题,并且您使用的是服务器模块版本的PHP,请记住确保您使用的文件和目录可供服务器进程访问。

注意:此功能也可能成功时filename是一个目录。如果您不确定filename文件还是目录,则可能需要在调用fopen()之前使用is_dir()函数。