预览模式: 普通 | 列表

PHP的文件与目录操作

点击下载此文件1

不仅是用PHP设计程序,用其他的语言设计程序也离不开对文件的操作。文件的操作在很多web 系统中被
反复用到。
在PHP的实际应用中会遇到文件和目录的创建、修改和删除等。
PHP中对目录的操作
在PHP对目录操作,其实也就是对文件夹(操作系统用于管理文件的群组)进行操作。
打开目录
PHP中打开目录的函数为opendir,语法如下:
Opendir(string path)
该函数返回一个资源对象,其中path 为路径。
例如:
<?php
$dir = “php/”;
if(is_dir($dir)) //is_dir 函数判断路径的有效性,其语法如下:bool is_dir(string path)
$dir_res = opendir($dir);
else
echo “目录不存在或者不是一个有效的目录”;
?>
关闭目录
PHP中关闭目录的函数为closedir,语法如下:
Void closedir(dir_resource)
dir_resource 指的是使用opendir 函数返回的资源对象。
例如:
<?php
Closedir($dir_res);
?>
如何创建目录
PHP中创建目录的函数为mkdir,语法如下:
Bool mkdir(string pathname)
Pathname 为要创建的目录的地址。
例如:
<?php
2
$dir = “php/”;
if(!is_dir($dir))
mkdir($dir);
?>
可以看到,在存放这段代码的文件夹下创建了一个PHP 文件夹。
如何读取目录中的文件
PHP中读取目录中的文件的函数为readdir,语法如下:
String readdir(dir_resource)
dir_resource 指的是使用opendir 函数返回的资源对象。该函数按照文件系统的文件排序返回文件名。
例如:
<?php
$dir = “php/”;
$dir_res = opendir($dir);
while($filen = readdir($dir_res ))
{ echo $
filen.”<br>”;
} closedir($dir_res);
?>
结果:
. ..P
hp.txt
注意:“.”表示当前目录,“..”表示上一级目录。
删除目录
PHP中删除目录的函数为rmdir,语法如下:
Bool rmdir(string pathname)
Pathname 为要删除的目录地址。
例如:
<?php
$dir = “php/”;
if(is_dir($dir))
rmdir($dir);
?>
注意:删除目录时,目录中必须是空的。
PHP对文件的操作
在PHP中,文件不仅指的是本地文件还包括远程文件。
打开文件
3
PHP中打开文件的函数为fopen,该函数将返回一个资源对象,以存储当前的文件资源,语法如下:
Fopen(string filename,string mode)
Filename 为文件名或者文件所在的路径,mode 为文件的打开模式。
Fopen 函数中mode 参数的取值
Mode 的值说明
r 只读方式打开,文件指针指向文件头
r+ 读写方式打开,将文件指针指向文件头
w 写入方式打开,如果文件存在则清空,不存在则创建
w+ 读写方式打开,如果文件存在则清空,不存在则创建
a 写入方式打开,如果文件存在则追加,不存在则创建
a+ 读写方式打开,如果文件存在则追加,不存在则创建
x 写入方式打开,如果文件存在则打开失败,不存在则创建
x+ 读写方式打开,如果文件存在则打开失败,不存在则创建
关闭文件
PHP中关闭文件的函数为fclose,语法如下:
Void fclose(file_resource)
file_resource 为使用fopen 函数后返回的资源对象。
例如:
<?php
$file = fopen(“php\\php.txt”,”r”);
echo fgetc($file);
fclose($file);
?>
写入文件
PHP中写入文件的函数为fclose,语法如下:
Int fclose(file_resource,string str [,int length])
file_resource 为使用fopen 函数后返回的资源对象,str 为要写入的字符串,length 为指定的字符串长度。
例如:
<?php
$filename = “php\\php.txt”;
$file = fopen($filename,”w”);
fwrite($file,”This is www.phpdo.net\n”);
fwrite($file,”This is a php test\n”);
fclose($file);
?>
打开文件夹,可以看到里边有两行语句:This is www.phpdo.net 和This is a php test。
读取文件
在PHP中最常用的读取文件的函数有三个:fgetc、fgets 和fread。
Fgetc 函数用于读取文件中的一个字符,语法如下:
4
String fgetc(file_resource)
file_resource 为使用fopen 函数后返回的资源对象,该函数返回文件中的一个字符并将指针移动到下一个字
符。
例如:
<?php
$file = fopen(“php\\php.txt”,”r”);
echo fgetc($file);
fclose($file);
?>
结果:T。
Fgets 函数用于读取文件中的一行字符,语法如下:
String fgets(file_resource)
file_resource 为使用fopen 函数后返回的资源对象,该函数返回文件中的一行字符并将指针移动到下一行。
例如:
<?php
$file = fopen(“php\\php.txt”,”r”);
echo fgets($file);
fclose($file);
?>
结果:
This is www.phpdo.net
Fread 函数用于读取文件中的任意字符,语法如下:
String fread(file_resource,int length)
file_resource 为使用fopen 函数后返回的资源对象,length 为将要读取的字符串长度。
例如:
<?php
$file = fopen(“php\\php.txt”,”r”);
echo fread($file,26);
fclose($file);
?>
结果:
This is www.phpdo.net This
可以看到,文件并没有完全被输出,这种情况下应该怎么办呢?
使用filesize 函数获取文件全部内容,然后返回文件的字节数,语法如下:
Int filesize(string filename)
例如:
5
<?php
$filename = “php\\php.txt”;
$file = fopen($filename,”r”);
$filesize = filesize($filename);
echo fread($file,$filesize);
fclose($file);
?>
结果:
This is www.phpdo.net This is a php test
复制文件
PHP中复制文件的函数为copy,语法如下:
Bool copy(string filename1,string filename2)
Filename1为源文件和其路径,filename2为目标文件及其路径。
例如:
<?php
$filename1 = “php\\php.txt”;
$filename2 = “php\\php2.bak”;
copy($filename1 ,$filename2);
?>
可以看到,在PHP.txt 文件的旁边出现了一个php2.bnk 文件。
删除文件
PHP中删除文件的函数为unlink,语法如下:
Bool unlink(string filename)
Filename 为文件的名称及其路径。
例如:
<?php
$filename = “php\\php2.bak”;
unlink($filename);
?>
可以看到,php2.bnk 文件被删除了。
PHP对本地文件操作实例——留言本
在使用PHP编程前,需要对自己的项目有想法。留言本有什么功能呢?毫无疑问,留言。留言之后,还应该
让客户查看其留言。
功能实现
这个PHP 留言本都该有什么呢?
6
用户发表的标题
用户的注册名
发表的内容
到此就清楚了,留言本的实现需要两个模块:一个静态html 页面,提供表单供用户输入和一个php 页面,用
于接收用户的输入并将结果保存。
以下是html 页面,Post.html :
<html>
<head>
<title>www.phpdo.net 的留言本实战</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
</head>
<body>
<h1><p align=”center”>www.phpdo.net 的留言本</p></h1>
<form method=”post” action=”Post.php”>
<table width=”500″ border=”0″ align=”center” cellpadding=”0″ cellspacing=”0″>
<tr>
<td>标题</td>
<td><input size=”50″></td>
</tr>
<tr>
<td>作者</td>
<td><input size=”20″</td>
</tr>
<tr>
<td>内容</td>
<td><textarea cols=”50″ rows=”10″></textarea></td>
</tr>
</table>
<p align=”center”>
<input value=”Submit”>
<input value=”Reset”>
</p>
</form>
</body>
</html>
PHP页面的实现,文件名为Post.php :
<?php
$path = “post/”; //指定存储路径
$filename = “S”.date(“YmdHis”).”.dat”; //由当前时间产生文件名
$fp = fopen($path.$filename,”w”); //以写方式创建并打开文件
fwrite($fp, $_POST["title"].”\n”); //写入作者
fwrite($fp, $_POST["author"].”\n”); //写入作者
fwrite($fp, $_POST["content"].”\n”); //写入内容
fclose($fp);
echo “您在www.phpdo.net 的留言发表成功”; //提示留言发表成功
echo “<a href=’Index.php’>返回首页</a>”;
?>
在post.htnl 页面内输出内容,可以看到,在post 文件夹下多处了一个文件。
显示留言
Display.php 代码如下:
<?php
$path = “post/”; //定义路径
7
$dr = opendir($path); // 定义目录
while($filen = readdir($dr)) //循环读取目录中的文件
{ if($filen != “.” and $
filen != “..”)
{
$fs = fopen($path.$filen,”r”);
echo “<B>标题: </B>”.fgets($fs).”<BR>”;
echo “<B>作者: </B>”.fgets($fs).”<BR>”;
echo “<B>内容: </B><PRE>”.fread($fs,filesize($path.$filen)).”</PRE>”;
//<PRE>被包围在pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。
echo “<HR>”; //输入一条线用来隔开每条留言
fclose($fs);
}} closedir($dr); //关
?>

