使用cURL
讨论的最后一个与网络相关的主题是一个名为cURL的技术,其名称代表“客户(client)URL”。(cURL还经常被写为curl或Curl)这是一个处理URL的命令行工具,能够访问Web站点、FTP文件等。PHP可以通过shell_exec()和其他系统函数使用cURL,同时还支持一个cURL库:libcurl。整个操作过程的第一步是使用curl_init()函数,向它传递要访问的URL。
$curl = curl_init("www.wangzhanchengxu.com");
函数的返回值应该赋予一个变量,它将作为一个事务指针或句柄。接下来使用curl_setopt()函数设置选项,其语法如下所示。
curl_setopt($curl, CONSTANT, value);
这里可用的选项实在太多了,后面的范例里将展示一些。如果程序员需要使用cURL,请查看PHP手册来了解完整的设置列表。在设置了选项之后(次序随意),使用curl_exec()来执行事务。
$result = curl_exec($curl);
一般来说,需要把这个函数的返回值赋予一个变量,以便显示其结果。最后,关闭连接。
curl_close($curl);
cURL的伟大之处在于它能够完成本章其他范例所做的全部工作,但在下面的范例里,我们将用它来完成fopen()、fsockopen()等函数不能做的事情:打开一个Web页面并向它发送数据(就好像它提交了一个表单)。第4章曾经介绍过用PEAR的Auth模块向Web页面添加数据库驱动的身份验证,只有当用户提交了有效的用户名/密码组合之后,他们才能访问这个页面,否则就会看到一条消息来提示他们进行登录。
PHP利用cURL库向需要登录才能访问的页面发送数据。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Using cURL</title> </head> <body> <?php $url="http://www.wangzhanchengxu.com/uploadfile/phpfile/session_02.php"; //开始cURL事务 $curl=curl_init($url); //让cURL在发生错误时终止运行, 第一个选项是CURLOPT_FAILONERROR, 把它设置为true(或1)之后, cURL就会在发生错误时停止执行(而不是继续)。 curl_setopt($curl, CURLOPT_FAILONERROR, 1); //让cURL允许重定向, 这个选项设置了重定向(比如PHP的header("Location:somepage.php")调用)应该导致事务停止还是跟随重定向的页面。 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); //让cURL把返回的结果赋予变量, 如果不需要使用由cURL请求返回的数据, 就不必启动这个选项, 本例将显示数据作为确认信息, 所以这个选项被设置为1。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //设置超时时间, 这是事务处理所能占用的最长时间,以秒为单位。 curl_setopt($curl, CURLOPT_TIMEOUT, 5); //让cURL使用POST方法, 在本例中, 数据将被发送到页面(http://www.wangzhanchengxu.com/login.php), 就像提交了一个表单一样。 curl_setopt($curl, CURLOPT_POST, 1); //设置POST数据, CURLOPT_POSTFIELDS选项用于设置POST数据, 其语法是一系列名称=值对, 由&符号分隔。 curl_setopt($curl, CURLOPT_POSTFIELDS, "name=".urlencode("Shake It Off")); //执行事务 $r=curl_exec($curl); //关闭连接 curl_close($curl); //显示结果, 这个请求返回的全部数据都被赋予变量$r, 本例会显示这些数据。由于我们知道它是一组HTML代码, 所以将把它显示在一组预定义的标记里, 并且使用htmlentities()函数, 其结果是以HTML标记的形式显示另一个页面的HTML代码。 echo "<h2>cURL Results: </h2><pre>".var_export(htmlentities($r),true)."</pre>"; ?> </body> </html>