0开始之前
1文件相关操作
操作文件的相关步骤:打开文件 → 进行操作 → 关闭文件
- 打开文件
使用fopen()函数打开一个文件,打开一个文件的时候,还需要指定如何使用它,也就是文件模式。
resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
☛ fopen打开的文件是相对于服务器的地址的可以是服务器的根文档下的绝对地址,也可以是相对于web根目录地址( / 是正斜线 \ 是反斜线)
第二个选项$mode常用的值有:r(只读模式打开)、a(以追加模式写入)、b(二进制,推荐一直使用这个选项)
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$link = fopen( "$DOCUMENT_ROOT/../orders/orders.txt",'ab');
- 进行操作
◦写文件fwrite(),可安全用于二进制文件
int fwrite ( resource $handle , string $string [, int $length ] )
◦函数feof(),它的唯一参数是文件指针,指针指向了文件末尾,它将返回true(feof:File End of File)
函数fgets(),可以从文件中每次读取一行内容。
//$fp是打开文件后的句柄
while( !feof($fp) ){
$order = fgets($fp, 999);
echo $order."<br/>";
}
- 关闭文件
调用fclose()函数关闭文件
☛ 其他有用的文件函数(PHP中没有名为delete的函数)
函数名 | 作用 |
---|---|
file_exists() | 查看文件是否存在 |
filesize() | 确定文件大小 |
unlink() | 删除一个文件 |
文件锁定
当一个文件被打开并且在进行读写操作之前,应该对文件加锁,操作之后,应释放已有的锁定。
在PHP中,文件锁是通过flock()函数来实现的:
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
operation可以是以下值之一:
◦ LOCK_SH 取得共享锁定(读取的程序)。
◦ LOCK_EX 取得独占锁定(写入的程序。
◦ LOCK_UN 释放锁定(无论共享或独占)。
如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
ftruncate($fp, 0); // truncate file
fwrite($fp, "Write something here\n");
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
2文件上传
- 实例之前,须知道php.ini中关于文件上传的设置指令
指令 | 描述 | 默认值 |
---|---|---|
file_uploads | 控制是否允许HTTP方式的文件上传。允许值为On或Off | ON(启用) |
upload_tmp_dir | 指定上传文件在被处理之前的临时保存目录。如果没有设置该选项,将使用系统默认值 | NULL |
upload_max_filesize | 控制允许上传的文件最大大小。如果文件大小大于该值,PHP讲创建一个文件大小为0的占位符文件 | 2M |
post_max_file | 控制PHP可以接受的,通过POST方法上传数据的最大值 | 8M |
☛ 在上传的表单之中,必须设置属性enctype="multipart/form-data",以告诉服务器关于上传文件的类型
- 编写处理文件的PHP
编写捕获上载文件的PHP代码是直观的简单的
if( $_FILES['userfile']['error'] > 0 )
{
echo 'Problem:';
switch($_FILES['userfile']['error'])
{
case 1: echo 'File exceeded upload_max_fileseze';
break;
case 2: echo 'File exceeded max_file_size';
break;
case 3: echo 'File only partially uploaded';
break;
case 4: echo 'No file uploaded';
break;
case 6: echo 'Cannot upload file:No temp directory specified';
break;
case 7: echo 'Upload failed:Cannot write to disk';
break;
}
exit;
}
//Dose the file have the right MIME type?
if( $_FILES['userfile']['type'] != 'text/plain')
{
echo 'Problem:file is not plain text';
exit;
}
//put the file where we'd like it
$upfile = '/uploads/'.$_FILES['userfile']['name'];
if(is_uploaded_file($_FILES['userfile']['tmp_name']))
{
if(!move_uploaded_file($_FILES['userfile']['tmp_name'], $upfile))
{
echo 'Problem:Could not move file to destination directory';
exit;
}
}
else
{
echo 'Problem:Possible file upload attack.Filename:';
echo $_FILES['userfile']['name'];
exit;
}
echo 'File uploaded successfully<br><br>';
对于浏览器上传的文件,在服务器端可以使用超全局数组$_FILES使用,如果传递的表单元素名称是userfile,这个数组将有如下的元素:
◦ $_FILES['userfile']['tmp_name']:变量的值就是文件在Web服务器中临时存储的位置。
◦ $_FILES['userfile']['name']:变量的值是用户系统中原来的文件名称
◦ $_FILES['userfile']['size']:变量存储的值就是文件的字节大小
◦ $_FILES['userfile']['type']:变量存储的是文件的MIMEA类型
◦ $_FILES['userfile']['error']:变量的值就是文件上传过程中产生的错误代码
3使用目录函数
- 从目录读取
使用基本目录函数opendir()、closedir()、readdir()可以完成基本的目录读取操作
$current_dir = 'C:/xampp/htdocs/pam';
$dir = opendir($current_dir);
echo '<p>Directory List:</p><ul>';
while(false !== ($file = readdir($dir)))
{
//strip out the two entries . and ..
if($file != '.' && $file != '..')
{
echo "<li>$file</li>";
}
}
echo '</ul>';
closedir($dir);
- 获得当前目录的信息
dirname($path)
函数:返回路径的目录部分
basename($path)
函数:返回路径的文件名称部分
disk_free_space($path)
函数:返回目录所在分区的可用空间(以字节为单位) - 创建和删除目录
创建目录使用mkdir()
函数,可以按如下创建目录:
$oldumask = umask(0); //对于Windows系统是无效的
mkdir("/tmp/testing",0777);
umask($oldumask);
函数rmdir()
讲删除一个目录,要注意,要删除的目录必须是一个空目录。
4与文件系统的交互
- 获取文件信息的相关函数
参照手册 - 更改文件属性
参照手册 - 创建、删除和移动文件
调用touch()
函数来创建一个文件、调用unlink()
函数来删除一个文件、调用copy()
函数来复制文件、调用rename()
函数来重命名(移动)文件
5使用程序执行函数和与环境变量的交互
可以使用4种主要的技术在Web服务器上执行命令:
exec()
passthru()
system()
反引号
可以使用getenv()
和putenv()
来设置运行PHP的服务器上的环境变量。