[+]文章目录

文件和目录

文件权限

在 PHP 脚本得到通过 Web 服务器运行时,会视为一个不同的服务器用户,然后 PHP 和 web 服务器都能够读取上传的文件,但是 PHP 无法修改这些文件

Web 浏览器可以访问 Web 根目录及其子目录的所有文件,但是不能访问 Web 根目录外面的目录,所以,在创建可写和目录的时候,放在 Web 根目录之外更安全

写入文件

PHP5 中的函数:

    file_put_contents($file, $data, FILE_APPEND)
    //打开文件并写入数据,向文件追加数据

    file_put_contents($file, $_POST['quote'] . PHP_EOL,FILE_APPEND);
    //PHP_EOL是表示当前操作系统的换行符

如果不是 PHP5,则需要使用旧的方法:

    $fp = fopen($file, mode);
    fwrite($fp, $data . PHP_EOL);
    fclose($fp);

在向文件或者目录写入数据的时候,需要调用 is_writable 来避免权限错误

    if( is_writable($file))
    //返回布尔值 表示指定文件是否可以被写入

锁定文件

当多个 PHP 脚本试图同一时刻写入一个文件时,就会出现问题

在 PHP5.1 以上版本可以这样:

     file_put_contents($file, $data, FILE_APPEND | LOCK_EX)
     //LOCK_EX 是表示暂时锁定该文件

在早期的 PHP 版本中,需要使用:

    flock($fp,locktype)
    //LOCK_SH  读取共享锁
      LOCK_EX  写入独享锁
      LOCK_UN  释放一个锁
      LOCL_NB  非阻塞锁

在 fclose 的时候,文件会自动解锁,最好在写入完成的时候加上解锁的语句

读取文件

  • file_get_contents 所有内容读到一个字符串中
  • file 每行一些数据 读取之后放在一个数组中
  • fgets 返回具有指定长度的字符串

fgets 和 C 语法一样:

    $fp = fopen($file, 'rb');
    while (!feof($fp))
    {
       $string = fgets($fp, 1024); //返回1023字节数据
    }
    fclose ($fp);

处理文件上传

处理文件上传必须:

  • 初始 form 标签时必须包含代码 enctype="multipart/form-data",表单必须使用 POST
  • 必须添加一个特殊的隐藏输入框 用来建议浏览器最大能够上传的文件大小
  • 使用 file 元素创建所需要的表单字段

在 PHP 中,$_FILES 变量包含 5 个元素:

  • name 文件名
  • type MIME类型
  • size 文件大小(字节)
  • tmp_name 文件存放在服务器上的临时文件名
  • error 如果发生错误,保存的错误代码

从安全角度,最好重命名上传的文件,要完成这一任务,需要设计一个系统,能够生成一个新的唯一的文件名,并在一个文本文件或数据库中同时保存原始文件名和新文件名。


« 前一篇