Tags: php

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1904

PHP5文件的操作

 一、引论

 
在任何计算机设备中,文件是都是必须的对象,而在web编程中,文件的操作一直是web程序员的头疼的地方,而,文件的操作在cms系统中这是必须的,非常有用的,我们经常遇到生成文件目录,文件(夹)编辑等操作,现在我把php中的这些函数做一详细总结并实例示范如何使用.,关于对应的函数详细介绍,请查阅php手册.此处只总结重点.和需要注意的地方.(这在php手册是没有的.)
 
二、目录操作
 
首先介绍的是一个从目录读取的函数,opendir(),readdir(),closedir(),使用的时候是先打开文件句柄,而后迭代列出:
 
<?php
$base_dir = "filelist/";
$fso   = opendir($base_dir);
echo $base_dir."<hr/>"   ;
while($flist=readdir($fso)){
echo $flist."<br/>" ;
}
closedir($fso)
?>
 
这是讲返回文件目录下面的文件已经目录的程序(0文件将返回false).
 
有时候需要知道目录的信息,可以使用dirname($path)和basename($path),分别返回路径的目录部分和文件名名称部分,可用disk_free_space($path)返回看空间空余空间.
 
创建命令:
 
mkdir($path,0777)
 
,0777是权限码,在非window下可用umask()函数设置.
 
