Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP和Azure中调试curl_Php_Azure_Curl_Drupal_Drupal 7 - Fatal编程技术网

如何在PHP和Azure中调试curl

如何在PHP和Azure中调试curl,php,azure,curl,drupal,drupal-7,Php,Azure,Curl,Drupal,Drupal 7,好的,我有一个Drupal站点,我正在Azure上部署它。我的应用程序对Marketo执行API调用,以触发Marketo API中的操作 在我的本地开发人员和Debian服务器(常规lamp堆栈)上都可以正常工作 当我将站点部署到Azure时,它不起作用,我得到的只是NULL 这是我的密码: public function postData(){ $url = $this->host . "/rest/v1/campaigns/" . $this->id .

好的,我有一个Drupal站点,我正在Azure上部署它。我的应用程序对Marketo执行API调用,以触发Marketo API中的操作

在我的本地开发人员和Debian服务器(常规lamp堆栈)上都可以正常工作

当我将站点部署到Azure时,它不起作用,我得到的只是
NULL

这是我的密码:

    public function postData(){
        $url = $this->host . "/rest/v1/campaigns/" . $this->id . "/schedule.json?access_token=" . $this->getToken();
        $ch = curl_init($url);
        $requestBody = $this->bodyBuilder();
        print_r($requestBody);
        curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('accept: application/json','Content-Type: application/json'));
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_VERBOSE, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
        curl_getinfo($ch);
        $response = curl_exec($ch);
        dvm($response, $name = NULL);
        return $response;
    }

    private function getToken(){
        $ch = curl_init($this->host . "/identity/oauth/token?grant_type=client_credentials&client_id=" . $this->clientId . "&client_secret=" . $this->clientSecret);
        curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('accept: application/json',));
        curl_setopt($ch, CURLOPT_VERBOSE, true);
        $response = json_decode(curl_exec($ch));
        curl_close($ch);
        $token = $response->access_token;
        dvm($response, $name = NULL);
        return $token;
    }
请注意:

有两个调用:一个调用获取访问令牌,另一个调用实际触发器

dvm($response,$name=NULL)是Drupal相当于
print\r

这完全相同的代码在我的本地机器(OSX、Apache、PHP5.6)和Debian(Apache、PHP5.6)上工作

我使用的是SQLite,它并不完全相关,但我认为我应该添加它以防万一

当我在本地或Debian服务器上执行此代码时,我会打印
$result
变量,它告诉我是否成功。在Azure上,对于第一个
FALSE
到第二个,我只得到
NULL

变量(
$this->id
$this->getToken()
等)设置正确,我可以很好地打印它们。就像我说的,所有的工作都在本地进行


我缺少什么?

Azure上的默认设置将CURLOPT_SSL_VERIFYPEER设置为TRUE。如果没有SSL,则可能会出现问题

以下内容摘自MSDN上的一篇帖子()

与SSL_VERIFYPEER选项相关的常见错误消息可能是:

SSL证书问题,请验证CA证书是否正常 SSL证书问题:无法获取本地颁发者证书

该错误通常是由于cURL选项中缺少或具有无效的SSL证书而导致的。如果看到这些消息,请考虑验证SSL证书,并检查CA证书文件的路径。CA证书必须采用PEM格式,有关CA摘录的更多详细信息,请访问

除非您的cURL连接到不受证书保护的服务器,否则不要关闭CURLOPT_SSL_VERIFYPEER

有两种方法可以在PHP环境中为cURL指定证书信息

  • 在cURL选项中指定CURLOPT_CAINFO:(示例代码)

    curl_setopt($ch,CURLOPT_CAINFO,getcwd()。“\cert\ca bundle.crt”)

    注意:getcwd()。“\cert\ca bundle.crt”返回ca-bundle.crt的绝对路径。确保ca捆绑包安装在正确的路径上

  • 在php.ini中设置curl.cainfo

    在php.ini文件中,找到[curl]部分,添加以下指令(示例代码):

    curl.cainfo=“D:\home\site\wwwroot\cert\ca bundle.crt”

    注意:更改后重新启动web应用

         “curl.cainfo” is system level directive which has to be set in php.ini, not in .user.ini. To use this approach, need to have customer php.ini.
    
          Refer to the link to setup customer php.ini, https://github.com/projectkudu/kudu/wiki/Xdt-transform-samples#using-a-custom-phpini
    

  • CURLOPT_SSL_VERIFYHOST选项与verify peer一起使用,此选项的默认值为2,用于检查公用名称是否存在,并验证其是否与提供的主机名匹配(更多详细信息请参见)

    是否在启用curl的azure中也使用lamp stack?azure是Web应用程序而不是VPS。不过,curl已启用。不过我可以做卷发。