php - API原因 "Curl error: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054"

标签 php azure curl openssl

这与homesteadvagrantlaravel无关

我有一个在 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 是否具有正在读取的目录以及提到的文件:

Open SSL Version and configuration

我已经检查了目录并从此处下载了最新的 cacert.pem 文件:https://curl.haxx.se/docs/sslcerts.html

我不想通过将我的 CURLOPT_SSL_VERIFYHOSTCURLOPT_SSL_VERIFYPEER 设置为 false 来关闭 SSL 验证来解决此问题。

有什么建议吗?

更新:

我对 CURLOPT_SSLCERTCURLOPT_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)证书没有私钥。

最佳答案

根据我的测试,一切正常。

我的环境:

  1. Windows 10 1809
  2. PHP 7.3 (7.3.11)
  3. 来自 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)

结果:

enter image description here

<小时/>

建议

所以,基本上这部分代码是没问题的。

正如你所说,它与 homestead、vagrant 或 laravel 无关。因此,这很可能是网络问题。也许您可以尝试重新启动Azure服务器。

<小时/>

更新

经@LatentDenis确认,最终发现问题是由防火墙引起的,这可以为我们缩小类似问题的范围提供线索。

关于php - API原因 "Curl error: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58803560/

相关文章:

python - 为什么 Azure DevOps Server 交错输出

python - 使用 python requests 和 json 发布文件

curl - 如何将下面的curl命令转换为php格式?

php - 在 Yii 框架中创建 Controller

php - 我如何将一小部分 zend 框架包含到 laravel 中?

php - 如何在同一台服务器上使用相同的 PHP 代码库运行多个网站?

azure - 调用 Graph API 时访问 token 丢失或格式错误

php - 如何在没有隐藏元素的情况下发送POST数据?

c# - Azure 函数代理响应正文不能包含大括号内的值

PHP CLI 并行写入和读取多个原始 tcp API,例如 https API 的 curl_multi_init