rmdir($path)
 
将删除路径在$path的文件.
 
dir -- directory 类也是操作文件目录的重要类,有3个方法,read,rewind,close,这是一个仿面向对象的类,它先使用的是打开文件句柄,然后用指针的方式读取的.,这里看php手册:
 
<?php
$d = dir("/etc/php5");
echo "Handle: " . $d->handle . "\n";
echo "Path: " . $d->path . "\n";
while (false !== ($entry = $d->read())) {
    echo $entry."\n";
}
$d->close();
?>
 
输出:
 
Handle: Resource id #2
Path: /etc/php5
.
..
apache
cgi
cli
 
文件的属性也非常重要,文件属性包括创建时间,最后修改时间,所有者,文件组,类型,大小等.
 
下面我们重点谈文件操作.
 
 
三、文件操作
 
● 读文件
 
首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
 
<?php
$file = 'dirlist.php';
if (is_readable($file) == false) {
         die('文件不存在或者无法读取');
} else {
         echo '存在';
}
?>
 
判断文件存在的函数还有file_exists(下面演示),但是这个显然无is_readable全面.,当一个文件存在的话可以用
 
<?php
$file = "filelist.php";
if (file_exists($file) == false) {
         die('文件不存在');
}
$data = file_get_contents($file);
echo htmlentities($data);
?>
 
