#php #sockets #ssl #tcp #websocket
#php #сокеты #ssl #tcp #websocket
Вопрос:
Я разработал PHP WebSocket server, который использует протокол HTTP для подтверждения связи. Все работало нормально.
Проблема началась, когда я захотел добавить слой SSL. Когда я включаю его, HTTP-фреймы разделяются на 2 части — мне нужно дважды вызвать функцию чтения, чтобы прочитать 2-ю часть:
- Первая буква заголовка HTTP (G)
- Остальная часть заголовка
Без SSL все работает нормально. Я перепробовал множество модификаций, но безрезультатно. Есть идеи?
Список функции чтения:
protected function read($toRead = 1400) {
$return = "";
for (;;) {
if ($toRead < Config::$socket['chunk_size']) {
$length = $toRead;
} else {
$length = Config::$socket['chunk_size'];
}
$sData = fread($this->socket, $length);
if ($sData == false) return false;
$toRead = $toRead - $length;
$return .= $sData;
if ($toRead == 0) break;
}
var_dump($return);
return $return;
}
SSLContext:
protected function createSSLContext() {
$context = stream_context_create();
if (Config::$ssl['switch']) {
stream_context_set_option($context, 'ssl', 'local_cert', Config::$ssl['filename']);
stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
stream_context_set_option($context, 'ssl', 'verify_peer', false);
if (isset(Config::$ssl['passphrase'])) {
stream_context_set_option($context, 'ssl', 'passphrase', Config::$ssl['passphrase']);
}
}
$this->context = $context;
}
Комментарии:
1. ошибки вообще не отображаются?
2. вы включили «Отображать ошибки»?
3. да, ini_set(‘display_errors’, ‘On’);
Ответ №1:
Я использовал stunnel вместо этого, но все еще не могу найти решение проблемы.