Утечка памяти в PHP в клиентском сокете (UDP)

🙂

Я пытаюсь получить данные из приложения в реальном времени c # на моем php-сервере, а затем переместить изображение в браузере в соответствии с данными.

Нет проблем при отправке и получении данных, но использование памяти для chrome становится все больше и больше при запуске кода.

Если я закрою сокет внутри цикла while, производительность будет очень низкой, но использование памяти станет нормальным. Так что это касается открытого сокета …

вот код 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);
}
}

Спасибо ! 🙂

0

Решение

Техника, которую вы используете, называется «длинный опрос». Это забавный способ эмулировать двунаправленную связь, особенно со старыми браузерами, но имеет свои недостатки.

Проблема в том, что со временем вы отправляете в браузер огромное количество полезных данных.

Когда вы постоянно пишете в браузер, размер страницы увеличивается, а вместе с ней и дерево DOM. Все это должно храниться в памяти. Я предполагаю, что когда вы отправляете только несколько фрагментов скрипта, производительность все еще в порядке. Но тысячи и десять тысяч из них, конечно, съедят вашу память.

Кроме того, если вы используете диагностические инструменты, такие как Chrome Developer Tools или Firebug в Firefox, они хранят много отладочной информации, которая также потребляет много памяти. (Попробуйте отключить их.)

Если вы написали этот код просто для развлечения и экспериментов, вам не следует беспокоиться о потреблении памяти; это присуще долгому опросу.

Но если вы пытаетесь написать веб-приложение с реальной двунаправленной связью, вам следует использовать что-то вроде веб-сокетов (и, возможно, язык, отличный от PHP на стороне сервера).

0

Другие решения

Это не настоящий ответ на мой вопрос, но мой опыт может кому-то помочь.

Я не мог сделать этот «длинный опрос» с PHP-сервером, и это была вина PHP, а не браузера.
Я разработал хорошее приложение, работающее таким образом, используя сервер Node.js.

Приложение C # используется для обработки изображений с камеры. Данные в реальном времени, полученные в результате обработки изображения, отправляются на сервер Node.js и с сервера в браузер.

Сейчас я использую веб-технологии для разработки графического пользовательского интерфейса, которого было очень трудно достичь в .Net, и у него есть много других преимуществ …

0

По вопросам рекламы [email protected]