php的curl实现get和post
类似于dreamhost这类主机服务商,是显示fopen的使用的。使用php的curl可以实现支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传,kerberos、基于HTT格式的上传、代理、cookie、用户+口令证明、文件传送恢复、http代理通道就最常用的来说,是基于http的get和post方法。
代码实现:
1、http的get实现
$ch = curl_init("http://tech.ddvip.com/") ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ;
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ;
$output = curl_exec($ch) ;
$fh = fopen("out.html", 'w') ;
fwrite($fh, $output) ;
fclose($fh) ;
2、http的post实现
//extract data from the post
extract($_POST) ;
//set POST variables
$url = 'http://tech.ddvip.com/get-post.php' ;
$fields = array(
'lname'=>urlencode($last_name) ,
'fname'=>urlencode($first_name) ,
'title'=>urlencode($title) ,
'company'=>urlencode($institution) ,
'age'=>urlencode($age) ,
'email'=>urlencode($email) ,
'phone'=>urlencode($phone)
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&' ; }
rtrim($fields_string ,'&') ;
//open connection
$ch = curl_init() ;
//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL,$url) ;
curl_setopt($ch, CURLOPT_POST,count($fields)) ;
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string) ;
//execute post
$result = curl_exec($ch) ;
//close connection
curl_close($ch) ;
CURL 是 Client URL Library Functions 的缩写,由 Daniel Stenberg 创建,更多内容可以参考他的网站。最近几天突然对 HTTP 采集有了兴趣。之前我在做这方面程序,一般通过两种方法,一个是利用 PHP 自身的文件操作函数。PHP 的 fopen,readfile 都是可以支持 http 协议的,这样可以很方便的获取互联网上的内容。另一种方法是通过 PHP 的 Socket 函数,这个方法的好处是对各种协议都可以支持,缺点是使用起来比较麻烦,要对协议有一定的了解。在 HTTP 获取方面,运用 Socket 的 Snoopy 类是一个非常好用的 PHP HTTP 客户端,也是我原来最常用的方法。
随便翻翻 PHP 手册就会发现,PHP 本身可以支持 libcurl。用 C/C++ 写成的 libcurl 相比 Snoopy 更快速更可靠,而且除了 HTTP 协议外,还广泛支持其他协议( https, ftp, ladp 等等)。libcurl 并不是 PHP 默认加载的模块,具体如何启用可以参考 PHP 手册,这里就不多说了。PHP libcurl 使用非常简单,例如:
<?php
$ch = curl_init("http://www.php.net");
curl_exec($ch);
curl_close($ch);
?>
三行简单的程序就可以完成对 http://www.php.net 页面的读取并输出。当然更多的用法可以参考 PHP 手册。这里只说说我在写程序时遇到的一个问题,例如下面的程序:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容
curl_exec($ch); //执行 (1)
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容
curl_exec($ch); //执行 (2)
curl_close($ch);
?>
按照我的想法,程序应该可以分别返回 HTTP 响应报头和页面的内容。可是上面这段程序执行结果为:(1)处正常返回 HTTP 响应报头,(2)不会返回任何内容。查了很多资料都没有提到这个问题。最终无奈,只好在读取(2)之前重新执行 curl_init(),即将上程序改成这样:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 1); //返回内容中包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 1); //不读取页面内容
curl_exec($ch); //执行 (1)
curl_close($ch);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.php.net"); //指定读取 php.net
curl_setopt($ch, CURLOPT_HEADER, 0); //返回内容中不包含 HTTP 头
curl_setopt($ch, CURLOPT_NOBODY, 0); //读取页面内容
curl_exec($ch); //执行 (2)
curl_close($ch);
?>
返回结果正常。虽然可以通过这种方法解决问题,但对这个现象我感觉非常的奇怪。是 libcurl 本身的问题,还是我使用的方法不当呢?还希望熟悉 curl 的朋友帮忙指正一下。
评论

React 18的并发渲染确实是个重大改进,我们在项目中已经升级使用,性能提升明显!