当使用 feof
或 fgets
时,脚本将一直运行到 1 分钟最大执行标记。
my $socket = new IO::Socket::INET(
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
ReuseAddr => 1,
);
my $connection = $socket->accept();
$connection->send("\0"); # makes PHP send the contents
my $data = <$connection>;
if($data != "1234") {
$connection->send("not accepted");
} else {
$connection->send("accepted");
}
$connection->close();
在 60 秒过去之前,PHP 将不发送内容。使用 fread
时,它几乎会立即传递数据(但只会返回 \0
)。
$socket = fsockopen('tcp://192.168.56.101', 5000); // virtualbox IP
fwrite($socket, '1234');
echo fread($socket, 128);
fclose($socket);
上面的脚本几乎会立即执行,但只会得到 \0
。
while(!feof($socket)) {
echo fread($socket, 128);
}
在执行 60 秒之前,使用上述脚本不会发送任何数据。
问题
如何让 PHP 在没有 60 秒执行超时的情况下发送数据并从 perl 套接字检索所有数据?
最佳答案
PHP 实际上是立即发送数据;问题是 Perl 没有对它做任何事情。如果你这样做:
my $data = <$connection>;
print $data; #add this line
if($data != "1234") { ....
然后使用 Ctrl-C 终止 PHP 脚本(Windows——如果您使用的是 Linux,则不知道该命令是什么),Perl 脚本将立即输出“1234”。它卡在尖括号运算符上,因为那是一个 readline(即它正在寻找换行符,但从未找到)。以下任一项都让您的代码为我工作:
//in the PHP file
fwrite($socket, "1234\r\n");
或
#in the Perl file (instead of my $data = <$connection>)
my $data;
$connection->recv($data, 1024);
编辑:在实现更改之前查看下面的评论。正如霍布斯所提到的,recv 可能不是最佳选择,尽管它碰巧起作用了,因为它不是在寻找换行符并且输入很短。以某种身份发送换行符(第一个建议的变体)可能是更好的选择。
关于php - 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18548342/