我使用 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。