但是file_get_contents函数在较低版本上不支持,可以先创建文件的一个句柄,然后用指针读取全部:
 
         $fso = fopen($cacheFile, 'r');
         $data = fread($fso, filesize($cacheFile));
         fclose($fso);
 
还有一种方式,可以读取二进制的文件:
 
$data = implode('', file($file));
 
● 写文件
 
和读取文件的方式一样,先看看是不是能写:
 
<?php
 
$file = 'dirlist.php';
if (is_writable($file) == false) {
         die("我是鸡毛,我不能");
}
?>
 
能写了的话可以使用file_put_contents函数写入:
 
<?php
$file = 'dirlist.php';
if (is_writable($file) == false) {
         die('我是鸡毛,我不能');
}
$data = '我是可鄙,我想要';
file_put_contents ($file, $data);
?>
 
file_put_contents函数在php5中新引进的函数(不知道存在的话用function_exists函数先判断一下)低版本的php无法使用,可以使用如下方式:
 
$f = fopen($file, 'w');
fwrite($f, $data);
fclose($f);
 
替换之.
 
写文件的时候有时候需要锁定,然后写:
 
function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
   $this->warns('无法打开缓存文件.');//trigger_error
   return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
   $this->warns('无法锁定缓存文件.');//trigger_error
   return false;
}
if(!fwrite($fso,$pagedata)){//写入字节流,serialize写入其他格式
   $this->warns('无法写入缓存文件.');//trigger_error
   return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}
 
● 复制,删除文件
 
php删除文件非常easy,用unlink函数简单操作:
 
<?php
$file = 'dirlist.php';
$result = @unlink ($file);
if ($result == false) {
         echo '蚊子赶走了';
} else {
         echo '无法赶走';
}
?>
 
即可.
 
复制文件也很容易:
 
<?php
$file = 'yang.txt';
$newfile = 'ji.txt'; # 这个文件父文件夹必须能写
if (file_exists($file) == false) {
         die ('小样没上线,无法复制');
}
$result = copy($file, $newfile);
if ($result == false) {
         echo '复制记忆ok';
}
?>
 
可以使用rename()函数重命名一个文件夹.其他操作都是这几个函数组合一下就能实现的.
 
● 获取文件属性
 
我说几个常见的函数:
获取最近修改时间:
 
<?php
$file = 'test.txt';
echo date('r', filemtime($file));
?>
 
返回的说unix的时间戳,这在缓存技术常用.
 
相关的还有获取上次被访问的时间fileatime(),filectime()当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时间,fileowner()函数返回文件所有者
 
$owner = posix_getpwuid(fileowner($file));
 
(非window系统),ileperms()获取文件的权限,
 
<?php
$file = 'dirlist.php';
$perms = substr(sprintf('%o', fileperms($file)), -4);
echo $perms;
?>
 
filesize()返回文件大小的字节数:
 
 
<?php
 
// 输出类似:somefile.txt: 1024 bytes
 
$filename = 'somefile.txt';
echo $filename . ': ' . filesize($filename) . ' bytes';
 
?>
 
获取文件的全部信息有个返回数组的函数stat()函数:
 
<?php
$file = 'dirlist.php';
$perms = stat($file);
var_dump($perms);
?>
 
那个键对应什么可以查阅详细资料,此处不再展开.
 
四、结束语
 
