【发布时间】:2014-09-22 15:32:01
【问题描述】:
我使用 Ratchet 作为一些基于浏览器的游戏的套接字服务器,我注意到一个非常奇怪的行为。
我的应用程序类实现了 WampServerInterface,我注意到在 4-5 个客户端连接和断开连接(通过 autobahn.js)之后,一些内存(大约 300KB)仍然卡住。然后,如果另外 7-8 个客户端连接和断开连接,则内存使用量不会增加。当 10-12 个新客户端连接和断开连接时,它会增加,所以我的印象是它重用了内存,但我仍然担心当许多客户端连接到服务器时它会导致内存泄漏。
然后我决定做一些测试,我制作了一个实现 MessageComponentInterface 的应用程序类(这样我就可以连接到 telnet)。下面是启动服务器的代码:
<?php
ini_set('display_errors', 'On');
require 'vendor/autoload.php';
require 'bootstrap.php';
use Ratchet\Server\IoServer;
use AsterMedia\Games\Socket;
$server = IoServer::factory(
new Socket(),
9090,
'127.0.0.1'
);
$server->run();
?>
我的应用程序类很简单,看起来像这样:
<?php
namespace AsterMedia\Games;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Socket implements MessageComponentInterface {
public function onClose(ConnectionInterface $conn) {
echo "Client disconnected" . $this->getMemoryUsage() . PHP_EOL;
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
public function onOpen(ConnectionInterface $conn) {
echo "Client connected" . $this->getMemoryUsage() . PHP_EOL;
}
public function onMessage(ConnectionInterface $from, $msg) {
echo $msg . PHP_EOL;
}
private function getMemoryUsage() {
return sprintf('[Memory usage (currently) %dKB/ (max) %dKB]', round(memory_get_usage(true) / 1024), memory_get_peak_usage(true) / 1024);
}
}
最后,我制作了一个 bash 脚本,可以无限循环地连接和断开连接:
while true
do
echo "connect"
exec 3<>/dev/tcp/127.0.0.1/9090
exec 3<&-
echo "disconnect"
sleep 1
done
运行 bash 脚本后,我注意到了同样的行为 - 几个周期后,内存使用量增加了。
这个问题与 Ratchet(或 React)有关还是只是 PHP 的问题?我忘了提到我使用启用了 GC 的 PHP 5.5.3。
【问题讨论】:
-
WampServerInterface,这是否意味着您在 Windows 上?您的脚本另有说明。最好还指定您正在使用的操作系统。
-
我不使用 Windows。我将 Linux Mint 16 与 Apache2 Web 服务器一起使用。当我说 WampServerInterface 时,我指的是 socketo.me/api/class-Ratchet.Wamp.WampServerInterface.html 我使用 WebSocket 应用程序消息传递协议 (WAMP),它包装了我的应用程序类(类名是 Socket)。我的应用程序类实现了 WampServerInterface... 我相信它与操作系统无关
-
这是最初的设置,当我注意到这个内存问题时,我决定不使用 WAMP 并仅使用 IoServer (socketo.me/docs/server),只是为了 100% 确保即使在我建立 telnet 连接...
-
如果你喜欢 PHP,你也可以试试 Truway(一个 PHP WAMP v2 实现)和 Crossbar.io(一个 WAMP v2 路由器):crossbar.io/docs/Getting-started-with-PHP - 这就是应用程序组件的样子github.com/crossbario/crossbar/blob/master/crossbar/crossbar/…
-
感谢您的建议,但我宁愿继续使用 Ratchet,因为它具有 SessionProvider(与我的 symfony2 网站共享会话)等功能。
标签: php memory-leaks ratchet