php - 无限循环

标签 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();

在 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/

相关文章:

csv - 在 Perl 中访问从 CSV 导入的哈希时出现问题

perl - 对于 Seq 对象数组,是否存在相当于 IO::ScalarArray 的 Bioperl?

java - 服务器(ANSI C)和客户端(JAVA)之间使用套接字进行通信

javascript - 如何在datepicker函数中传递php参数

php - Payfast 沙箱 notify_url 到本地主机

linux - 是否可以根据条件语句加载列表 perl 模块?

Windows 中的 C 编程套接字 - winsock2.h 链接库?

java tcp 服务器到 Android 设备

PHP substr 和 strlen 的替代方案

php - MySQL 将列中的日期与今天进行比较