【问题标题】:Best way to execute commands to TCP/IP console from PHP从 PHP 向 TCP/IP 控制台执行命令的最佳方式
【发布时间】:2018-08-27 22:27:08
【问题描述】:

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

我有一个关于使用 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 函数(或类似的东西),并获得在浏览器中显示的响应。这是绝对必须的,所以在写一个可能的答案时请记住这一点:)

谢谢大家!

【问题讨论】:

    标签: php console tcp-ip fsockopen


    【解决方案1】:

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

    更改阻塞类型有:socket_set_blocksocket_set_nonblock

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

    这里是socket_readsocket_write的手册链接,我认为更适合freadfputs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多