第二章(打开文件、写文件、关闭文件)
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 指向的文件关闭。