Curl PHP脚本可以在mac上运行,但不能在windows上运行

Curl PHP脚本可以在mac上运行,但不能在windows上运行,curl,error-handling,php,parse-platform,Curl,Error Handling,Php,Parse Platform,我正在利用parse.com和PHP库与框架进行交互,它只在使用MAMP的mac上对我有效,但在使用XAMPP或WAMP的windows上,它每次都因同样的原因失败。下面是每次连接解析时调用的函数。在windows上运行时,$responseCode=0,$response为false。当我在Mac上运行它时,$responseCode=200,$response也会返回json数据。发生了什么事?为什么不同的平台会导致故障 public function request($args){

我正在利用parse.com和PHP库与框架进行交互,它只在使用MAMP的mac上对我有效,但在使用XAMPP或WAMP的windows上,它每次都因同样的原因失败。下面是每次连接解析时调用的函数。在windows上运行时,$responseCode=0,$response为false。当我在Mac上运行它时,$responseCode=200,$response也会返回json数据。发生了什么事?为什么不同的平台会导致故障

public function request($args){
        $isFile = false;
        $c = curl_init();
        curl_setopt($c, CURLOPT_TIMEOUT, 30);
        curl_setopt($c, CURLOPT_USERAGENT, 'parse.com-php-library/2.0');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLINFO_HEADER_OUT, true);
        if(substr($args['requestUrl'],0,5) == 'files'){
            curl_setopt($c, CURLOPT_HTTPHEADER, array(
                'Content-Type: '.$args['contentType'],
                'X-Parse-Application-Id: '.$this->_appid,
                'X-Parse-Master-Key: '.$this->_masterkey
            ));
            $isFile = true;
        }
        else if(substr($args['requestUrl'],0,5) == 'users' && isset($args['sessionToken'])){
            curl_setopt($c, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'X-Parse-Application-Id: '.$this->_appid,
                'X-Parse-REST-API-Key: '.$this->_restkey,
                'X-Parse-Session-Token: '.$args['sessionToken']
            ));
        }
        else{
            curl_setopt($c, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'X-Parse-Application-Id: '.$this->_appid,
                'X-Parse-REST-API-Key: '.$this->_restkey,
                'X-Parse-Master-Key: '.$this->_masterkey
            )); 
        }
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, $args['method']);
        $url = $this->_parseurl . $args['requestUrl'];

        if($args['method'] == 'PUT' || $args['method'] == 'POST'){
            if($isFile){
                $postData = $args['data'];
            }
            else{
                $postData = json_encode($args['data']);
            }

            curl_setopt($c, CURLOPT_POSTFIELDS, $postData );
        }

        if($args['requestUrl'] == 'login'){
            $urlParams = http_build_query($args['data'], '', '&');
            $url = $url.'?'.$urlParams;
        }
        if(array_key_exists('urlParams',$args)){
            $urlParams = http_build_query($args['urlParams'], '', '&');
            $url = $url.'?'.$urlParams;
        }

        curl_setopt($c, CURLOPT_URL, $url);

        $response = curl_exec($c);
        $responseCode = curl_getinfo($c, CURLINFO_HTTP_CODE);

        $expectedCode = '200';
        if($args['method'] == 'POST' && substr($args['requestUrl'],0,4) != 'push'){
            $expectedCode = '201';
        }

        if($expectedCode != $responseCode){
            //BELOW HELPS WITH DEBUGGING
                    //echo "VAR DUMP:";
                    //var_dump($response);      
        }

        return $this->checkResponse($response,$responseCode,$expectedCode);
    }

private function checkResponse($response,$responseCode,$expectedCode){
        //TODO: Need to also check for response for a correct result from parse.com
        if($responseCode != $expectedCode) {

            $error = json_decode($response);
            $this->throwError($error->error,$error->code);
        }
        else{
            //check for empty return
            if($response == '{}'){
                return true;
            }
            else{
                return json_decode($response);
            }
        }
    }
}
错误:

[23-Jan-2013 19:57:45 UTC] PHP Notice:  Trying to get property of non-object in C:\wamp\www\firecom\parse\parse.php on line 180

[23-Jan-2013 19:57:45 UTC] PHP Notice:  Trying to get property of non-object in C:\wamp\www\firecom\parse\parse.php on line 180

[23-Jan-2013 19:57:45 UTC] PHP Fatal error:  Uncaught ParseLibraryException: [0]: thrown in C:\wamp\www\firecom\parse\parse.php on line 169
替换:

$response = curl_exec($c);
与:

或者替换任何您喜欢的错误处理代码


第180行在哪里?这个样本中肯定没有180行,180行是:$this->throwError($error->error,$error->code);可能意味着您的$response不是有效的json,json_decode返回一个布尔值false,您盲目地将该false用作对象。尝试
if($error==false){die(json_last_error());}
或其他方法来检查是否存在此类问题。确定,因此错误是SSL证书问题:无法获取本地颁发者证书。这意味着什么?他们可能正在使用自签名证书,或者您运行的服务器的根/中间证书不是最新的。如果您不关心这一点,那么使用
curl\u setopt($c,CURLOPT\u SSL\u VERIFYPEER,FALSE)@JonErickson“这台柴油机在我的拖拉机上工作得很好,但当我把它放进车里时,发动机就发动不起来了!”你不知道我有多鄙视这个问题。A) 您可能没有最新的根/中间证书。B) cURL的某些版本不喜欢通配符证书。C) “其他所有的原因,”乔纳里克森打败了我,我已经几十年没用过Mac了。试试或者@JonErickson-woop,brainfart。Windows Update处理根证书,您连接到的服务器应该提供中间证书。否则,您必须从颁发证书的CA处获取证书。我不确定cURL如何处理接收中间证书的问题,但cURL对SSL抱怨太多,我总是在NOVERIFY中使用SSL。将
curl\u setopt()
行与其他行放在您发布的代码块顶部附近,基本上放在
curl\u exec()
之前的任何位置。
if( ! $response = curl_exec($c) ) {
    die(curl_error($c));
}