2013-09-27 22 views
0

这是剧本我有套接字连接在PHP脚本失败,而它工作在终端

<?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 

在一个终端连接完美无瑕。

任何想法可以理解

回答

0
$timeout =- 10; 
      ^---- 

你设置$timeout为负10秒。例如你可以在开始之前终止连接尝试。

+0

感谢您的答复,这是一个错字,在原来的脚本它是积极的。所以这不是我恐怕的原因 –

+0

而且这个变量没有被使用,硬编码的'30'超时值代替了。 – CodeCaster

1

试试这个:

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

编辑:你也可以通过stream_socket_enable_crypto建立安全连接()功能,但你要注意,它必须套接字连接的初始化后才能使用。

+0

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

1

嗯,我测试了你的代码在我的apache服务器上,它工作正常。你可以检查你的Apache配置。在配置中有一个名为"Registered Stream Socket Transports "的参数。只要检查tls是否存在那里的价值,否则有一些其他问题,但它绝对不是你的脚本

+0

做phpinfo()显示注册流套接字传输\t tcp,udp,unix,udg,ssl,sslv3,sslv2,tls –

+0

好吧,这很奇怪,但我注意到你的错误'$ errstr'是空的。你应该有一些东西。我试图改变端口,它给了我'拒绝连接'。同样,你应该有这个错误的东西 – aaron

+0

事情是它是空的,错误代码是0.在我原来的脚本错误记录捕获警告 - 警告:stream_socket_client():无法启用加密。我更新了这个问题。在测试脚本中可能没有显示警告的原因是我通过命令行 –