在请求第三方网络资源时,可以使用CleverPHP提供的HTTP工具类,实现高性能、无阻塞的网络请求。
CleverPHP所有网络请求入口封装在Util工具类下,网络请求函数原型如下。
POST
```
static public function http($urls=[],$method="GET",$postData=[],$headers=[],$httpsConfig=[],$callback=null)
```
GET
```
static function httpGet($urls = [],$headers = [], $httpsConfig = [], $callback = null)
```
*****
【参数说明】
urls:网络资源地址,支持数组及字符串
postData:POST请求,必须提供
headers:HTTP请求头数据,使用数组来描述。
httpsConfig:当请求为https,可选的配置选项
callback:回调函数
*****
**【使用案例】**
**GET提交**
```
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",
"http://beauty-soft.net/blog/ceiba/Ios/20181112/833.html",
"http://beauty-soft.net/blog/ceiba/databases/2019-02-18/834.html"
);
Util::httpGet($urls,[],[],function($resault){
if ($resault) {
$this->writeJson($resault);
}
});
```
**POST提交**
```
$postData=array(
"name"=>"ceiba",
"hobby"=>"Sing a song"
);
Util::httpPost("http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",$postData,[],[],function($resault){
if ($resault) {
$this->writeJson($resault);
}
});
```
**HEADER提交**
```
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",
"http://beauty-soft.net/blog/ceiba/Ios/20181112/833.html",
"http://beauty-soft.net/blog/ceiba/databases/2019-02-18/834.html"
);
$key="v1.2";
$authorization="9BDFwqrqwerfdsafsadfsadfsadf";
$headers = array(
'api-key:'.$key,
'authorization:'.$authorization,
);
Util::httpGet($urls,$headers,[],function($resault){
if ($resault) {
$this->writeJson($resault);
}
});
```
****提交认证的HTTPS****
非认证的HTTPS可以通过前面 介绍的方式提交,只需要把http改成https即可。对于需要认证的HTTPS,需要配置httpsConfig参数才可成功提交。
```
$urls=array(
"https://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",
"https://beauty-soft.net/blog/ceiba/Ios/20181112/833.html",
"https://beauty-soft.net/blog/ceiba/databases/2019-02-18/834.html"
);
$httpsConfig=array(
"cacert"=>"/home/wwwroot/ca/cacert.pem"
);
Util::httpGet($urls,[],$httpsConfig,function($resault){
if ($resault) {
$this->writeJson($resault);
}
});
```
**协程版GET和POST**
GET
```
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html"
);
$headers=array(
'app-token' => "76454fdasfsadfsdafasd",
);
$data=\CleverPHP\Common\Tools\RequestHttp::get($urls,$headers);
$this->writeJson($data);
```
POST
```
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html"
);
$headers=array(
'app-token' => "76454fdasfsadfsdafasd",
);
$postData=["name"=>"ceiba"];
$data=\CleverPHP\Common\Tools\RequestHttp::post($urls,$postData,$headers);
$this->writeJson($data);
```
*****
**【多线程的提交模式】**
前面介绍网络请求的都是在HTTP Server里的。这些请求是基于单进程的,虽然使用的是异步回调,但如果需要更强悍的网络请求,可采取以下两种方式。
1、使用控制台调用
在控制器下调用Util::httpGet、Util::httpPost方法,都是多进程的,这种方式带来的好处极大地提高性能,适用于对网络请求比较耗时的场景,例如采集数据、下载远程资源等。
```
namespace App\Commands;
use CleverPHP\Controller\Console;
use CleverPHP\Common\Db;
use CleverPHP\Common\Util;
class Orders extends Console{
public function init(){
}
public function start($ages=[]) {
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",
"http://beauty-soft.net/blog/ceiba/Ios/20181112/833.html",
"http://beauty-soft.net/blog/ceiba/databases/2019-02-18/834.html"
);
$data=Util::http($urls);
var_dump($data);
}
}
```
2、在Web里调用多进程
在Http Server也可以直接调用多进程版的网 络请求,方式如下:
GET请求
```
$urls=array(
"http://beauty-soft.net/blog/ceiba/linux/2019-02-23/835.html",
"http://beauty-soft.net/blog/ceiba/Ios/20181112/833.html",
"http://beauty-soft.net/blog/ceiba/databases/2019-02-18/834.html"
);
$key="v1.2";
$authorization="9BDFwqrqwerfdsafsadfsadfsadf";
$headers = array(
'api-key:'.$key,
'authorization:'.$authorization,
);
Util::httpGetServer($urls,$headers,[],function($resault){
if ($resault) {
Cache::set("resault", $resault);
}
});
$this->writeJson([]);
```
可以看到,在Http Service调用多进程版的httpGetServer,回调处理事件里,需要做数据持久化。前端页面,需要二次请求所保存的资源。也可以把资源名称保存到数据库。