万能PHP cURL封装类

<?php
function teacher_curl($url, $paras = [])
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    if (isset($paras['Header'])) {
        $Header = $paras['Header'];
    } else {
        $Header[] = "Accept:*/*";
        $Header[] = "Accept-Encoding:gzip,deflate,sdch";
        $Header[] = "Accept-Language:zh-CN,zh;q=0.8";
        $Header[] = "Connection:close";
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $Header);
    if (isset($paras['ctime'])) { // 连接超时
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $paras['ctime']);
    } else {
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    }
    if (isset($paras['rtime'])) { // 读取超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $paras['rtime']);
    }
    if (isset($paras['post'])) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $paras['post']);
    }
    if (isset($paras['header'])) {
        curl_setopt($ch, CURLOPT_HEADER, true);
    }
    if (isset($paras['cookie'])) {
        curl_setopt($ch, CURLOPT_COOKIE, $paras['cookie']);
    }
    if (isset($paras['refer'])) {
        if ($paras['refer'] == 1) {
            curl_setopt($ch, CURLOPT_REFERER, 'http://m.qzone.com/infocenter?g_f=');
        } else {
            curl_setopt($ch, CURLOPT_REFERER, $paras['refer']);
        }
    }
    if (isset($paras['ua'])) {
        curl_setopt($ch, CURLOPT_USERAGENT, $paras['ua']);
    } else {
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
    }
    if (isset($paras['nobody'])) {
        curl_setopt($ch, CURLOPT_NOBODY, 1);
    }
    curl_setopt($ch, CURLOPT_ENCODING, "gzip");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if (isset($paras['GetCookie'])) {
        curl_setopt($ch, CURLOPT_HEADER, 1);
        $result = curl_exec($ch);
        preg_match_all("/Set-Cookie: (.*?);/m", $result, $matches);
        $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($result, 0, $headerSize); //状态码
        $body = substr($result, $headerSize);
        $ret = [
            "Cookie" => $matches, "body" => $body, "header" => $header, 'code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
        ];
        curl_close($ch);
        return $ret;
    }
    $ret = curl_exec($ch);
    if (isset($paras['loadurl'])) {
        $Headers = curl_getinfo($ch);
        if (isset($Headers['redirect_url'])) {
            $ret = $Headers['redirect_url'];
        } else {
            $ret = false;
        }
    }
    curl_close($ch);
    return $ret;
}

get请求

echo teacher_curl("https://www.xiaokyun.com/api?url=google.com");

post请求

echo teacher_curl("https://www.xiaokyun.com/api",[
    'post'=>[
        'url'=>'google.com'
    ]
]);

文件上传

echo teacher_curl("https://www.xiaokyun.com/api?url=google.com",[
    'post'=>[
        'file'=>new CURLFile(realpath("Curl.jpg"))
    ]
]);

设置请求头

echo teacher_curl("https://www.xiaokyun.com/api?url=google.com",[
    'Header'=>[
        'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cache-control: max-age=0'
    ]
]);

携带Cookie

echo teacher_curl("https://www.xiaokyun.com/api?url=google.com",[
    'cookie'=>'cookie内容'
]);

通过curl模拟多线程抓取

<?php
//此模型虽然是一次多个url请求,但缺陷是 要等所有数据请求结束一起返回,才能逐个处理数据。
$start = microtime(true);

header('Content-type:text/html;charset=utf-8');

$arrs = [
    'https://www.yahoo.com/',
    'https://www.sohu.com/',
    'http://www.qq.com/',
    'http://www.sina.com.cn/',
    'http://www.163.com/'
];

$headers = array(
    'User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36',
);

$mh = curl_multi_init();

foreach ($arrs as $i=>$url){
    $conn[$i] = curl_init($url);
    curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
    curl_setopt($conn[$i], CURLOPT_HTTPHEADER,$headers);
    curl_setopt($conn[$i], CURLOPT_HEADER, 0);
    curl_setopt($conn[$i], CURLOPT_TIMEOUT, 20);


    if (strpos($url,'https')){
        curl_setopt ( $conn[$i], CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt ( $conn[$i], CURLOPT_SSL_VERIFYHOST, 2 );
    }
    curl_multi_add_handle($mh,$conn[$i]);
}

$active = null;
/*
 * 这样写会轻易导致CPU占用100%

do {
    $n=curl_multi_exec($mh,$active);
} while ($active);
 *
 */

//改写
/*
do {
    $mrc = curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active and $mrc == CURLM_OK){
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}
*/

//最简单方案
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);


//获取内容
foreach ($arrs as $i => $url) {
    $res[$i]=curl_multi_getcontent($conn[$i]);
    var_dump($res[$i]);
    curl_close($conn[$i]);
    //等待所有http请求结束返回数据依次生成文件。
    file_put_contents('curl_multi.log', $res[$i]."\r\n\r\n\r\n\r\n", FILE_APPEND);
}

$end = microtime(true) - $start;

echo '<br/>';
echo $end; // 平均 10.091157913208s

