Ale*_*lou 5 php curl nginx amazon-ec2 parse-platform
最新更新:脚本通过SSH shell成功运行为"php script.php",作为管理员用户.当由nginx用户运行时,curl命令无法执行https请求.所以我想这是nginx用户无法正确使用curl的问题.我检查了十分之一的配置文件,但无法找到可以更改的位置.
我正在尝试发布以下JSON
{
"where": {
"userId": "97"
},
"data": {
"alert": "Joe Masilotti answered a question you follow",
"badge": "Increment","eventId":"3","questionId":"8954","answerId":"977"
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码
$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);
curl_setopt($c, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'X-Parse-Application-Id: '.$this->_appid,
'X-Parse-REST-API-Key: '.$this->_restkey
));
curl_setopt($c, CURLOPT_CUSTOMREQUEST, 'POST');
$postData = str_replace(PHP_EOL,'',$args['data']);
curl_setopt($c, CURLOPT_POSTFIELDS, $postData );
$url = $this->_parseurl . $args['requestUrl'];
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($c);
Run Code Online (Sandbox Code Playgroud)
它适用于我的本地Apache.我在运行在AWS EC2上的nginx服务器上运行此命令并从cURL获取此服务器
Array
(
[url] => https://api.parse.com/1/push
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.012399
[namelookup_time] => 0.01232
[connect_time] => 0.013486
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[redirect_url] =>
)
cURL error number:77
cURL error:
Run Code Online (Sandbox Code Playgroud)
使用以下命令从AWS EC2服务器的命令行发送相同的JSON
curl -X POST \
-H "X-Parse-Application-Id: <...>" \
-H "X-Parse-REST-API-Key:<..>" \
-H "Content-Type: application/json" \
-d '{
"where": {
"userId": "97"
},
"data": {
"alert": "Joe answered a question",
"badge": "Increment","eventId":"3","questionId":"8954","answerId":"977"
}
}' \
https://api.parse.com/1/push
Run Code Online (Sandbox Code Playgroud)
cURL扩展在服务器上正确设置,并且可以在其他脚本中使用.谢谢!
更新:脚本"script.php"在服务器上从命令行以"php script.php"运行时成功运行,而在" http://www.mysite.com/script.php " 浏览器上请求时失败
更新:这是我的卷曲-V
curl 7.36.0 (x86_64-redhat-linux-gnu) libcurl/7.36.0 NSS/3.16 Basic ECC zlib/1.2.7 libidn/1.18 libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz
Run Code Online (Sandbox Code Playgroud)
我试图检查我的本地和服务器PHP配置之间的卷曲差异,我看到本地卷曲SSL版本是OpenSSL/1.0.1f,而在服务器上是NSS/3.14.3.0
小智 5
我在亚马逊AMI linux上有同样的错误.
我通过在/etc/php.d/curl.ini上设置curl.cainfo来解决
检查我的curl.ini https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b
经过两天的调试后回答我自己的问题。在一一编译完所有内容后,我意识到在 Amazon Linux 服务器的最后一次更新之后(由于 Heartbleed 问题引起),NSS 出现了问题,包管理器由于某些依赖项损坏而无法更新它。
一种解决方案是使用 openSSL 而不是 NSS 通过 cURL 重新编译 PHP。在执行此操作之前,我花了几个小时(也不依赖于软件包管理的简便性),创建了一个新的 Amazon Linux 服务器来检查它们是否已更新软件包管理以及 NSS 在新 AMI 中是否正常工作。他们确实做到了。弹出一个新实例,在执行其他操作之前执行 yum 更新,NSS 是第一个更新的。
尝试了上面的代码并成功了。所以,现在我将所有代码库移动到新实例,将 EIP 切换到新实例,一切顺利。
| 归档时间: |
|
| 查看次数: |
8806 次 |
| 最近记录: |