目录
1.文件环境变量
2.文件相关知识
3.有关文件函数
2.写文件
3.关闭文件:
4.其他函数
1.文件环境变量
<?php
echo $_SERVER['DOCUMENT_ROOT'] .PHP_EOL; //根目录的路径
echo $_SERVER['PHP_SELF'] .PHP_EOL;//从根目录到文件的路径
echo $_SERVER['SCRIPT_FILENAME'] .PHP_EOL;//文件的绝对路径
echo $_SERVER['REQUEST_METHOD'] .PHP_EOL;//请求方法
2.文件相关知识
. 表示当前目录
.. 表示当前目录的上一级目录。
类似于LInux一样,创建文件要么从根目录开始,要么当前目录
YK文件夹下面有sourcce文件,YK文件夹和Default在同一目录下,所以只可以先进入上一级目录,才可以进入Default文件
在PHP中创建文件时,如果想要创建的文件在某个目录下,该目录必须要存在
3.有关文件函数
fopen()函数返回一个文件指针,该指针指向文件的首地址
fopen('文件名',’打开方式‘);
$fp = fopen("$document_root/orders.txt",'ab');
模式 | 模式名称 | 意 义 |
---|---|---|
r | 只读 | 读模式一打开文件,从文件头开始读 |
r+ | 只读 | 读写模式——打开文件,从文件头开始读写 |
w | 只写 | 写模式一一打开文件,从文件头开始写。如果该文件已经存在,将删除所有文 件已有内容。如果该文件不存在,函数将创建这个文件 |
w+ | 只写 | 写模式一一打开文件,从文件头开始读写。如果该文件已经存在,将删除所有 文件已有内容。如果该文件不存在,函数将创建这个文件 |
X | 谨慎写 | 写模式打开文件,从文件头开始写。如果文件已经存在,该文件将不会被打开, fopen()函数将返回false,而且PHP将产生一个警告 |
*X+* | 谨慎写 | 读/写模式打开文件,从文件头开始写。如果文件已经存在,该文件将不会被 打开,fopen。函数将返回false,而且PHP将产生一个警告 |
a | 追加 | 追加模式一打开文件,如果该文件已有内容,将从文件末尾开始追加写,如 果该文件不存在,函数将创建这个文件 |
a+ | 追加 | 追加模式一打开文件,如果该文件已有内容,将从文件末尾开始追加写(或 者读),如果该文件不存在,函数将创建这个文件 |
b | 二进制 | 二进制模式一用于与其他模式进行连接。如果文件系统能够区分二进制文件 和文本文件,你可能会使用它。Windows系统可以区分;而UNIX则不区分。推 荐一直使用这个选项' 以便获得最大程度的可移植性。二进制模式是默认的模式 |
*t* | 文本 | 用于与其他模式的结合。这个模式只是Windows系统下一个选项。它不是推荐 选项,除非你曾经在代码中使用了b选项 |
2.写文件
fwrite($fp, $outputstring, strlen($outputstring));
$fp,:文件指针,可以理解为从哪个地方开始写
$outputstring,:要写的内容,注意:文件中的空格是’,'\t',换行是\n
strlen($outputstring):写入的文件长度
调用这个函数的前提是,要以写的方式打开文件
3.关闭文件:
fclose($fp);
打开文件之后一定要关闭
4.其他函数
1.feof($fp),如果文件指针指向文件末尾则返回true,否则返回false
2.每次读取一行数据:
$string = fgets($fp)
$string = fgetss($fp,【length,tags】)
$arr =fgetcsv()
3.读取整个文件
$int = readfile(文件路径,【include_path】);
调用readfile()函数将打开这个文件,并且将文件内容输岀到标准输出(浏览器)中, 然后再关闭这个文件。
4.读取一个字符
$ char = fgetc($fp)
<?php
$fp = fopen('order.txt', 'rb');while(!feof($fp))
{$char = fgetc($fp);echo $char;
}fclose($fp);
5.读取任意长度
$ string = fread($fp,length);
6.文件是否存在:$int = file_exists(文件名) (判断文件是否存在)
if(file_exists("text"))//filesize(文件名)
{echo "<p>文件存在</p>";
}
else
{echo "<p>文件不存在</p>";
}
7.确定文件大小: $int = filesize(文件名); (结合fread()函数,可以使用它们一次读取整个 文件)
8.删除一个文件:$inttrue = unlink(文件名)
9.文件锁定
假设遇到这种情况,两个客户试图同时订购同一件商品(这种情况并不少见,尤其 是当网站上遇到某种程度的网络堵塞时)。如果一个客户调用fopen()函数打开一个文件 并且开始写这个文件,而此时其他客户也调用了 fopen()函数打开这个文件并且要写这个 文件,将会出现什么情况呢?文件的最终内容是什么?第一个订单后面就是第二个订单 吗?还是恰好相反呢?订单是第一个客户的还是第二个客户的?或者将变成一些没用的东 西,就像两个订单交错在一起?这些问题的答案取决于操作系统,但是,通常都是不可 知的。
为了避免这样的问题,可以使用文件锁定的方法。在PHP中,文件锁定是通过flock() 函数来实现的。当一个文件被打开并且在进行读写操作之前,应该调用这个函数。
flock()函数原型如下所示:
bool flock (resource fp, int operation [, int ^.wouldblock])
还必须将一个指向被打开文件的指针和一个表示所需锁定类型的常数作为参数传递给 这个函数。如果文件锁定成功,其返回值为true,否则为false。如果获得文件锁将导致当 前的进程被阻塞(也就是,不得不等待),可选的第3个参数将包含值trueo
operation参数的可能值如表下
操作值 | 意义 |
LOCK_SH | 读操作锁定。这意味着文件可以共享,其他人可以读该文件 |
LOCK_EX | 写操作锁定。这是互斥的,该文件不能共享 |
LOCK_UN | 释放已有的锁定 |
LOCK_NB | 防止在请求加锁时发生阻塞(Windows系统不支持) |
如果打算使用flock。函数,必须将其添加到所有使用文件的脚本中;否则,就没有任 何意义°
请注意,flock。函数无法在NFS或其他网络文件系统中使用。它还无法在其他更早不 支持文件锁定的文件系统中使用,例如FATO在某些操作系统中,它是在进程级别上实现 的,因此,如果你在多线程服务器API中使用,该函数也无法正确使用。
要在这个示例中使用flock()函数,可以对processorder.php脚本进行如下所示的修改:
@ $fp = fopen ("$document_root/. . /orders/orders. txt '*, ' ab1);
flock($fp, LOCK_EX);
if (!$fp) (
echo "<p><strong> Your order could not be processed at this time.
Please try again later.</strong></p></body></htTnl>M ;
exit;
}
fwrite($fp, $outputstring, strlen($outputstring));
flock($fp, LOCK_UN);
fclose($fp);
还应该在vieworders.php脚本中添加如下所示的文件锁:
@$fp = fopen("$document_root/../orders/orders.txt", 'rb');
flock($fp, LOCK_SH); // lock file for reading
// read from file
flock($fp, LOCK_UN); // release read lock
fclose($fp);