客户端套接字(UDP)中的PHP内存泄漏

时间:2015-08-24 11:48:24

标签: php sockets memory-leaks udp

:)

我正在尝试从我的php服务器中的c#实时应用程序接收数据,然后根据数据在浏览器中移动图片。

数据发送和接收没有问题,但运行代码时,chrome的内存使用量越来越多。

如果我在while循环中关闭套接字,性能会变得非常低但是mem使用率正常。所以这是关于打开的套接字......

这是php代码:

<?php 
//http://www.binarytides.com/udp-socket-programming-in-php/
//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
{
   die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if( !socket_bind($sock, "0.0.0.0" , 41181) )
{
    die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";

//Do some communication, this loop can handle multiple clients
while(1)
{
//echo "Waiting for data ... \n";
   $r = socket_recvfrom($sock, $buf, 20, 0, $remote_ip, $remote_port);
 ?>

 <script type="text/javascript">    
    var data =  "<?php echo $buf ?>";     
 </script>

<?php
 }
 socket_close($sock);
 ?>

这里是c#函数(数据发送者):

 public static void SendUDP(string hostNameOrAddress, int destinationPort, string data, int count)
    {
    //class member :  Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
    //socket is defined as class member and used here
        for (int i = 0; i < count; i++)
        {
            socket.SendTo(buffer, endPoint);
        }
    }    

谢谢! :)

2 个答案:

答案 0 :(得分:0)

您正在使用的技术称为“长轮询”。这是一种模仿双向通信的有趣方式,特别是对于旧浏览器,但有其缺点。

问题是,随着时间的推移,您向浏览器发送了大量的有效负载。

当您不断写入浏览器时,页面大小会增加,并且随之增加DOM树。所有这些都必须存储在内存中。我假设当你只发送一些脚本块时,性能仍然可以。但是成千上万的人当然会吃掉你的记忆。

此外,如果您使用的是诊断工具,例如Firefox中的Chrome开发者工具或Firebug,它们会存储大量调试信息,这些信息也会占用大量内存。 (尝试禁用它们。)

如果您为了娱乐和实验而编写此代码,则不必担心内存消耗;这是长期民意调查所固有的。

但是,如果您正在尝试使用真正的双向通信编写Web应用程序,则应使用Web套接字(可能与服务器端的PHP语言不同)。

答案 1 :(得分:0)

这不是我的问题的真实答案,但我的经验可能对某人有帮助。

我不能用PHP服务器进行“长轮询”,这是PHP的错,而不是浏览器。 我使用Node.js服务器以这种方式开发了一个很好的应用程序。

我的C#app用于处理来自相机的图像。导致图像处理的实时数据被发送到Node.js服务器并从服务器发送到浏览器。

现在我使用网络技术开发一个在.Net中很难实现的图形用户界面,它还有许多其他好处......