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()函数。