当使用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秒过去之前,不会发送,而不会发送内容。当使用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套接字中发送数据和检索所有数据?
发布于 2013-09-01 04:44:45
PHP实际上是立即发送数据;问题是Perl没有对它做任何事情。如果你这样做:
my $data = <$connection>;
print $data; #add this line
if($data != "1234") { ....然后用Ctrl-C (Windows --不知道命令是什么,如果您使用Linux)关闭PHP脚本,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);编辑:在实现更改之前,可以看到下面的注释。正如霍布斯所提到的,recv可能不是最好的选择,尽管它碰巧起作用了,因为它没有寻找换行符,而且输入很短。以某种容量发送换行符(第一个建议的变体)可能是更好的选择。
https://stackoverflow.com/questions/18548342
复制相似问题