thinkphp - PHP 怎么处理curl异常?

 农夫三拳 发布于 2022-11-17 22:05

PHP是怎么处理异常的?像下面这样的代码,如何得知是执行成功了还是失败了?

    public function get_user($ch, $apikey) {
        \Think\Log::record('into get_user...');
        curl_setopt($ch, CURLOPT_URL, 'https://sms.xxx.com/v2/user/get.json');
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apikey)));

        $response = curl_exec($ch);
        \Think\Log::record('$response : '.$response);
        if (false === $response) {
            die(curl_error);
        }
        return $response;
    }
5 个回答
  • PHP 也有try catch throw吧

    2022-11-17 23:26 回答
  • 在一个项目里面, 你很难保证curl发出的http请求一定是正确并且在超时范围内返回的..反而是经常出问题的.
    所以为了项目后面的代码能正确处理curl遇到的错误, 我认为抛出异常是最好的方式.

    $response = curl_exec($ch);
    if (false === $response) {
        die(curl_error($ch));
        throw new Exception(curl_error($ch),curl_errno($ch));
    }
    2022-11-17 23:26 回答
  • 补充 @incNick 的答案,PHP 7 版本,异常 多了异常类 Error ,跟 Exception 是平级关系
    可以参考
    1、http://php.net/manual/zh/migration70.incompatible.php
    2、http://php.net/manual/zh/language.errors.php7.php

    2022-11-17 23:26 回答
  • 抛出异常 throw new Exception()
    可能触发异常的代码 try{...}
    捕获异常 catch(Exception $e){}

    补充:

    protected function curl($url, $postFields = null)
    {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.1)');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FAILONERROR, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //curl_setopt($ch,CURLOPT_HTTPHEADER,array('Expect:'));
    if (is_array($postFields) && 0 < count($postFields))
    {
    $postBodyString = '';
    $postMultipart = false;
    foreach ($postFields as $k => $v)
    {
    if('@' != substr($v, 0, 1))//判断是不是文件上传
    {
    $postBodyString .= '$k=' . urlencode($v) . '&';
    }
    else//文件上传用multipart/form-data,否则用www-form-urlencoded
    {
    $postMultipart = true;
    }
    }
    unset($k, $v);
    curl_setopt($ch, CURLOPT_POST, 1);
    if ($postMultipart)
    {
    cur l_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    }
    else
    {
    //var_dump($postBodyString);
    curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
    }
    }
    $reponse = curl_exec($ch);
    //return curl_getinfo($ch);
    if (curl_errno($ch))
    {
    throw new Exception(curl_error($ch),0);
    }
    else
    {
    $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    if (200 !== $httpStatusCode)
    {
    throw new Exception($reponse,$httpStatusCode);
    }
    }
    curl_close($ch);
    return $reponse;
    }
    2022-11-17 23:26 回答
  • $apiKey = '';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://sms.yunpian.com/v2/user/get.json');
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apiKey)));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
    $response = curl_exec($ch);
    if (false === $response) {
        die(curl_error($ch));
    }
    print_r($response);

    自己运行调试吧,不解释了。

    2022-11-17 23:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有