【问题标题】:socket connection fails in php script while it works in terminalphp脚本中的套接字连接在终端中工作时失败
【发布时间】:2013-10-03 20:49:11
【问题描述】:

这是我的脚本

<?php
    $timeout = 10;
    $target = "tls://testbed-epp.nominet.org.uk:700";

    $result = stream_socket_client($target, $errno, $errstr, 30, STREAM_CLIENT_CONNECT);
    if ($result === False) {
        throw new Exception("Error connecting to $target: $errstr (code $errno)");

    }

    echo "Connected";

它会抛出异常

Error connecting to tls://testbed-epp.nominet.org.uk:700: (code 0)

还有一个警告

WARNING: stream_socket_client(): Failed to enable crypto

同时运行

 openssl s_client -connect testbed-epp.nominet.org.uk:700

在终端中完美连接。

任何想法将不胜感激

【问题讨论】:

    标签: php sockets ssl


    【解决方案1】:
    $timeout =- 10;
              ^----
    

    您将 $timeout 设置为负 10 秒。例如你在连接尝试开始之前就终止了它。

    【讨论】:

    • 感谢您的回复,这是一个错字,在原始脚本中是肯定的。所以这不是我害怕的原因
    • 并且没有使用该变量,而是使用硬编码的30 超时。
    【解决方案2】:

    试试这个:

    $result = stream_socket_client("testbed-epp.nominet.org.uk:700", $errno, $errstr);
    

    编辑:你也可以通过 stream_socket_enable_crypto() 函数设置安全连接,但你应该注意它必须在套接字连接初始化之后使用。

    【讨论】:

    • 奇怪的是它没有指定协议就可以工作。问题是我无法编辑该文件,因为它是第三方库。除此之外,相同的脚本可以在另一台服务器上正常工作,所以我认为服务器配置有些问题。我最初担心的是通过安装在远程服务器的 VM 节点上的 VPN 客户端运行。但事实证明这不是问题
    【解决方案3】:

    好吧,我在我的 apache 服务器上测试了您的代码,它运行良好。你能检查你的apache配置吗?在配置中有一个名为"Registered Stream Socket Transports " 的参数。只要检查tls是否存在作为一个值在那里,否则还有其他问题,但绝对不是你的脚本

    【讨论】:

    • 做 phpinfo() 显示 Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
    • 好的,这很奇怪,但我注意到您在上面的错误中 $errstr 是空的。你应该有东西。我尝试更改端口,它给了我connection refused。同样,您应该对此错误有所了解
    • 问题是它是空的,错误代码是 0。在我原来的脚本错误日志中捕获一个警告 - 警告:stream_socket_client():无法启用加密。我更新了问题。可能警告没有显示在测试脚本中的原因是我通过命令行运行它
    • 您的配置中是否启用了openssl 扩展?我刚刚意识到我在 apache 上启用了 openssl 支持。
    • 已启用。如果你在谈论 httpd.conf LoadModule
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多