如何使用低级套接字函数socket_write/socket_read来处理PHP中的ssl请求


How to use low level socket functions socket_write/socket_read to handle ssl requests in PHP?

我需要通过ssl https连接发送请求和接收响应。一个要求是只使用低级套接字函数(不是STREAM),如socket_write/socket_read, socket_send/socket_recv,列在http://php.net/manual/en/ref.sockets.php

可以在已连接的套接字上使用stream_socket_enable_crypto()方法。要在套接字上启用ssl,根据环境和版本有4种可能的选项。你可以每一种都试一试,除非有一种行不通。查看这个例子:

function enableCrypto($socket)
{
    $modes = array(
        STREAM_CRYPTO_METHOD_TLS_CLIENT,
        STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
        STREAM_CRYPTO_METHOD_SSLv23_CLIENT,
        STREAM_CRYPTO_METHOD_SSLv2_CLIENT
   );
   foreach ($modes as $mode) {
        if (stream_socket_enable_crypto($socket, true, $mode)) {
            return;
        }
   }
   throw new Exception('failed to enable crypto');
}

顺便说一句,这个例子取自PEAR存储库中的HTTP_Request2包。上面的函数与HTTP_Request2_SocketWrapper::enableCrypto()几乎相同。您可以通过查看HTTP_Request2的源代码找到更多信息。