上面我简要的总结了一下几个文件操作,如果您熟练掌握以上列出的函数,已经在操作的时候没什么大的问题,php文件操作的函数变化比较快,现在已经非常强大了,文件这部分也是学习php非常重要的一部分,希望不要忽略.
 
 
 
 
 
 
 
 
 
 
 
 
***********************************************
PHP中对各类数据库的操作有着支持,对文件的操作也同样有着很丰富的操作方法,很多朋友现在的操作还是基于文件操作可是有的时候在操作文件的时候还存在不少的困惑和疑点,以下是我在日常编写过程中碰到的以及坛上朋友所碰到的关于文件操作的一些问题收藏吧。
问:如何新建一个文件?
答:1、使用fopen("要建立的文件名","参数"),参数可选 w,w+,a,a+
2、使用exec("echo '' > 要建立的文件名");这样是使用系统方式建立这个文件,你还可以使用touch这个linux命令来建立
问:为什么我无法建立文件?
答:1、如果你使用了fopen建立文件,是否正确的使用了参数
2、系统权限问题,请询问你的WEBMASTER你的FTP目录是否有写的权限
3、FTP权限问题,你要确认你的PHP文件所要写文件所在目录要有写的权限,也就是你的FTP软件登陆后other组要有写这个权限,
如果没有请修改权限后尝试
问:如何将文件读入数组?
答:使用file
问:如何将文件全部读出?
答:1、使用fread($fp);
2、如果你的PHP版本>=4.3.0的话可以使用file_get_contents();
问:如何判断文件是否存在?
答:使用file_exists();为什么不使用fopen()来判断呢?原因是有时候是因为权限问题导致fopen返回的数据引导我们错误的判断
问:为什么当我读取一个WEB页面的时候出错?
答:1、可能是你的传递参数错,当读取WEB页面的时候你只可以使用r方式读取页面
2、确保你要读取的WEB页面可以访问
问:我如何才能获得文件的相关属性?
答:PHP提供了一组获得文件属性的方法,例如 filemtime(),fileowner(),filegroup(),filectime(),fileatime()...详细的使用
请参阅手册。
问:PHP打开文件后是否可以象C一样进行文件“游标”的定位呢?
答:可以的,使用fseek();
问:我想在访问文件的时候不允许其他人也访问此文件,怎么办?
答:1、你可以采用其他方面程序限制用户接入文件操作的页面
2、使用flock();详细的参数以及使用方法请参阅手册
问:如何删除文件内第一行,或指定一行数据?
答:PHP并没有提供这样的操作方法,不过我们可以通过组合使用,以下代码演示我们将删除文件"test.dat"中的第三行数据(test.datw
文件中数据不止三行)
$filename="test.dat";//定义操作文件
$delline=3; //要删除的行数
if(!file_exsits($filename)){
die("指定文件未发现!操作中断!");
}
$farray=file($filename);//读取文件数据到数组中
for($tmpa=0;$Tmpa
if(strcmp($Tmpa+1,$delline)==0){
//判断删除的行
continue;
}
//重新整理后的数据
$newfp.=$farray[$Tmpa]."\r\n";
}
$fp=@fopen($filename,"a") or die("写方式打开文件 $filename 失败");//我们以写的方式打开文件
@fputs($fp,$newfp) or die("文件写入失败");
@fclose($fp);
?>
以上代码演示的是删除一行文件,不过你如果仔细的看的话,其实也给你提供了其他的文件操作的相关提醒~
问:当我试图打开一个不存在的文件的时候,我如何不让错误显示出来以避免我的路径泄露!!
答:在你要打开文件的方法前增加@符号用来屏蔽错误,@是PHP提供的错误信息屏蔽的专用符号或您可以在这个要操作的步骤前增加(通常是在页首)error_reporting(0);用来屏蔽页面内所有错误信息的显示一个不推荐的方法就是去修改php.ini(ISP除外)
问:我使用的是虚拟主机,我如何防止其他用户窃取我的数据?
答:建议ISP修改php.ini中的open_basedir进行限制,不推荐的ISP设置是将fopen,file等文件操作加入disable_function中。
问:为什么我用PHP建立文件后我FTP登陆要删除这些文件无法删除??
答:主要是因为PHP建立的文件归属WEB用户组,也就是建立的文件,并非是你FTP用户的!!!这个问题的解决就是,使用PHP程序的chmod,unlink等方式进行处理,建议用户在使用PHP建立文件的时候记得chmod文件权限,建议为777
问:如何使用文本文件作为数据仓库?有的留言本,论坛之类的都是使用这个的啊!
答:其实这个主要还是使用了file,结合explode进行数据读取与分割的典型范例而已。
问:如何更改文件名?
答:rename();
问:如何删除文件?
答:unlink(); exec("del(rm -vf) filename");注:rm -vf为linux下使用
问:如何清空文件?
答:使用fopen(filename,"w");或exec("echo '' > filename");
问:如何编辑文件内容?
答:我记得我以前回答过一个删除文件内容的,其实编辑内容在删除内容的基础上,进行变量替换就可以了。希望你可以向上找找,将我上面的continue修改为替换变量数据就可以

