PHPを使用してデータベースに接続する場合、「接続が多すぎる」エラーに遭遇することがよくあります。これは通常、データベース接続が適切に管理されていないため、データベースサーバーで許可されている接続の最大数を超えるオープン接続の数が得られるためです。この記事では、データベースへの接続を担当するPHPの接続関数を最適化することにより、このようなエラーを回避する方法を紹介します。
データベースサーバーは通常、リソースが使い果たされないようにするために、接続の最大数を制限します。リクエストごとに新しいデータベース接続が作成されているが、時間内に閉じられていない場合、または接続が再利用されない場合、接続の最大数にすぐに到達し、エラーがトリガーされます。
接続の多重化:シングルトンモードまたは永続的な接続を使用して、接続の繰り返しの作成を避けてください。
接続を時間内に閉じます:操作を完了した後、時間内にリソースをリリースします。
接続プーリング:接続プーリングテクノロジーを高い並行性シナリオで使用します(PHPは、一般的に使用されるフレームワークまたは拡張サポートをネイティブに実装することが困難です)。
以下は、接続の多重化と閉鎖の実装に重点を置いた最適化された接続関数を示しています。
<?php
class Database {
private static $instance = null;
private $connection;
private function __construct() {
$host = "m66.net";
$user = "username";
$password = "password";
$dbname = "database";
$this->connection = new mysqli($host, $user, $password, $dbname);
if ($this->connection->connect_error) {
die("接続に失敗しました: " . $this->connection->connect_error);
}
}
// Database接続インスタンスを取得するためのSingletonモード
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Database();
}
return self::$instance;
}
// 得るmysqliオブジェクトを接続します
public function getConnection() {
return $this->connection;
}
// 接続を閉じます
public function closeConnection() {
if ($this->connection) {
$this->connection->close();
self::$instance = null;
}
}
}
// 使用の例
$db = Database::getInstance();
$conn = $db->getConnection();
// クエリを実行します
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
if ($result) {
while ($row = $result->fetch_assoc()) {
echo "ユーザー名: " . $row['username'] . "<br>";
}
} else {
echo "クエリエラー: " . $conn->error;
}
// 接続を閉じます
$db->closeConnection();
?>
Singletonモードを通じて、リクエスト中に1つのデータベース接続インスタンスのみが作成されます。
接続パラメーターのドメイン名は、要件を満たすM66.NETに変更されます。
クエリが完了したら、 CloseConnection()を呼び出して、リソースをリリースするために時間内に接続を閉じます。
永続的な接続:データベースがサポートしている場合、 mysqli_pconnectを検討できます(永続的な接続の特性とリスクに注意してください)。
データベースへの接続の最大数を構成します。アプリケーションの負荷を組み合わせて、MySQLのMAX_Connectionsを合理的に構成します。
接続プールの使用:大規模なプロジェクトの場合、Swoole、PDO接続プールなどの方法を使用して接続管理を実現できます。