Ik besloot me vanavond te verdiepen in hoe je moet O.O.-programmeren in PHP. Na de shock verwerkt te hebben (ik programmeer meestal in C++ etc.) besloot ik om bovenop mysqli nog een interface te ontwikkelen zodat ik nog minder hoef te doen.

Nu vraag ik me eigenlijk het volgende af. Ik heb in mijn connect() methode een extra stuk code gebouwd zodat er opnieuw verbinding wordt gemaakt, wanneer de verbinding om de een of andere reden wegvalt. Om te kijken of de, eerder geopende, verbinding nog open is gebruik ik de mysqli::ping() methode. Wanneer blijkt dat de verbinding niet meer open is, start ik een nieuwe verbinding door middel van de mysql::real_connect() methode. Is dit een correcte manier van handelen?

Mijn code en wat test code staan hieronder:

Index.php (testprogramma):
<?php

require_once "dbInterface.php";

$database = Database::getInstance();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";
$database->killConnection();

echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->connect() ? "Connected!<br />" : "Not connected!<br />";
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";

$database->killConnection();
$database->killConnection();
echo $database->isConnected() ? "Connected to DB!<br />" : "Not connected to DB!<br />";

if(!$database->isConnected()) {
$database->verbalizeErrors();
}

unset($database);

?>

dbInterface.php (de interface klasse):
<?php

class Database {
/* Private variables */
private static $instance;
private $connection;
private $isConnected = false;

private $host = "localhost";
private $database = "PHPLearning";
private $username = "root";
private $password = "usbw";

/* Public variables */

/* Private methods */
private function __construct() {
}

/* Public methods */
public static function getInstance() {
if(Database::$instance == NULL) {
Database::$instance = new Database();
}

return Database::$instance;
}

public function __destruct() {
if($this->isConnected) {
$this->killConnection();
}

echo "Adios my friend<br />";
}

public function connect() {
if(!$this->isConnected) {
$this->connection = @new mysqli($this->host, $this->username, $this->password, $this->database);
echo "CONNECTING<br />";
} else if(!$this->connection->ping()) {
$this->connection->real_connect($this->host, $this->username, $this->password, $this->database);
echo "RECONNECTING<br />";
}

if(!$this->connection->connect_errno) {
$this->isConnected = true;
}

return $this->isConnected;
}

public function killConnection() {
if($this->isConnected) {
$this->connection->close();
$this->isConnected = false;
echo "CONNECTION KILLED<br />";
}
}

public function isConnected() {
return $this->isConnected;
}

public function verbalizeErrors() {
if($this->connection->connect_error) {
die("Connect error ".$this->connection->connect_errno.": ".$this->connection->connect_error."!<br />");
}
}
}

?>

Om straks queries te kunnen uitvoeren zal ik later waarschijnlijk een aantal methoden moeten toevoegen die fungeren als doorgeefluiken (Sorry! :'[ ).

Ik sta open voor alle feedback die jullie kunnen bedenken, ook als het niet gerelateerd is aan mijn vraag!
De meeste PHP scripts duren een fractie van een seconde. De kans dat een MySQL connectie wegvalt in die tijd is klein. Een goede foutafhandeling en rapportage is belangrijk. Maar om binnen een PHP script een wegvallende connectie proberen te herstellen gaat mij veel te ver.

Reageren