1.判断文件或目录是否存在bool
file_exists(string filename)
2.取得文件名
basename(filepath)
3.打开文件
fopen(filename,mode)
4.获取文件路径信息
pathinfo(path)
5.写文件
fwrite(resource,string)
6.取绝对路径
realpath(filename)
7.关闭文件
fclose($handle)
8.复制文件
copy(source,dest)
9.读取一行数据
fgets(int handle[,int length])
10.判断是否是目录
is_dir(filename)
11.读取整个文件
readfile(filename)
12. 打开目录
opendir(path)
13.取文件大小
filesize(filename)
14.读取目录
readdir($handle)
15.删除文件
unlink()
16. 关闭目录
closedir($handle)
17.创建目录
mkdir(dirname)
18.删除目录
unlink()
19.判断文件或目录是否存在
bool file_exists(string filename)
20.判断文件或目录是否存在,存在则返回真,否则返回假
格式:
if(file_exists(“hello.txt”))
{
echo “文件存在”;
}
打开文件
格式:
fopen(filename,mode)
说明:按指定的格式打开指定的文件
filename:要打开的文件名
mode : 打开模式
fopen(“hello.txt”,”w”);
表示以写的方式打开hello.txt文件
写文件
格式:
fwrite(resource,string);
说明:在打开的文件中添加指定的内容
resource:打开的文件
string:要写入的内容
例:
$handle = fopen(“hello.txt”,”w”) //若a ,则可追加数据
fwrite($handle,”1\r\n”)
关闭文件
格式:
fclose($handle)
说明:关闭打开的文件
例:
$handle = fopen(“hello.txt”,”w”);
fclose($handle);
读取一行数据
格式:
fgets(int handle[,int length])
说明:读取length-1个字符。若没有指定length,则默认字节为1KB,
若遇到换行、EOF或则已经读取了length-1个字符,则程序终止,
出错时候返回false;
例:
$handle = fopen(“hello.txt”,”r”);
$buffer = fgets($handle,1024);
echo $handle; //输出一行信息
读取整个文件
格式:
readfile(filename)
说明:读取整个文件,并输出到浏览器
例:
<?
readfile(“hello.txt”);
?>
取文件大小
格式:
filesize(filename)
说明:获取指定文件大小,出错返回false
例:
filesize(“a.rar”)
删除文件
格式:
unlink()
说明:删除一个文件,成功则返回true,否则返回false
例:
unlink(“b.txt”)
创建目录
格式:
mkdir(dirname)
说明:创建一个目录
例:mkdir(“newfolder”); //当前目录下创建新文件夹
删除目录
格式:
rmdir(dirname)
说明:删除一个目录
例:rmdir(“newfolder”);
取得文件名
格式:
basename(filepath)
说明:从指定的路径中返回文件名
例:
basename(“c:\mytools\a.txt”) //返回a.txt
获取文件路径信息
pathinfo(path)
说明:返回文件路径信息,结果保存在数组中,数组下标为
dirname(路径) , basename(文件名) , extension(扩展名)
例:pathinfo(“c:\mytools\a.txt”)
取绝对路径
格式:
realpath(filename)
说明:取指定文件的绝对路径,失败则返回false
例:realpath(“h.txt”) //F:\apache\example\h.txt
复制文件
格式:
copy(source,dest)
说明:将source文件复制到dest处
例:copy(“h.txt”,”newfloder\a.txt”)
判断是否是目录
格式:
is_dir(filename)
说明:判断给定文件名是否是一个目录。如果filename存在并且
为目录,则返回true,否则返回false.
例:
if(is_dir(“newfolder”))
{
echo “是文件目录”;
}
打开目录
格式:opendir(path)
说明:打开一个指定文件目录,返回一个资源标示符
例:
$hand = opendir(“.”) //打开根目录
读取目录
格式:
readdir($handle)
说明:读取一个打开的文件目录流
readdir($hand);
关闭目录
格式:
closedir($handle)
说明:关闭一个打开的目录流
例:closedir($hand);
PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。
首先看看数据库永久连接的定义:
永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。
PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成Web页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有不同子进程请求SQL服务的后继页面都能够重新使用这个已经建立的 SQL服务器连接。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。每个子进程将对服务器建立各自独立的永久连接。PHP本身并没有数据库连接池的概念,但是Apache有进程池的概念, 一个Apache子进程结束后会被放回进程池, 这也就使得用mysql_pconnect打开的的那个mysql连接资源可以不被释放,而是依附在相应的Apache子进程上保存到了进程池中。于是在下一个连接请求时它就可以被复用。一切看起来似乎都很正常,但是在Apache并发访问量大的时候,如果使用mysql_pconnect,会由于之前的 Apache子进程占用的MySQL连接没有close, 很快使MySQL达到最大连接数,使得之后的请求可能得不到响应。
上面的部分文字是摘抄自PHP文档,看起来可能还是有些文绉绉的不好理解,那么我就用大白话再举一个例子来说明问题:
假设Apache配置最大连接数为1000,MySQL配置最大连接数为100,当Apache服务器接到200个并发访问的时候,其中100个涉及到数据库访问,剩下的100个不涉及数据库访问,因为这个时候还不存在可用的数据库连接,所以这里面涉及到数据库访问的100个并发会同时产生100个数据库永久连接,达到了数据库最大连接数,当这些操作没有结束的时候,任何其他的连接都无法再获得数据库连接,当这些操作结束了,相应的连接会被放入进程池,此时Apache的进程池里就有了200个空闲的子进程,其中100个是带有数据库连接的,由于Apache会为访问请求随机的挑选空闲子进程,所以你得到的子进程很可能是不包含数据库连接的那100个中的一个,而数据库连接已经达到了最大值,你也不可能成功的建立新的数据库连接,唉,你便只好不停的刷新页面,哪个时候运气好,碰巧分配到了带有数据库连接的子进程,才能正常浏览页面。如果是大访问量的网站来说,任何时候都可能存在大量的并发,所以浏览者可能就会不停的发现无法连接数据库的现象了。
或许你会说,我们把Apache和MySQL的最大连接数调成一样大不就可以了么?是的,合理的调整这个最大连接数某种程度上会避免这个问题的发生,但是Apache和MySQL的负载能力是不同的,如果按照Apache的负载能力来设置,对于MySQL来说,这个最大连接数就偏大,会产生大量的 MySQL数据库永久连接,打个比方,就好像和平时代还要养活一个几百万的军队一样,其开销得不偿失;而如果按照Mysql的负载能力设置,对于 Apache来说,这个最大连接数就偏小,有点杀鸡牛刀的感觉,无法发挥Apache的最大效率。
所以按照PHP手册上的介绍,只适合在并发访问不大的网站上使用数据库永久连接,但对于一个并发访问不大的网站来说,使用数据库永久连接带来的效率提高似乎没有太大的意义,从这个角度上来看,我觉得PHP中的数据库永久连接基本上是一个鸡肋的角色,如果你一定要使用数据库连接池的概念,可以尝试一下sqlrelay或者Apache本身提供的mod_dbd,说不定会有惊喜。
array mysql_fetch_row(int result)
参数说明如下。
result:由函数mysql_query()或mysql_db_query()返回的结果标识,用来指定所要获取的数据的SQL语句类型。
函数返回值如下。
成功:一个数组,该数组包含了查询结果集中当前行数据信息,数组下标范围0~记录属性数−1,数组中的第i个元素值为该记录第i个属性上的值。
失败:false。
下面的mysql_fetch_row()使用示例功能同5.5.1中示例。
1 <!------使用mysql_fetch_row()来获取数据:mysql_fetch_row.php------>
2 <?php
3 //连接并选择到数据库服务器
4 $connection = mysql_connect ("localhost", "root", "password");
5 mysql_select_db("Books", $connection);
6 //查询数据
7 $query="SELECT * FROM Computers ";
8 $query.="WHERE price >= 20";
9 //echo $query."<br>";
10 $result=mysql_query($query,$connection);
11 //用mysql_fetch_row()获得数据,并输出
12 while($row=mysql_fetch_row($result))
13 {
14 echo "书名: ".$row[1]."<br>";
15 echo "价格: ".$row[2]."<br>";
16 echo "出版日期: ".$row[3]."<br>";
17 echo "<br>";
18 }
19 ?>
mysql_fetch_row()获得当前行的数据信息,在被引用后,自动滑动至下一行。本例中在第12行对其的引用为:
while($row=mysql_fetch_row($result))
在这个循环中,每一次mysql_fetch_row()都获得当前行数据,并赋值给数组$row,然后自动滑向下一行;在取出最后一行后,函数将返回false,循环结束。这样,就可以把结果集中的所有数据逐行取出并显示。
注意
mysql_fetch_row()返回结果数组的下标对应着不同属性上的值,且只能通过下标方式,而不能使用属性名方式获得属性上的值,在实际应用中容易引起混乱,一定要仔细使用。同时,应注意在使用中不要使用越界下标。
示例正确运行的结果如下。
书名: 数据结构
价格: 20
出版日期: 2001-01-01
书名: C语言
价格: 23
出版日期: 1998-04-04
书名: PHP入门技术
价格: 22
出版日期: 2005-05-01