【问题标题】:PHP socket_recvfrom free resourcesPHP socket_recv来自免费资源
【发布时间】:2015-08-06 22:34:22
【问题描述】:

我有一个用 PHP 编写的 UDP 守护程序,用于从远程 UDP 设备接收数据。

$sock = socket_create(AF_INET, SOCK_DGRAM, 0);
socket_bind($sock, 0, $port) or die('Could not bind to address'); 

while (true) {
  $r = socket_recvfrom($sock, $buf, 65535, 0, $remote_ip, $remote_port);
  echo "$remote_ip : $remote_port -- " . $buf ."\n";
  echo strlen($buf) . "\n";

  // DO DATABASE FUNCTIONS
}

有没有办法在每 x 次迭代后刷新缓冲区,因为它似乎在某个点被填满并且数据库函数似乎不再运行,直到我终止并重新启动应用程序?

数据并不重要(这就是我使用 UDP 的原因)

【问题讨论】:

    标签: php sockets udp


    【解决方案1】:

    使用ob_flush()

    $sock = socket_create(AF_INET, SOCK_DGRAM, 0);
    socket_bind($sock, 0, $port) or die('Could not bind to address'); 
    
    while (true) {
      $r = socket_recvfrom($sock, $buf, 65535, 0, $remote_ip, $remote_port);
      echo "$remote_ip : $remote_port -- " . $buf ."\n";
      echo strlen($buf) . "\n";
    
      if(strlen($buf)%1024 == 0)
      {
          flush();
          ob_flush();
      } 
    
      // DO DATABASE FUNCTIONS
    }
    

    有时,您可能还需要使用flush()。原因在这里解释:https://stackoverflow.com/a/4191417/1218075

    【讨论】:

    • 即使我的缓冲区是 65535 也可以以 1024 的倍数刷新吗?
    • socket_recvfrom() 中的第三个参数表示$buf 可以容纳的最大长度。假设您只收到 10000 个字节,那么 flush() 将永远不会发生。它只是一个例子。由您决定如何实现,它可以是基于计数器或基于字节的刷新。
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多