代码改变世界

第二章(打开文件、写文件、关闭文件)

2016-07-19 15:33  yojiaku  阅读(273)  评论(0编辑  收藏  举报

在前面的processorder.php文件中,我们看到这样一段代码:

@ $fp = fopen("$DOCUMENT_ROOT/orders.txt", 'ab');

if (!$fp)
{
    echo '<p><strong> Your order could not be processed at this time.  '
        .'Please try again later.</strong></p></body></html>';
    exit;
}
//move flock down here(after if)
flock($fp, LOCK_EX);

fwrite($fp, $outputstring, strlen($outputstring));
flock($fp, LOCK_UN);
fclose($fp);

 explain:

  • 第一行的 "@" 符号:通常将 @ 符号写在fopen()函数的前面,告诉PHP抑制所有由该函数(fopen())调用所产生的错误。如果没有 @ 符号,当fopen()函数出现错误的时候,就会产生类似下面的warning:

   而当我们加上这个符号时,当fopen()函数出错时,就可以出现我们想要的话:     

  • 第一行的 $fp 表示:如果fopen()函数成功地打开一个文件,该函数返回一个指向这个文件的文件指针"$fp"。当我们想读写这个文件时,将使用这个变量来访问文件。
  • 打开文件我们用fopen()函数,fopen()函数在上一篇讲过,这里不再累述。
  • 第十行的 flock() 函数:轻便的咨询文件锁定,flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型,PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。

    bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

    参数:

      handle:文件系统指针,这里的handle是指 "$fp"

      operation:【1】LOCK_SH取得共享锁定(读取的程序);【2】LOCK_EX 取得独占锁定(写入的程序);【3】LOCK_UN 释放锁定(无论共享或独占)。

      wouldblock:如果锁定会堵塞的话,可选的第三个参数会被设置为TRUE。

    返回值:成功时返回TRUE,失败时返回FALSE。

    例子:

<?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);

?>

关于 flock() 函数的具体内容看:http://php.net/manual/zh/function.flock.php

  • fwrite() 函数,我们直接引用php手册上的例子:
    <?php
    $filename = 'test.txt';
    $somecontent = "添加这些文字到文件\n";
    
    // 首先我们要确定文件存在并且可写。
    if (is_writable($filename)) {
    
        // 在这个例子里,我们将使用添加模式打开$filename,
        // 因此,文件指针将会在文件的末尾,
        // 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方。
        if (!$handle = fopen($filename, 'a')) {
             echo "不能打开文件 $filename";
             exit;
        }
    
        // 将$somecontent写入到我们打开的文件中。
        if (fwrite($handle, $somecontent) === FALSE) {
            echo "不能写入到文件 $filename";
            exit;
        }
    
        echo "成功地将 $somecontent 写入到文件$filename";
    
        fclose($handle);
    
    } else {
        echo "文件 $filename 不可写";
    }
    ?>

     

  • 最后,关于 fclose() 函数:关闭一个已打开的文件指针 bool fclose(resource $handle) 将 handle 指向的文件关闭。