Подтвердить что ты не робот

Как эффективно подключаться к mysql в php без повторного подключения к каждому запросу

Мне очень сложно переписывать свой код каждый раз, когда я узнаю что-то новое о php (например, тот факт, что соединения mysql не могут быть переданы в сеансе как дескриптор).

Как вы реализуете соединение mysql в своих проектах? Многие люди предложили "объединение пулов", но после прочтения руководства я все еще потерян. Это похоже: "объединение пулов - mysql_pconnect!" - me: "и...? Как это вообще происходит в реальности? Можете ли вы передать mysql_pconnect в сеансе? Почему это, казалось бы, таинственная аура?"

Позвольте мне объяснить мою ситуацию. У меня есть функция под названием "query1":

function query1($query)
{
    $db = new mysql(HOST,USER,PASS,DBNAME);
    $result = $db->query($query);
    $db->close();
    return $result;
} 

Это похоже на расточительный и неэффективный способ запроса db ( особенно, так как вам нужен дескриптор mysql для таких функций, как mysql_real_escape_string). Какая правильная форма для этого? Может кто-нибудь, пожалуйста, помогите мне?

Спасибо, я бы очень признателен за честный ответ.

4b9b3361

Ответ 1

Обычно соединения происходят после загрузки страницы. ИНАЧЕ

class Database{
    public function connect()
    {
         $this->connection = mysql_connect();
    }

    // This will be called at the end of the script.
    public function __destruct()
    {
        mysql_close($this->connection);
    }

    public function function query($query)
    {
        return mysql_query($query, $this->connection);
    }
}
$database = new Database;
$database->connect();

$database->query("INSERT INTO TABLE (`Name`) VALUES('Chacha')");

В принципе, вы открываете соединение в начале страницы, закрываете его на конечной странице. Затем вы можете создавать различные запросы во время страницы и не должны ничего делать с этим соединением.

Вы даже можете сделать mysql_connect в конструкторе, как предлагает Эрик.


Чтобы использовать вышеописанное с помощью глобальных переменных (не предлагается, поскольку оно создает глобальное состояние), вы бы сделали что-то вроде

Global $db;

$db = new Database;
// ... do startup stuff

function doSomething()
{
    Global $db;
    $db->query("Do Something");
}

О, и никто не упоминал, что вам не нужно передавать параметр. Просто подключитесь

mysql_connect();

Затем mysql_query будет использовать последнее соединение независимо от области действия.

mysql_connect();

function doSomething()
{
    mysql_query("Do something");
}

В комментариях:

Я думаю, вы должны использовать mysql_pconnect() вместо mysql_connect(), потому что mysql_connect() не использует пул соединений. - nightcoder

Возможно, вам стоит подумать, используете ли вы mysql_connect или mysql_pconnect. Однако вы должны подключаться только один раз за script.

Ответ 2

Вам не нужно подключаться к базе данных в каждой функции. Вам необходимо подключиться к базе данных, когда script начинает работать и сохраняет объект подключения в глобальном состоянии. В любой функции вы можете использовать этот объект соединения для запроса базы данных. Ваш объект соединения будет воссоздан каждый раз, когда выполняется script, но он будет очень быстрым, потому что за сценой используется специальный пул соединений, поэтому соединение будет выполнено немедленно (вопрос микросекунд, потому что на самом деле соединение не было даже сломано, он был сохранен в пуле соединений).

Вот пример, который вы просили:

// this code should be executed on every page/script load:
$adoConn = ADONewConnection(...);
$adoConn->PConnect(...);

// ...

//And then in any place you can just write:
global $adoConn;
$adoConn->ExecuteNonQuery("INSERT INTO test SET Value = 'Hello, world!'");

Что касается вашего вопроса "как реализовать пул соединений". Вы этого не сделаете. Он поддерживается сервером за сценой и используется, если вы (или библиотека PHP для работы с PHP) используете функцию mysql_pconnect().

PS. Если вы боитесь сохранить $adoConn в качестве глобальной переменной (я не), вы можете создать класс со статическим свойством:

class DB
{
  public static $adoConn;
}

// ...

DB::$adoConn->ExecuteNonQuery(...);