分享一个PHP使用CURL发送请求的工具类
工具类
class JsDataProjectHelper
{
private $url = "http://www.baidu.com";
private $post_data = [];
public function __construct()
{
}
private function sendPostRequest($base_url = '', $uri = '', $post_data = [], $header = [])
{
$data = [
'code' => 200,
'msg' => '请求成功',
'data' => []
];
$head = [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen(json_encode($post_data))
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $base_url . $uri);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);//超时
curl_setopt($ch, CURLOPT_HEADER, false);
if ($post_data != '') {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
}
if (!empty($header)) {
$head = array_merge($head,$header);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
$file_contents = curl_exec($ch);
$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($httpCode != 200) {
//此处可打印日志
//LogTool::getLogTool()->addLog('error',"curl",$base_url . $uri."|".$httpCode."|".$error);
}
if ($this->isJson($file_contents)) {
$result = json_decode($file_contents, true);
if ($result['code'] == 200) {
$data['data'] = $result['result'];
} else {
$data['code'] = 500;
$data['msg'] = $result['msg'];
}
} else {
$data['code'] = 500;
$data['msg'] = '网络请求失败';
}
return $data;
}
private function sendPostMultiRequest($post_data = [])
{
$datas = [];
$multi_ch = curl_multi_init();
$ch_list = [];
//句柄处理
foreach ($post_data as $requestName => $postData) {
$head = [
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen(json_encode($postData['post_data']))
];
$ch_list[$requestName] = curl_init($postData['base_url'] . $postData['url']);
curl_setopt($ch_list[$requestName], CURLOPT_POST, 1);
curl_setopt($ch_list[$requestName], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch_list[$requestName], CURLOPT_CONNECTTIMEOUT, 10);//超时
curl_setopt($ch_list[$requestName], CURLOPT_HEADER, false);
if ($postData['post_data'] != '') {
curl_setopt($ch_list[$requestName], CURLOPT_POSTFIELDS, json_encode($postData['post_data']));
}
if (!empty($postData['header'])) {
$head = array_merge($head,$postData['header']);
}
curl_setopt($ch_list[$requestName], CURLOPT_HTTPHEADER, $head);
curl_multi_add_handle($multi_ch, $ch_list[$requestName]);
}
//执行
$active = null;
do {
$mrc = curl_multi_exec($multi_ch, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
//同步阻塞优化CPU
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($multi_ch) != -1) { //阻塞直到cURL批处理连接中有活动连接。
do {
$mrc = curl_multi_exec($multi_ch, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
while($done = curl_multi_info_read($multi_ch)) {}
//获取http返回的结果
foreach ($ch_list as $k => $ch) {
$datas[$k] = [
'code' => 200,
'msg' => '请求成功',
'data' => []
];
$result = curl_multi_getcontent($ch);
$httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
$error = curl_error($ch);
if ($httpCode != 200) {
//此处可以打印日志
//LogTool::getLogTool()->addLog('error',"curl",$k."|".$httpCode."|".$error);
}
curl_multi_remove_handle($multi_ch, $ch);
curl_close($ch);
if ($this->isJson($result)) {
$result = json_decode($result, true);
if ($result['code'] == 200) {
$datas[$k]['data'] = $result['result'];
} else {
$datas[$k]['code'] = 500;
$datas[$k]['msg'] = $result['msg'];
}
} else {
$datas[$k]['code'] = 500;
$datas[$k]['msg'] = '网络请求失败';
}
}
curl_multi_close($multi_ch);
return $datas;
}
private function isJson($str)
{
return !is_null(json_decode($str));
}
public function addRequest($requestName = '', ...$args)
{
try {
$temp_requestName = explode('-', $requestName);
$method = $temp_requestName[0];
if (method_exists($this, "$method")) {
$this->post_data[$requestName] = $this->$method(...$args);
//$this->post_data[$requestName] = call_user_func([$this,$requestName],$args);
} else {
throw new \Exception($requestName . '() -- 函数不存在');
}
} catch (\Exception $e) {
echo "<pre>";
print_r($e->getMessage());
die;
}
return $this;
}
public function commit()
{
if (count($this->post_data) == 1) {
$this->post_data = array_values($this->post_data);
$retData = $this->sendPostRequest($this->post_data[0]['base_url'], $this->post_data[0]['url'], $this->post_data[0]['post_data']);
$this->post_data = [];
return $retData['data'];
} else {
$ret = $this->sendPostMultiRequest($this->post_data);
$data = [];
foreach ($ret as $requestName => $response) {
$data[$requestName] = $response['data'];
}
$this->post_data = [];
return $data;
}
}
使用方式
在“JsDataProjectHelper”此类下新增需要调用的方法
public function a($a, $b = '')
{
$data = [
'post_data' => ['a' => $a, 'b' => $b],
'base_url' => $this->url,
'url' => '/func/a',
];
return $data;
}
public function b($a)
{
$data = [
'post_data' => ['a' => $a],
'base_url' => $this->url,
'url' => '/func/b',
];
return $data;
}
调用
$paramsA = 100;
$paramsB = "实例";
$JsDataHelper = new JsDataProjectHelper();
//单个请求调用
$retdata = $JsDataHelper
->addRequest('a', $paramsA, $paramsB)
->commit();
echo "<pre>";
print_r($retdata);
//多个请求调用
$retdata = $JsDataHelper
->addRequest('a', $paramsA, $paramsB)
->addRequest('b', $paramsA)
->commit();
echo "<pre>";
print_r($retdata);
//多请求相同调用
$retdata = $JsDataHelper
->addRequest('a', $paramsA, $paramsB)
->addRequest('a-a1', $paramsA, $paramsB)
->addRequest('a-a2', $paramsA, $paramsB)
->addRequest('b', $paramsA)
->addRequest('b-b1', $paramsA)
->commit();
echo "<pre>";
print_r($retdata);
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: