与文件系统和服务器的交互

文件读写

fopen() --- 打开文件或者 URL

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

如果 filename 是 "scheme://..." 的格式,则被当成一个URL,PHP将检查allow_url_fopen 设置,然后搜索协议处理器(封装协议)来处理。注意,URL中域名不区分大小写,但路径和文件名可能区分。

mode 说明

r只读方式打开,将文件指针指向文件头
r+读写方式打开,将文件指针指向文件头
w写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之
w+读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之
a写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之
a+读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之
x创建并以写入方式打开,将文件指针指向文件头。如果文件已存在将产生一个警告
x+创建并以读写方式打开,其他的行为和 'x' 一样
c写入方式打开,将文件指针指向文件头但不会将文件清零。如果文件不存在则尝试创建之
c+写入方式打开,其他的行为和 'c' 一样

附加项,作为mode 参数的最后一个字符

b二进制模式。默认值,为了获得最大程度的可移植性和防止产生奇怪问题(不该改的改了),推荐一直使用这个选项
t文本模式。Windows下特有标记,可以透明地将\n转换为\r\n。当t选项用在二进制文件时可能会出现错误结果
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];  // 采用相对路径的目的是防止服务器目录意外变更
@ $fp=fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab')

fwrite() / fputs() --- 写入文件(可安全用于二进制文件)

int fwrite ( resource $handle, string $string [,int $length])

fclose() --- 关闭一个已打开的文件指针

file_put_contents() --- 将一个字符串写入文件

int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

相当于依次调用了fopen(),fwrite() 以及fclose() 功能

$file = 'people.txt';
$current = file_get_contents($file);  // Open the file to get existing content
$current .= "John Smith\n";
file_put_contents($file, $current);  // Write the contents back to the file

feof() --- 测试文件指针是否到了文件结束的位置

while (!feof($fp))  // 读取文件内容直至遇到EOF

fgets() --- 从文件指针中读取一行

string fgets ($handle [,$length]) // 碰到\n(包括在返回值中)EOF 或者已经读取了length-1 字节后停止

fgetss() --- 从文件指针中读取一行,并过滤掉 HTML和PHP 标记。fgets safely

fgetcsv() --- 从文件指针中读入一行,并解析 CSV 字段

array fgetcsv ( $handle [, $length=0 [, $delimiter=',' [, $enclosure='"' [, $escape='\\']]]])

fgetc() --- 从文件指针中逐个读取字符

逐个读取字符的现实意义不大,该函数在读到文件尾部时会返回文件结束符EOF

fread() --- 读取任意长度字符

string fread ( resource $handle , int $length )

readfile() --- 读取整个文件并写入到输出缓冲

int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )

file() --- 把整个文件读入一个数组中

array file ( string $filename [, int $flags=0 [, resource $context]])

fpassthru() --- 输出文件指针处的所有剩余数据 thru = through

int fpassthru ( resource $handle )

file_get_contents() --- 将整个文件读入一个字符串


file_exists() --- 检查文件或目录是否存在

filesize() --- 取得文件大小


rewind() --- 将文件指针复位到文件的开始

ftell() --- 返回文件指针读/写的位置,也就是文件流中的偏移量

fseek() --- 设定文件指针位置

int fseek ( resource $handle, int $offset [, int $whence=SEEK_SET])

新位置从文件头开始以字节数度量,是以whence 指定的位置加上offset。fseek($fp, 0) 相当于rewind($fp)

flock() --- 锁定或释放文件

bool flock ( resource $handle, $operation [,int &$wouldblock ] ) //若设置为1或TRUE则当进行锁定时阻挡其他进程

operation 可能的值:
LOCK_SH 取得共享锁定(读取的程序)LOCK_EX 取得独占锁定(写入的程序)
LOCK_UN 释放锁定(无论共享或独占)LOCK_NB 防止在请求加锁时发生阻塞

文件上传

php.ini中关于文件上传的设置指令

指令描述默认值
file_uploads控制是否允许HTTP方式的文件上传ON
upload_tmp_dir指定上传的文件在被处理之前的临时保存目录NULL
upload_max_filesize控制允许上传的文件最大大小(单位B)2M
post_max_size控制通过POST方法上传数据的最大值8M

超全局数组$_FILES

$_FILES['userfile']['tmp_name']文件在web服务器中临时存储的位置
$_FILES['userfile']['name']用户系统中的文件名称
$_FILES['userfile']['size']文件的字节大小
$_FILES['userfile']['type']文件的MIME类型
$_FILES['userfile']['error']任何与文件上传相关的错误代码(代码参考手册“文件上传处理”)

is_uploaded_file() --- 判断文件是否是通过HTTP POST上传的