Tags: php

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1684

php文件读取详解

 在php中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file、file_get_contents之类的函数,简简单单的几行代码就能很漂亮的完成我们所需要的功能。但当所操作的文件是一个比较大的文件时,这些函数可能就显的力不从心, 下面将从一个需求入手来说明对于读取大文件时,常用的操作方法。


需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容。

实现方法:

1. 直接采用file函数来操作
注:由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的memory_limit = 16M来进行设置,这个值如果设置-1,则内存使用量不受限制.

下面是一段用file来取出这具文件最后一行的代码.
整个代码执行完成耗时 116.9613 (s).

$fp = fopen($file, "r");
$num = 10;
$chunk = 4096;
$fs = sprintf("%u", filesize($file));
$max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file);
for ($len = 0; $len < $max; $len += $chunk) {
$seekSize = ($max - $len &gt; $chunk) ? $chunk : $max - $len;
fseek($fp, ($len + $seekSize) * -1, SEEK_END);
$readData = fread($fp, $seekSize) . $readData;

if (substr_count($readData, "\n") &gt;= $num + 1) {
preg_match("!(.*?\n){".($num)."}$!", $readData, $match);
$data = $match[0];
break;
}
}
fclose($fp);
echo $data;


我机器是2个G的内存,当按下F5运行时,系统直接变灰,差不多20分钟后才恢复过来,可见将这么大的文件全部直接读入内存,后果是多少严重,所以不在万不得以,memory_limit这东西不能调得太高,否则只有打电话给机房,让reset机器了.

2.直接调用linux的tail命令来显示最后几行

在linux命令行下,可以直接使用tail -n 10 access.log很轻易的显示日志文件最后几行,可以直接用php来调用tail命令,执行php代码如下.
整个代码执行完成耗时 0.0034 (s)

file = 'access.log';
$file = escapeshellarg($file); // 对命令行参数进行安全转义
$line = `tail -n 1 $file`;
echo $line;


3. 直接使用php的fseek来进行文件操作

这种方式是最为普遍的方式,它不需要将文件的内容全部读入内存,而是直接通过指针来操作,所以效率是相当高效的.在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的,下面是常用的两种方法.
方法一:
首先通过fseek找到文件的最后一位EOF,然后找最后一行的起始位置,取这一行的数据,再找次一行的起始位置,再取这一行的位置,依次类推,直到找到了$num行。
实现代码如下
整个代码执行完成耗时 0.0095 (s)

function tail($fp,$n,$base=5)
{
assert($n>0);
$pos = $n+1;
$lines = array();
while(count($lines)< =$n){
try{
fseek($fp,-$pos,SEEK_END);
} catch (Exception $e){
fseek(0);
break;
}
$pos *= $base;
while(!feof($fp)){
array_unshift($lines,fgets($fp));
}
}
return array_slice($lines,0,$n);
}
var_dump(tail(fopen("access.log","r+"),10));

查看更多...

Tags: php

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 1770

w3c对语音输入有官方的说明:http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html
使用语音输入作用有:
1.提供除了键盘和鼠标的另一个输入方法,针对pc用户,当键盘不可用时也可以使用语音输入。
2.为手机用户提供更加方便的输入方法。

