这与homestead
、vagrant
或laravel
无关。
我有一个在 Windows Azure 服务器上的 PHP
7.3 上运行的应用服务。
这是我正在运行的与 cURL
调用相关的代码:
$resCurl = curl_init();
$url_API = 'https://example.com/api/someMethod';
curl_setopt( $resCurl, CURLOPT_HTTPHEADER, array( 'Content-type: APPLICATION/JSON; CHARSET=UTF-8' ) );
curl_setopt( $resCurl, CURLOPT_POSTFIELDS, $jsonRequest );
curl_setopt( $resCurl, CURLOPT_POST, true );
curl_setopt( $resCurl, CURLOPT_URL, $url_API );
curl_setopt( $resCurl, CURLOPT_RETURNTRANSFER, 1);
$resultAPI = curl_exec( $resCurl );
执行此操作时,我不断生成此错误:
Curl error: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
运行命令提示符,我可以执行 php -i
来查看 openssl
是否具有正在读取的目录以及提到的文件:
我已经检查了目录并从此处下载了最新的 cacert.pem
文件:https://curl.haxx.se/docs/sslcerts.html
我不想通过将我的 CURLOPT_SSL_VERIFYHOST
和 CURLOPT_SSL_VERIFYPEER
设置为 false 来关闭 SSL 验证来解决此问题。
有什么建议吗?
更新:
我对 CURLOPT_SSLCERT
和 CURLOPT_SSLCERTTYPE
的选项进行了硬编码:
curl_setopt( $resCurl, CURLOPT_SSLCERT, 'D:\home\site\cert\cacert.pem');
curl_setopt( $resCurl, CURLOPT_SSLCERTTYPE, 'PEM' );
现在错误不同了:
unable to set private key file: 'D:\home\site\cert\cacert.pem' type PEM
我会上传私钥,但此公共(public)证书没有私钥。
最佳答案
根据我的测试,一切正常。
我的环境:
- Windows 10 1809
- PHP 7.3 (7.3.11)
- 来自 https://curl.haxx.se/ca/cacert.pem 的证书
代码:
$resCurl = curl_init();
$url_API = 'https://example.com/api/someMethod';
$jsonRequest = '{"a":"aaa"}';
curl_setopt( $resCurl, CURLOPT_HTTPHEADER, array( 'Content-type: APPLICATION/JSON; CHARSET=UTF-8' ) );
curl_setopt( $resCurl, CURLOPT_POSTFIELDS, $jsonRequest );
curl_setopt( $resCurl, CURLOPT_POST, true );
curl_setopt( $resCurl, CURLOPT_URL, $url_API );
curl_setopt( $resCurl, CURLOPT_RETURNTRANSFER, 1);
$resultAPI = curl_exec( $resCurl );
$print_r($resultAPI)
结果:
<小时/>建议
所以,基本上这部分代码是没问题的。
正如你所说,它与 homestead、vagrant 或 laravel 无关。因此,这很可能是网络问题。也许您可以尝试重新启动Azure服务器。
<小时/>更新
经@LatentDenis确认,最终发现问题是由防火墙引起的,这可以为我们缩小类似问题的范围提供线索。
关于php - API原因 "Curl error: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58803560/