从PHP执行TCP / IP控制台命令的最佳方法

时间:2018-03-19 11:16:18

标签: php console tcp-ip fsockopen

在我开始之前,请原谅我的英语,我来自荷兰:)

我对使用PHP的fsockopen有疑问。

我的先决条件

所以基本上,我有一个在后台运行的Windows程序,它有一个TCP / IP远程控制台,我需要连接,所以我可以执行一些命令。我可以使用KiTTY连接到该控制台,并且可以毫无问题地执行我的命令。

我的解决方案

所以我现在面临的问题是,我需要能够从浏览器执行这些命令。我搜索了互联网,寻找最佳方法,我发现使用PHP的fsockopen连接到我的控制台。我尝试的代码如下:

$SOCKET = fsockopen("127.0.0.1", 12101, $errno, $errstr);

if($SOCKET){
 echo "Connected!";
}

$firstRead = fread($SOCKET, 8000);

echo($firstRead);

使用fputs发送命令:

fputs($SOCKET, "HELP \r\n");

然后,用这个读出我的回答:

$response = fread($SOCKET, 8000);
echo $response;

问题

但是在测试时我遇到了一些奇怪的问题。 一旦我执行像“HELP”这样的命令,我就可以从我的KiTTY会话中看到命令已执行并且我得到了响应,但是当我用“fread”读出响应时,我什么也得不到。但是当我使用循环来读取它时,它几乎每次都会在第二次尝试时从控制台读取内容:

do {
    $response = fread($SOCKET, 8000);
    $i++;
} while (strlen($response) < 5 || $i < 5);

(有时候,它会在第一次尝试时从控制台读取内容,但大多数情况下只会在第二次尝试时读取内容。)

问题

现在我的问题是(是),为什么它表现得如此奇怪?是因为我做错了什么?这真的是最好的方法吗?

旁注

当这个工作时,我需要能够用一堆AJAX requests调用这些PHP函数(或类似的东西),并获得在浏览器中显示的响应。这绝对是必须的,所以在写下可能的答案时请记住这一点:)

谢谢大家!

1 个答案:

答案 0 :(得分:0)

当您在PHP中使用fsockopen创建套接字时,您可能还需要指定它是阻塞还是非阻塞,如果是非阻塞套接字,则函数socket_read将返回{{ 1}}出现错误或连接已关闭,或者空字符串直到收到一些数据,如果是阻塞套接字而不是读取它,它将阻塞直到有一些数据要读取(或者如果是空字符串则为空超时被击中)。 您描述的行为似乎是非阻塞的。

要更改阻止类型,请执行以下操作:falsesocket_set_block

当带有套接字的代码工作时,AJAX请求不会出现任何问题,但请记住在PHP套接字中设置超时,否则如果服务器关闭或速度太慢,请求将失败并出现错误(如果超过set_time_limit,这是一个致命的错误,或者一个浏览器超时不变的JavaScript的超时,来自php的超时。)

以下是socket_readsocket_write手册的链接,我认为这些手册更适合socket_set_nonblockfread