1.支持的浏览器
x-webkit-speech是webkit内核浏览器的私有属性(废话)。但现在只能在google的chrome 11以上才能使用。
实现过程大概是捕捉到语音后,数据发送到google的服务器进行语音识别,然后返回结果。所以没有足够强大大的研发能力和服务器资源,真没法支持这个服务。
作为普通话不标准经常被别人吐槽的人,使用语音搜索还是能十分准确地返回关键词,我顿时感动得一塌糊涂。

2.支持的标签
输入标签有input和textarea,实际上目前只有input支持。

 

查看更多...

分类:业界文摘 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2080

php CURL post使用

 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。本文将介绍 cURL 的一些高级特性,以及在PHP中如何运用它。
为什么要用 cURL?
是的,我们可以通过其他办法获取网页内容。大多数时候,我因为想偷懒,都直接用简单的PHP函数:
不过,这种做法缺乏灵活性和有效的错误处理。而且,你也不能用它完成一些高难度任务——比如处理coockies、验证、表单提交、文件上传等等。
引用:
cURL 是一种功能强大的库,支持很多不同的协议、选项,能提供 URL 请求相关的各种细节信息。
基本结构
在学习更为复杂的功能之前,先来看一下在PHP中建立cURL请求的基本步骤:
1 初始化
2 设置变量
3 执行并获取结果
4 释放cURL句柄
以下为引用的内容:
// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
// 4. 释放curl句柄
curl_close($ch);
检查错误
你可以加一段检查错误的语句(虽然这并不是必需的):
$output = curl_exec($ch);
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch);
}
请注意,比较的时候我们用的是“=== FALSE”,而非“== FALSE”。因为我们得区分 空输出 和 布尔值FALSE,后者才是真正的错误。
用POST方法发送数据
当发起GET请求时,数据可以通过“查询字串”(query string)传递给一个URL。例如,在google中搜索时,搜索关键即为URL的查询字串的一部分:
http://www.google.com/search?q=nettuts
这种情况下你可能并不需要cURL来模拟。把这个URL丢给“file_get_contents()”就能得到相同结果。
不过有一些HTML表单是用POST方法提交的。这种表单提交时,数据是通过 HTTP请求体(request body) 发送,而不是查询字串。例如,当使用CodeIgniter论坛的表单,无论你输入什么关键字,总是被POST到如下页面:
http://codeigniter.com/forums/do_search/
你可以用PHP脚本来模拟这种URL请求。首先,新建一个可以接受并显示POST数据的文件

PHP代码
  1. <?php  
  2. //使用discuzX2.0作测试  
  3. //创建cookie临时文件  
  4. $cookiefile = tempnam('./temp''cookie');  
  5. $url = 'http://dx/member.php?mod=logging&action=login&loginsubmit=yes';  
  6. $post_data = array(  
  7. 'loginfield' => 'username',  
  8. 'username' => 'ybb',  
  9. 'password' => '123456',  
  10. );  
  11. $ch = curl_init();  
  12. curl_setopt($ch, CURLOPT_URL, $url);  
  13. curl_setopt($ch, CURLOPT_HEADER, 0);  
  14. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  15. // 我们在POST数据哦!  
  16. curl_setopt($ch, CURLOPT_POST, 1);  
  17. // 把post的变量加上  
  18. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);  
  19. //保存cookie文件  
  20. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);  
  21. $output = curl_exec($ch);  
  22. //调试使用  
  23. if ($output === FALSE) {  
  24. echo "cURL Error: " . curl_error($ch);  
  25. }  
  26. curl_close($ch);  
  27. //进出到发贴页面  
  28. $post_url = 'http://dx/forum.php?mod=post&action=newthread&fid=2';  
  29. $ch = curl_init($post_url);  
  30. curl_setopt($ch, CURLOPT_HEADER, 0);  
  31. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  32. //读取cookie 文件  
  33. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);  
  34. echo $data = curl_exec($ch);  
  35. curl_close($ch);  
  36. ?>  

 

Tags: php curl

分类:技术文章 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 2874

 广告位

↑返回顶部↑