Как создать SSL-соединение в PHP с SO_KEEPALIVE? - PullRequest
3 голосов
/ 12 июля 2009

У меня есть простой PHP-код, который создает соединение SSL

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $this->sslPem);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $this->passPhrase);

$this->apnsConnection = stream_socket_client('ssl://'.$this->apnsHost.':'.$this->apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

Но знаете, как установить для SO_KEEPALIVE значение true? Я также пробовал STREAM_CLIENT_PERSISTENT, что не одно и то же.

Ответы [ 3 ]

1 голос
/ 12 июля 2009
1 голос
/ 12 июля 2009

Проверено ли (с помощью отслеживания сети), что вам нужно установить опцию сокета?

Что вы отправляете через сокет? HTTP / HTTPS представляет свою собственную функцию повторного использования соединения через заголовок «Соединение», поэтому параметр в сокете не обязательно тот, который вы хотите установить.

0 голосов
/ 09 мая 2019

Попробуйте это:

$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $this->sslPem);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $this->passPhrase);

$this->apnsConnection = stream_socket_client('ssl://'.$this->apnsHost.':'.$this->apnsPort, $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

$is_keepalive = 0;
// https://www.php.net/manual/ru/function.socket-import-stream.php
$socket = socket_import_stream($this->apnsConnection);
if (socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1)) {
    $is_keepalive = socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE);
    //echo 'SO_KEEPALIVE: ' . $is_keepalive . PHP_EOL;
} else {
    echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
}

if ($is_keepalive) {
    // https://www.php.net/manual/ru/function.socket-export-stream.php
    $this->apnsConnection = socket_export_stream($socket);
}

// TEST
//$socket = socket_import_stream($this->apnsConnection);
//echo 'SO_KEEPALIVE: ' . socket_get_option($socket, SOL_SOCKET, SO_KEEPALIVE);
...