如何在PHP和Azure中调试curl
好的,我有一个Drupal站点,我正在Azure上部署它。我的应用程序对Marketo执行API调用,以触发Marketo API中的操作 在我的本地开发人员和Debian服务器(常规lamp堆栈)上都可以正常工作 当我将站点部署到Azure时,它不起作用,我得到的只是如何在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 .
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)简单地说,code>是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已启用。不过我可以做卷发。