使用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();
PHP将不发送内容,直到60秒过去。使用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套接字发送数据并检索所有数据?
答案 0 :(得分:2)
PHP实际上是在立即发送数据;问题是Perl没有做任何事情。如果你这样做:
my $data = <$connection>;
print $data; #add this line
if($data != "1234") { ....
然后使用Ctrl-C终止PHP脚本(Windows - 如果你使用Linux,不知道该命令是什么),Perl脚本将立即输出“1234”。它挂在尖括号操作符上,因为它是一条读取线(即它正在寻找换行符而从未找到换行符)。以下任何一个都让您的代码适合我:
//in the PHP file
fwrite($socket, "1234\r\n");
或
#in the Perl file (instead of my $data = <$connection>)
my $data;
$connection->recv($data, 1024);
修改:在执行更改之前,请参阅以下评论。正如hobbs提到的那样,recv可能不是最好的选择,虽然它碰巧工作,因为它不是在寻找换行符而且输入很短。以某种身份发送换行符(第一个建议的变体)可能是更好的选择。