小编Fog*_*gus的帖子

cURL 在一些失败的请求后随机抛出“curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL”

我有一个 PHP 脚本,可以快速向 Apple API ( APNs )发送一堆请求。有时 10k 请求发送完全没问题(只是为了记录,大约需要 30 秒)。但是,当 API 返回一些非 200 代码时,与此 API 建立新连接会引发以下错误:

curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to api.push.apple.com:443
Run Code Online (Sandbox Code Playgroud)

启用调试模式后,我得到了奇怪的结果:

当一切正常时:

* Found bundle for host api.push.apple.com: 0x55eba8b11660 [serially]
* Found bundle for host api.push.apple.com: 0x55eba8b11660 [serially]
*   Trying 17.188.140.151...
* TCP_NODELAY set
* Hostname 'api.push.apple.com' was found in DNS cache
*   Trying 17.188.140.151...
...
...
Run Code Online (Sandbox Code Playgroud)

(完整输出在这里)。

问题发生后:

* Found bundle for host api.push.apple.com: 0x561d83bb1f00 [serially]
* Server doesn't support …
Run Code Online (Sandbox Code Playgroud)

php curl apple-push-notifications

6
推荐指数
1
解决办法
1万
查看次数

是否可以通过 HTTP/2 设置 Guzzle + Pool?

Guzzle提供了一种发送并发请求的机制:Pool。我使用了文档中的示例:http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests。它工作得很好,发送并发请求,一切都很棒,除了一件事:在这种情况下,Guzzle 似乎忽略了 HTTP/2。

我准备了一个简化的脚本,它向https://stackoverflow.com发送两个请求,第一个是使用 Pool,第二个只是常规的 Guzzle 请求。只有常规请求通过 HTTP/2 连接。

<?php

include_once 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Pool;
use GuzzleHttp\Psr7\Request;

$client = new Client([
    'version' => 2.0,
    'debug' => true
]);

/************************/

$requests = function () {
    yield new Request('GET', 'https://stackoverflow.com');
};
$pool = new Pool($client, $requests());
$promise = $pool->promise();
$promise->wait();

/************************/

$client->get('https://stackoverflow.com', [
    'version' => 2.0,
    'debug' => true,
]);
Run Code Online (Sandbox Code Playgroud)

这是输出: https: //pastebin.com/k0HaDWt6(我用“!!!!!”突出显示了重要部分)

有谁知道为什么 Guzzle 这样做以及如何使 Pool 与 HTTP/2 一起工作?

php guzzle http2

4
推荐指数
1
解决办法
2401
查看次数

标签 统计

php ×2

apple-push-notifications ×1

curl ×1

guzzle ×1

http2 ×1