无限的feof循环

时间:2013-08-31 12:51:29

标签: php perl sockets

使用feoffgets时,脚本将一直运行至最长执行标记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套接字发送数据并检索所有数据?

1 个答案:

答案 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可能不是最好的选择,虽然它碰巧工作,因为它不是在寻找换行符而且输入很短。以某种身份发送换行符(第一个建议的变体)可能是更好的选择。