与文件系统和服务器的交互
文件读写
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