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

0开始之前


1文件相关操作


操作文件的相关步骤:打开文件 → 进行操作 → 关闭文件

  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');
  1. 进行操作
    ◦写文件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/>";
}
  1. 关闭文件
    调用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文件上传


  1. 实例之前,须知道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",以告诉服务器关于上传文件的类型

  1. 编写处理文件的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使用目录函数


  1. 从目录读取
    使用基本目录函数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);
  1. 获得当前目录的信息
    dirname($path)函数:返回路径的目录部分
    basename($path)函数:返回路径的文件名称部分
    disk_free_space($path)函数:返回目录所在分区的可用空间(以字节为单位)
  2. 创建和删除目录
    创建目录使用mkdir()函数,可以按如下创建目录:
  $oldumask = umask(0);   //对于Windows系统是无效的
  mkdir("/tmp/testing",0777);
  umask($oldumask);

函数rmdir()讲删除一个目录,要注意,要删除的目录必须是一个空目录。

4与文件系统的交互


  1. 获取文件信息的相关函数
    参照手册
  2. 更改文件属性
    参照手册
  3. 创建、删除和移动文件
    调用touch()函数来创建一个文件、调用unlink()函数来删除一个文件、调用copy()函数来复制文件、调用rename()函数来重命名(移动)文件

5使用程序执行函数和与环境变量的交互


可以使用4种主要的技术在Web服务器上执行命令:
exec() passthru() system() 反引号
可以使用getenv()putenv()来设置运行PHP的服务器上的环境变量。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,015评论 3 53
  • 一、会话控制(session与cookie) 1.cookie简介 Cookie是存储在客户端浏览器中的数据,我们...
    空谷悠阅读 616评论 0 5
  • PHP:include()``include_once()``require()``require_once() ...
    寻梦xunm阅读 845评论 1 4
  • 对象:至少有一种编程语言经验者目标:扫除你的畏惧,快速上手PHP当然你也可以直接看官方手册 1.开发工具 对于初学...
    BeanDu阅读 678评论 1 3
  • 1.文件操作 打开关闭文件 打开文件 $file = "test.txt";$fh = fopen( $file,...
    寒梁沐月阅读 666评论 0 0