文件包含
include 和 require 语句
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法
include 'filename';
或者
require 'filename';
实例1
假设您有一个标准的页头文件,名为 "header.php"。如需在页面中引用这个页头文件,请使用 include/require:
<html>
<body>
<?php include 'header.php'; ?>
<h1>Welcome to my home page!</h1>
<p>Some text.</p>
</body>
</html>
实例 2
假设我们有一个在所有页面中使用的标准菜单文件。
"menu.php":
echo '<a href="/default.php">Home</a>
<a href="/tutorials.php">Tutorials</a>
<a href="/references.php">References</a>
<a href="/examples.php">Examples</a>
<a href="/about.php">About Us</a>
<a href="/contact.php">Contact Us</a>';
网站中的所有页面均应引用该菜单文件。以下是具体的做法:
<html>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>Welcome to my home page.</h1>
<p>Some text.</p>
</body>
</html>
实例 3
假设我们有一个定义变量的包含文件("vars.php"):
<?php
$color='red';
$car='BMW';
?>
这些变量可用在调用文件中:
<html>
<body>
<h1>Welcome to my home page.</h1>
<?php include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>
打开文件
fopen() 函数用于在 PHP 中打开文件。
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
文件可能通过下列模式来打开:
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
实例
如果 fopen() 函数不能打开指定的文件,下面的实例会生成一段消息:
<html>
<body>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
关闭文件
fclose() 函数用于关闭打开的文件:
<?php
$file = fopen("test.txt","r");
//some code to be executed
fclose($file);
?>
检测 End-of-file
feof() 函数检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
注释:在 w 、a 和 x 模式下,您无法读取打开的文件!
if (feof($file)) echo "End of file";
逐行读取文件
fgets() 函数用于从文件中逐行读取文件。
注释:在调用该函数之后,文件指针会移动到下一行。
实例
下面的实例逐行读取文件,直到文件末尾为止:
<?php
$file = fopen("welcome.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
逐字符读取文件
fgetc() 函数用于从文件中逐字符地读取文件。
注释:在调用该函数之后,文件指针会移动到下一个字符。
实例
下面的实例逐字符地读取文件,直到文件末尾为止:
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
有关上面的 HTML 表单的一些注意项列举如下:
<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"。
<input> 标签的 type="file" 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
上传脚本
"upload_file.php" 文件含有供上传文件的代码:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 和 .jpeg 文件,文件大小必须小于 20 kB:
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file";
}
?>
保存上传的文件
上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的文件夹。
Filesystem函数
Runtime 配置
Filesystem 函数的行为受到 php.ini 中设置的影响。
Filesystem 配置选项:
名称 | 默认 | 描述 | 可改变 |
---|---|---|---|
allow_url_fopen | "1" | 允许 fopen()-type 函数使用 URL。(PHP 4.0.4 版以后可用) | PHP_INI_SYSTEM |
user_agent | NULL | 定义 PHP 发送的用户代理。(PHP 4.3 版以后可用) | PHP_INI_ALL |
default_socket_timeout | "60" | 设置基于 socket 流的默认的超时时间(秒)。(PHP 4.3 版以后可用) | PHP_INI_ALL |
from | "" | 定义匿名 FTP 的密码(您的 email 地址)。 | PHP_INI_ALL |
auto_detect_line_endings | "0" | 当设置为 "1" 时,PHP 将检查通过 fgets() 和 file() 取得的数据中的行结束符号是符合 Unix、MS-Dos 还是 Mac 的习惯。(PHP 4.3 版以后可用) | PHP_INI_ALL |
PHP 5 Filesystem 函数
函数 | 描述 |
---|---|
basename() | 返回路径中的文件名部分。 |
chgrp() | 改变文件组。 |
chmod() | 改变文件模式。 |
chown() | 改变文件所有者。 |
clearstatcache() | 清除文件状态缓存。 |
copy() | 复制文件。 |
delete() | 参见 unlink() 或 unset() |
dirname() | 返回路径中的目录名称部分。 |
disk_free_space() | 返回目录的可用空间。 |
disk_total_space() | 返回一个目录的磁盘总容量。 |
diskfreespace() | disk_free_space() 的别名。 |
fclose() | 关闭打开的文件。 |
feof() | 测试文件指针是否到了文件末尾。 |
fflush() | 向打开的文件刷新缓冲输出。 |
fgetc() | 从打开的文件中返回字符。 |
fgetcsv() | 从打开的文件中解析一行,校验 CSV 字段。 |
fgets() | 从打开的文件中返回一行。 |
fgetss() | 从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签。 |
file() | 把文件读入一个数组中。 |
file_exists() | 检查文件或目录是否存在。 |
file_get_contents() | 把文件读入字符串。 |
file_put_contents() | 把字符串写入文件。 |
fileatime() | 返回文件的上次访问时间。 |
filectime() | 返回文件的上次修改时间。 |
filegroup() | 返回文件的组 ID。 |
fileinode() | 返回文件的 inode 编号。 |
filemtime() | 返回文件内容的上次修改时间。 |
fileowner() | 返回文件的用户 ID (所有者)。 |
fileperms() | 返回文件的权限。 |
filesize() | 返回文件大小。 |
filetype() | 返回文件类型。 |
flock() | 锁定或释放文件。 |
fnmatch() | 根据指定的模式来匹配文件名或字符串。 |
fopen() | 打开一个文件或 URL。 |
fpassthru() | 从打开的文件中读数据,直到文件末尾(EOF),并向输出缓冲写结果。 |
fputcsv() | 把行格式化为 CSV 并写入一个打开的文件中。 |
fputs() | fwrite() 的别名。 |
fread() | 读取打开的文件。 |
fscanf() | 根据指定的格式对输入进行解析。 |
fseek() | 在打开的文件中定位。 |
fstat() | 返回关于一个打开的文件的信息。 |
ftell() | 返回在打开文件中的当前位置。 |
ftruncate() | 把打开文件截断到指定的长度。 |
fwrite() | 写入打开的文件。 |
glob() | 返回一个包含匹配指定模式的文件名/目录的数组。 |
is_dir() | 判断文件是否是一个目录。 |
is_executable() | 判断文件是否可执行。 |
is_file() | 判断文件是否是常规的文件。 |
is_link() | 判断文件是否是连接。 |
is_readable() | 判断文件是否可读。 |
is_uploaded_file() | 判断文件是否是通过 HTTP POST 上传的。 |
is_writable() | 判断文件是否可写。 |
is_writeable() | is_writable() 的别名。 |
lchgrp() | 改变符号连接的组所有权。 |
lchown() | 改变符号连接的用户所有权。 |
link() | 创建一个硬连接。 |
linkinfo() | 返回有关一个硬连接的信息。 |
lstat() | 返回关于文件或符号连接的信息。 |
mkdir() | 创建目录。 |
move_uploaded_file() | 把上传的文件移动到新位置。 |
parse_ini_file() | 解析一个配置文件。 |
parse_ini_string() | 解析一个配置字符串。 |
pathinfo() | 返回关于文件路径的信息。 |
pclose() | 关闭由 popen() 打开的进程。 |
popen() | 打开一个进程。 |
readfile() | 读取一个文件,并写入到输出缓冲。 |
readlink() | 返回符号连接的目标。 |
realpath() | 返回绝对路径名。 |
realpath_cache_get() | 返回高速缓存条目。 |
realpath_cache_size() | 返回高速缓存大小。 |
rename() | 重命名文件或目录。 |
rewind() | 倒回文件指针的位置。 |
rmdir() | 删除空的目录。 |
set_file_buffer() | 设置已打开文件的缓冲大小。 |
stat() | 返回关于文件的信息。 |
symlink() | 创建符号连接。 |
tempnam() | 创建唯一的临时文件。 |
tmpfile() | 创建唯一的临时文件。 |
touch() | 设置文件的访问和修改时间。 |
umask() | 改变文件的文件权限。 |
unlink() | 删除文件。 |
Directory 函数
函数 | 描述 |
---|---|
chdir() | 改变当前的目录。 |
chroot() | 改变根目录。 |
closedir() | 关闭目录句柄。 |
dir() | 返回 Directory 类的实例。 |
getcwd() | 返回当前工作目录。 |
opendir() | 打开目录句柄。 |
readdir() | 返回目录句柄中的条目。 |
rewinddir() | 重置目录句柄。 |
scandir() | 返回指定目录中的文件和目录的数组。 |