从 PHP 向 TCP/IP 控制台执行命令的最佳方式
Best way to execute commands to TCP/IP console from PHP
在开始之前,请原谅我的英语,我来自荷兰:)
我对 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 中使用 fsockopen
创建套接字时,您可能还想指定它是阻塞的还是 non-blocking,如果是 non-blocking 套接字function socket_read
will return false
on error or if the connection was closed, or empty string until some data is received, 在阻塞套接字的情况下,而不是当你阅读它时,它会阻塞直到有一些数据要读取(如果超时则为空字符串)。
您描述的行为似乎是 non-blocking.
更改阻塞类型有:socket_set_block
和socket_set_nonblock
。
当你的套接字代码工作时,AJAX 请求不会有任何问题,但请记住在 PHP 套接字中设置超时,否则如果服务器关闭或太慢了,请求将失败并出现错误(如果超过 set_time_limit,则从 php 超时,这是一个致命错误,或者 JavaScript 具有浏览器超时常量)。
这里是 socket_read and socket_write 手册的链接,我认为 fread
和 fputs
.
更合适
在开始之前,请原谅我的英语,我来自荷兰:)
我对 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 中使用 fsockopen
创建套接字时,您可能还想指定它是阻塞的还是 non-blocking,如果是 non-blocking 套接字function socket_read
will return false
on error or if the connection was closed, or empty string until some data is received, 在阻塞套接字的情况下,而不是当你阅读它时,它会阻塞直到有一些数据要读取(如果超时则为空字符串)。
您描述的行为似乎是 non-blocking.
更改阻塞类型有:socket_set_block
和socket_set_nonblock
。
当你的套接字代码工作时,AJAX 请求不会有任何问题,但请记住在 PHP 套接字中设置超时,否则如果服务器关闭或太慢了,请求将失败并出现错误(如果超过 set_time_limit,则从 php 超时,这是一个致命错误,或者 JavaScript 具有浏览器超时常量)。
这里是 socket_read and socket_write 手册的链接,我认为 fread
和 fputs
.