Home >Backend Development >PHP Tutorial >thinkPHP 怎么处理curl异常?

thinkPHP 怎么处理curl异常?

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-06 20:09:161431browse

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

<code>    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;
    }</code>

回复内容:

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

<code>    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;
    }</code>

<code>$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);</code>

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

抛出异常 throw new Exception()
可能触发异常的代码 try{...}
捕获异常 catch(Exception $e){}

补充:

<code>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  $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;
}</code>

补充 @incNick 的答案,PHP 7 版本,异常 多了异常类 Error ,跟 Exception 是平级关系
可以参考
1、http://php.net/manual/zh/migration70.incompatible.php
2、http://php.net/manual/zh/language.errors.php7.php

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

<code class="php">$response = curl_exec($ch);
if (false === $response) {
    die(curl_error($ch));
    throw new Exception(curl_error($ch),curl_errno($ch));
}</code>

PHP 也有try catch throw吧

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn