在网上找了很多curl封装函数和类,发现不是太复杂就是太简单或者功能不全,要么就是命名规范和程序设定以及函数用法不是自己喜欢的风格,我又懒得再去找,所以就花了点时间自己封装了个自认为超级完美且用法简单的curl函数,现在分享出来,希望有人喜欢
此CURL函数以使用简便为主, 若要实现复杂的功能且高效率请移步至 CURL类
要求: php版本 >= 5.3
用法
--
get提交并打印返回的结果
echo curl('http://3ghh.cn')->result;
post提交并打印返回的结果
echo curl(['http://3ghh.cn','user=123456&pass=123456'])->result;
get提交并模拟UA和Cookie且打印返回的结果
echo curl('http://3ghh.cn',['USERAGENT'=>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36','COOKIE'=>'sid=adb; s=123'])->result;
post提交并模拟UA和Cookie且打印返回的结果
echo curl(['http://3ghh.cn','user=123456&pass=123456'],['USERAGENT'=>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36','COOKIE'=>'sid=adb; s=123'])->result;
一些例子
//FTP上传:
$url='ftp://user:pass@host/upload_of_file_name.txt';
$src='upload_of_file_name.txt';//本地文件路径
echo curl($url,['UPLOAD'=>true,'INFILE'=>fopen($src, 'r')])->errno;//返回0就成功了
5.01版本
/*
* curl 5.01
* @param $url string|array $url:url地址&post数据
* @param $opt null|array $option:设置一个或多个选项
* @return ArrayObject
*/
function curl($url, $option = array())
{
$defaultOpt = array(#默认设置
CURLOPT_RETURNTRANSFER => true,//不直接打印结果
CURLINFO_HEADER_OUT => true,//info中包含请求头
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,//指定协议
CURLOPT_ACCEPT_ENCODING => '',//接受所有编码格式
CURLOPT_FOLLOWLOCATION => true,//跟随重定向
CURLOPT_CONNECTTIMEOUT => 3,//请求超时秒数
CURLOPT_TIMEOUT => 30,//Curl执行超时秒数
CURLOPT_HEADER => false,//result中包含响应头部
CURLOPT_NOBODY => false,//result中不包含响应主体
CURLOPT_SSL_VERIFYPEER => false,//验证SSL证书
CURLOPT_USERAGENT => '',//设置浏览器标识串
CURLOPT_AUTOREFERER => true//自动设置来源地址
);
$ch = curl_init();
is_array($url) ? curl_setopt_array($ch, array(CURLOPT_URL => $url[0], CURLOPT_POST => true, CURLOPT_POSTFIELDS => $url[1])) : curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt_array($ch, $defaultOpt);
foreach ($option as $key => $value)
if (gettype($key) == 'string') curl_setopt($ch, constant('CURLOPT_' . $key), $value); else curl_setopt($ch, $key, $value);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
if ($errno = curl_errno($ch)) $response = curl_error($ch);
curl_close($ch);
$obj = new ArrayObject();
#连接信息
$obj->info = $info;
#执行结果
$obj->result = $response;
#错误代码 无错时返回0
$obj->errno = $errno;
return $obj;
}
4.0版本
<?php
/*
* curl 4.0
* @param string|array $url:url地址&post数据
* @param null|array $option:设置一个或多个选项(可选)
* @return ArrayObject
*/
function curl($url, $option = array())
{
$defaultOpt = array(#默认设置
CURLOPT_RETURNTRANSFER => true,//不直接打印结果
CURLINFO_HEADER_OUT => true,//info中包含请求头
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,//指定协议
CURLOPT_ACCEPT_ENCODING => '',//接受所有编码格式
CURLOPT_FOLLOWLOCATION => true,//跟随重定向
CURLOPT_CONNECTTIMEOUT => 3,//请求超时秒数
CURLOPT_TIMEOUT => 30,//Curl执行超时秒数
CURLOPT_HEADER => false,//result中包含响应头部
CURLOPT_NOBODY => false,//result中不包含响应主体
CURLOPT_SSL_VERIFYPEER => false,//验证SSL证书
CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],//使用浏览者UA
CURLOPT_AUTOREFERER => true//自动设置来源地址
);
$ch = curl_init(!is_array($url) ? $url : $url[0]);
is_array($url) and array_key_exists(1, $url) ? curl_setopt($ch, CURLOPT_POST, true) && curl_setopt($ch, CURLOPT_POSTFIELDS, $url[1]) : '';
curl_setopt_array($ch, $defaultOpt);
if ($option != null && is_array($option)) {
foreach ($option as $key => $value) {
if (gettype($key) == 'string')
curl_setopt($ch, constant('CURLOPT_' . $key), $value);
else curl_setopt($ch, $key, $value);
}
}
$result = curl_exec($ch);
$info = curl_getinfo($ch);
if ($errno = curl_errno($ch)) $result = curl_error($ch);
curl_close($ch);
$obj = new ArrayObject();
//当设置“result中包含响应头部内容”为true或1时的处理
if ((array_key_exists('HEADER', $option) or array_key_exists(CURLOPT_HEADER, $option)) && ($option['HEADER'] == true || $option['HEADER'] == 1 || $option[CURLOPT_HEADER] == true || $option[CURLOPT_HEADER] == 1)) {
$result_header_str = substr($result, 0, $info['header_size']);
$result_headers_index = explode("\r\n\r\n", $result_header_str);
$result_header = array();
for ($i = 0; $i <= $info['redirect_count']; $i++) {
$result_header_index = explode("\r\n", $result_headers_index[$i]);
$result_header[$i] = array();
foreach ($result_header_index as $value) {
$kv = explode(': ', $value);
if ($kv[0] == 'Set-Cookie') $result_header[$i]['Set-Cookie'][] = $kv[1];
else $result_header[$i][$kv[0]] = @$kv[1];
}
}
#响应头部 string
$obj->result_header_str = $result_header_str;
#响应头部 array
$obj->result_header = $result_header;
#响应主体 string
$obj->result_body = substr($result, $info['header_size']);
}
#连接信息
$obj->info = $info;
#执行结果
$obj->result = $result;
#错误代码 无错时返回0
$obj->errno = $errno;
return $obj;
}
/*
* Curl多线程
*/
function curl_multi($arr)
{
$mh = curl_multi_init();
foreach ($arr as $k => $opt) {
$conn[$k] = curl_init();
$_option = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 3,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_NOBODY => true,
);
curl_setopt_array($conn[$k], $_option + $opt);
curl_multi_add_handle($mh, $conn[$k]);
}
$active = null;
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
//if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
//}
}
$result = array();
$info = array();
$errno = array();
foreach ($arr as $k => $opt) {
if ($errno[$k] = curl_errno($conn[$k])) $result = curl_error($conn[$k]);
$result[$k] = curl_multi_getcontent($conn[$k]);
$info[$k] = curl_getinfo($conn[$k]);
curl_close($conn[$k]);
curl_multi_remove_handle($mh, $conn[$k]);
}
curl_multi_close($mh);
$obj = new ArrayObject();
$obj->result = $result;
$obj->info = @$info;
$obj->errno = @$errno;
return $obj;
}