【问题标题】:How to use low level socket functions socket_write/socket_read to handle ssl requests in PHP?如何使用低级套接字函数 socket_write/socket_read 在 PHP 中处理 ssl 请求?
【发布时间】:2013-01-12 12:41:01
【问题描述】:

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

【问题讨论】:

  • 你可以使用here的一些代码
  • @hek2mgl 我尝试了php.net/manual/en/function.socket-recv.php 上的代码,但它是针对http 请求而不是ssl 请求
  • @Stefan fsockopen 不是我想要的。我需要使用 socket_create
  • 顺便说一句,我们不会帮你做作业
  • @Stefan 哦,这真的不是我的作业。我可以使用套接字函数来处理正常的 http 请求。但是对于 ssl 连接,底层的套接字功能似乎并不那么容易。我尝试使用 Ev 库进行异步处理,它只能监视 FD/Sockets,所以我必须使用低级套接字函数

标签: php sockets


【解决方案1】:

您可以在连接的套接字上使用方法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 的源代码找到更多信息。

【讨论】:

  • 我尝试将stream_socket_enable_crypto传递给socket_create创建的$socket,但是没有一个模式可以设置为$socket。此功能可能仍适用于流
  • 是的,对不起,我也试过了。 :( 。使用流是一种选择吗?(建议)我应该准备一个例子吗?
  • 如果 Ev 库支持,我可以使用流。但是 EvIo 似乎没有监控流。我仍在努力寻找解决方案。感谢您的回复
  • Ev 扩展的有趣内容。会深入研究。我能否理解您的问题,例如“如何使用 Ev 扩展执行 https 请求?” ?
  • 顺便说一句,你为什么不直接使用 stream_select() 或 socket_select() 呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多