move_uploaded_file() --- 将上传的文件移动到新位置

basename() --- 返回路径中的文件名部分

文件上传代码很简单,重点在于错误检测,应该尽量避免文件上传存在的潜在安全风险。

目录函数

opendir --- 打开目录句柄

readdir --- 从目录句柄中读取条目,无法排序

string readdir ([ resource $dir_handle ] )
while (false !== ($file = readdir($handle))) { echo "$file\n"; }

closedir --- 关闭目录句柄

scandir --- 返回含有文件和目录的数组,按字母表顺序排序

array scandir ( string $directory [, int $sorting_order [, resource $context ]] )

dirname() --- 返回路径中的目录部分

mkdir() --- 新建目录

umask() --- 改变当前的 umask

$oldumask=umask(0); mkdir("/tmp/testing",0777); umask($oldumask);
// 当前的umask值将与mkdir指定值相与(做减法)。umask()会修改umask值,但返回的是原先的umask值

rmdir() --- 删除目录

dir类 --- 除了函数外,PHP还提供了dir类

该类具有handle 和path 属性,以及read()、close()、rewind()方法

disk_free_space() / diskfreespace()--- 返回目录中的可用空间

disk_total_space() --- 返回一个目录的磁盘总大小

与文件系统的交互

fileowner() --- 取得文件的所有者

filegroup() --- 取得文件的组

filetype() --- 取得文件类型

filemtime() --- 取得文件修改时间

fileperms() --- 取得文件的权限


touch() --- 设定文件的访问和修改时间

copy() --- 拷贝文件

unlink() --- 删除文件,PHP里没有delete函数

rename() --- 重命名一个文件或目录


chgrp() --- 改变文件所属的组

chmod() --- 改变文件模式

chown() --- 改变文件的所有者


is_dir() --- 判断给定文件名是否是一个目录

is_file() --- 判断给定文件名是否为一个正常的文件

is_link() --- 判断给定文件名是否为一个符号连接

is_readable() --- 判断给定文件名是否可读

is_writable() / is_writeable() --- 判断给定的文件名是否可写

is_executable() --- 判断给定文件名是否可执行

程序执行函数(部分)

当要为一个已有的命令行系统提供一个基于web的前台时,这些函数是非常有用的。

使用外部函数的一个缺点是,代码不再是可移植的。

exec --- 执行一个外部程序

passthru --- 执行外部程序并且显示原始输出

system --- 执行外部程序,并且显示输出

反引号`` --- 执行结果以字符串形式返回

与环境变量交互

getenv — 获取一个环境变量的值,使用phpinfo()可以看到所有环境变量的列表

putenv() - 设置环境变量的值,如 putenv("DOCUMENT_ROOT=/var/www/html");

其他函数(全)

PHP中的大多数文件系统函数都与操作系统函数对应,可以通过linux的man手册获取更多信息。

clearstatcache() --- 清除文件状态缓存

dir --- 返回一个Directory 类实例

getcwd --- 取得当前工作目录

rewinddir --- 倒回目录句柄

chdir --- 改变目录

chroot --- 改变根目录

fflush() --- 将缓冲内容输出到文件

fileatime() --- 取得文件的上次访问时间

filectime() --- 取得文件的 inode 修改时间

fileinode() --- 取得文件的 inode

fnmatch() --- 用模式匹配文件名

fputcsv() --- 将行格式化为 CSV 并写入文件指针

fscanf() --- 从文件中格式化输入

fstat() --- 通过已打开的文件指针取得文件信息

ftruncate() --- 将文件截断到给定的长度

glob() --- 寻找与模式匹配的文件路径

lchgrp() --- Changes group ownership of symlink

lchown() --- Changes user ownership of symlink

link() --- 建立一个硬连接

linkinfo() --- 获取一个连接的信息

lstat() --- 给出一个文件或符号连接的信息

stat() --- 给出文件的信息

parse_ini_file() --- 解析一个配置文件

parse_ini_string() --- Parse a configuration string

pathinfo() --- 返回文件路径的信息

pclose() --- 关闭进程文件指针

popen() --- 打开进程文件指针

readlink() --- 返回符号连接指向的目标

realpath_cache_get() --- Get realpath cache entries

realpath_cache_size() --- Get realpath cache size

realpath() --- 返回规范化的绝对路径名

putenv('GDFONTPATH=' . realpath('.'));  // 设定GD2的字符路径为当前路径。例见imagettftext 

set_file_buffer() --- stream_set_write_buffer 的别名

symlink() --- 建立符号连接

tempnam() --- 建立一个具有唯一文件名的文件

tmpfile() --- 建立一个临时文件