|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2011-03-11 21:38 UTC] bas at baspeters dot com
-Package: OpenSSL related
+Package: Sockets related
[2011-03-11 21:38 UTC] bas at baspeters dot com
[2011-03-12 00:14 UTC] felipe@php.net
[2011-03-14 19:18 UTC] bas at baspeters dot com
-Operating System: Linux, OSX
+Operating System: Linux, FreeBSD, OSX
[2011-03-14 19:18 UTC] bas at baspeters dot com
[2011-05-09 16:23 UTC] cataphract@php.net
[2011-12-12 01:05 UTC] cataphract@php.net
-Package: Sockets related
+Package: Streams related
[2021-07-27 13:31 UTC] cmb@php.net
-Status: Open
+Status: Feedback
-Assigned To:
+Assigned To: cmb
[2021-07-27 13:31 UTC] cmb@php.net
[2021-08-08 04:22 UTC] php-bugs at lists dot php dot net
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 14:00:01 2025 UTC |
Description: ------------ I encountered a memory leak issue when creating an SSL enabled socket server in a long lived process. When an incoming listening socket is accepted on either the SSL or TLS protocol, the &$peer passthrough variable in the stream_socket_accept function causes a memory leak. NOTE: The test script below needs a valid certificate.pem file to work!! NOTE: The test script spawns a webserver to be reached on 127.0.0.1:8888 NOTE: Testing can be done in a browser by choosing appropriate protocol (http/https) and perform regular page refreshes Test matrix: SSL=true, PEER=true -> memory leak! SSL=false, PEER=true -> no memory leak SSL=true, PEER=false -> no memory leak SSL=false, PEER=false -> no memory leak Test script: --------------- define('SSL', true); define('PEER', true); $context = stream_context_create(); stream_context_set_option($context, 'ssl', 'local_cert', 'certificate.pem'); stream_context_set_option($context, 'ssl', 'passphrase', 'password'); stream_context_set_option($context, 'ssl', 'allow_self_signed', true); if(SSL) { $server = stream_socket_server("ssl://0.0.0.0:8888", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context); } else { $server = stream_socket_server("tcp://0.0.0.0:8888", $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN); } while(true) { if(PEER) { $client = @stream_socket_accept($server, 2, $peer); } else { $client = @stream_socket_accept($server, 2); } if($client === false) continue; @fwrite($client, "HTTP/1.1 200 OK\r\n\r\nMemory usage: ".memory_get_usage().' bytes'); @fclose($client); } Expected result: ---------------- Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Memory usage: 641032 bytes Actual result: -------------- Memory usage: 641368 bytes Memory usage: 641560 bytes Memory usage: 641752 bytes Memory usage: 641944 bytes Memory usage: 642232 bytes Memory usage: 642424 bytes Memory usage: 642616 bytes Memory usage: 642808 bytes Memory usage: 643000 bytes Memory usage: 643192 bytes Memory usage: 643384 bytes Memory usage: 643576 bytes