PHP最佳POST代码及使用方式

接下来说明PHP中常用的http请求方法,以方便使用

方式一:使用file_get_contents()发送GET、POST请求
方式二:使用curl函数发送GET、POST请求(推荐)

优缺点:
方式一代码简单;
方式二理论性能优秀;

下方代码在前介绍在后。方便拷贝。
函数区别及优缺点在代码下方有详细说明。
以及经常遇到的问题和解决方法都有解释。

方式一代码示例

# 方式一代码示例[file_get_contents]
#【GET】

$data 	= array( 'name'=>'测试','age'=>'18');
$query 	= http_build_query($data); 
$url 	= 'http://localhost/server.php';	//这里一定要写完整的服务页面地址,否则php程序不会运行 
$result = file_get_contents($url.'?'.$query); 
print_r($response);

#【POST】
$data = array('name'=>'测试','age'=>'18');
$requestBody = http_build_query($data);
$context = stream_context_create([
        'http' => [
            'method' => 'POST',
            'header' => "Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: " . mb_strlen($requestBody),
            'content' => $requestBody
        ]
    ]);
$response = file_get_contents('http://localhost/server.php', false, $context);
print_r($response);

方式二代码示例

function curlGet($url)
{
    $headerArray = array("Content-type:application/json;", "Accept:application/json"); // 请求header根据需要自定义即可
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output, true);
    return $output;
}

function curlPost($url, $data)
{
    $data = json_encode($data);
    $headerArray = array("Content-type:application/json;charset='utf-8'", "Accept:application/json"); // 请求header根据需要自定义即可
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headerArray);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($curl);
    curl_close($curl);
    return json_decode($output, true);
}

函数区别及优缺点

1.fopen/file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen/file_get_contents好很多。

2.fopen/file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

3.fopen/file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。

4.curl 可以模拟多种请求,参数配置灵活,例如:用户可以按照自己的需求来定制请求。

# 以上说明了几点本质区别,后续会更新性能对比,优化方向及示例。
# 有问题或指证不足可留言

常见问题和解释说明

1.CURL采用请求头Content-Type:application/x-www-form-urlencoded 不起作用

# 示例数据
$data = ["age"=>18, "name"=>"小明"];
# 错误说明:要想以 x-www-form-urlencoded 方式发送,最关键其实是发送的数据格式
# 发送x-www-form-urlencoded时需要用key=value&key=value的格式发送,发送的是string型的数据
# 所以解决方法是使用http_build_query()函数:
$str = http_build_query($data);

# 如果使用的是
$json = json_encode($data);
# 会发现请求头依然是 Content-Type:application/json ,自定义x-...并没有起作用
# 了解后请根据自己相关情况,采用相应措施

2.为CURL请求设置代理模式

# 这里只是列了几项常用设置,请根据自己的使用情况进行配置
# curl_setopt($curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); //代理认证模式
curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1"); //代理服务器地址
curl_setopt($curl, CURLOPT_PROXYPORT, 8888); //代理服务器端口
# curl_setopt($curl, CURLOPT_PROXYUSERPWD, "代理用户:代理密码");

3.CURL进行https协议请求相关问题

# 提交数据到https时,需要pem证书来加密。
# 我们使用浏览器访问https的时候,浏览器会自动加载网站的安全证书进行加密。
# 但是你用curl请求https时,没有通过浏览器,就只有自己手动增加一个安全证书进行加密。
# 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);  
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_CAINFO, __DIR__'/cacert.pem'); //这是证书路径,请根据自己情况设定
# CURLOPT_SSL_VERIFYPEER 项 自cURL 7.10开始默认为TRUE
# 	禁用后cURL将终止从服务端进行验证。
# 	使用CURLOPT_CAINFO选项设置证书
# 	使用CURLOPT_CAPATH选项设置证书目录 
# 	如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE

# CURLOPT_SSL_VERIFYHOST
#  	1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。
# 	2 检查公用名是否存在,并且是否与提供的主机名匹配

感谢阅读

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值