Facebook Graph API search with cURL

<?php
/**
* facebook.class.php
*/

class Facebook
{
public function __construct() {}

public function search($query)
{
$curl = curl_init(‘https://graph.facebook.com/search?type=post&q=’.urlencode($query));

// Tell curl to return results and not output it
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

// Execute curl and store results in $result
$result = curl_exec($curl);

// Close connection
curl_close($curl);

// Return the results as a decoded JSON object
return json_decode($result);
}
}

?>

使用curl / wget命令上传下载FTP

curl可以在shell下轻松上传下载ftp上的文件,相比ftp命令更具有优势,因为它能在单命令条件下,下载或者上传一个ftp文件,甚至可以删除文件。

下面看实例:

1、列出ftp服务器上的目录列表:

curl ftp://www.xiaokyun.com/ --user name:passwd
curl ftp://www.xiaokyun.com/ –u name:passwd #简洁写法
curl ftp://name:passwd@www.xiaokyun.com #简洁写法2

2、只列出目录,不显示进度条

curl ftp://www.xiaokyun.com –u name:passwd -s

3、下载一个文件:

curl ftp://www.xiaokyun.com/size.zip –u name:passwd -o size.zip

4、上载一个文件:

curl –u name:passwd -T size.mp3 ftp://www.xiaokyun.com/mp3/

5、从服务器上删除文件(使用curl传递ftp协议的DELE命令):

curl –u name:passwd ftp://www.xiaokyun.com/ -X 'DELE mp3/size.mp3'

6、另外curl不支持递归下载,不过可以用数组方式下载文件,比如我们要下载1-10.gif连续命名的文件:

curl –u name:passwd ftp://www.xiaokyun.com/img/[1-10].gif –O #O字母大写

7、要连续下载多个文件:

curl –u name:passwd ftp://www.xiaokyun.com/img/[one,two,three].jpg –O #O字母大写

8、wget下载文件:

用户账户:xiaokyun
用户密码:123456
ftp下载

wget ftp://xiaokyun:123456@www.xiaokyun.com/xxx.zip

http下载

wget --http-user=xiaokyun --http-passwd=123456 http://www.xiaokyun.com/xxx.zip

9、wget参数:

wget的参数较多,但大部分应用只需要如下几个常用的参数:
-r 递归;对于HTTP主机,wget首先下载URL指定的文件,然后(如果该文件是一个HTML文档的话)递归下载该文件所引用(超级连接)的所有文件(递归深度由参数-l指定)。对FTP主机,该参数意味着要下载URL指定的目录中的所有文件,递归方法与HTTP主机类似。
-N 时间戳:该参数指定wget只下载更新的文件,也就是说,与本地目录中的对应文件的长度和最后修改日期一样的文件将不被下载。
-m 镜像:相当于同时使用-r和-N参数。
-l 设置递归级数;默认为5。-l1相当于不递归;-l0为无穷递归;注意,当递归深度增加时,文件数量将呈指数级增长。
-t 设置重试次数。当连接中断(或超时)时,wget将试图重新连接。如果指定-t0,则重试次数设为无穷多。
-c 指定断点续传功能。实际上,wget默认具有断点续传功能,只有当你使用别的ftp工具下载了某一文件的一部分,并希望wget接着完成此工作的时候,才需要指定此参数。

使用举例:

wget -m -l4 -t0 http://www.xiaokyun.com/

将在本地硬盘建立http://www.xiaokyun.com/的镜像,镜像文件存入当前目录下一个名为www.xiaokyun.com的子目录中(你也可以使用-nH参数指定不建立该子目录,而直接在当前目录下建立镜像的目录结构),递归深度为4,重试次数为无穷(若连接出现问题,wget将坚韧不拔地永远重试下去,知道任务完成!)

另外一些使用频率稍低的参数如下:
-A acclist / -R rejlist:
这两个参数用于指定wget接受或排除的文件扩展名,多个名称之间用逗号隔开。例如,假设我们不想下载MPEG视频影像文件和.AU声音文件,可使用如下参数:
-R mpg,mpeg,au

其它参数还有:
-L 只扩展相对连接,该参数对于抓取指定站点很有用,可以避免向宿主主机的其他目录扩散。例如,某个人网站地址为:http://www.xiaokyun.com/~ppfl/,使用如下命令行:

wget -L http://www.xiaokyun.com/~ppfl/

则只提取该个人网站,而不涉及主机www.xiaokyun.com上的其他目录。

-k 转换连接:HTML文件存盘时,将其中的非相对连接转换成为相对连接。
-X 在下载FTP主机上的文件时,排除若干指定的目录

另外,下面参数用于设置wget的工作界面:
-v 设置wget输出详细的工作信息。
-q 设置wget不输出任何信息。

原文:http://hi.baidu.com/leejun_2005/blog/item/873f9aedfe83943b63d09feb.html

参考: http://bolg.malu.me/html/2011/1239.html
http://fanqiang.chinaunix.net/a6/b9/20020514/060201225.html