Как Вы эффективно соединяетесь с mysql в php, не соединяясь снова на каждом вопросе

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

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

Позвольте мне объяснить свою ситуацию. У меня есть функция, вызванная «query1»:

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

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

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

13
задан Gal 24 January 2010 в 22:29
поделиться

2 ответа

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

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 в конструкторе, поскольку Erik предлагает.


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

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 . Тем не менее, вы все равно должны подключаться только один раз за скрипт.

16
ответ дан 1 December 2019 в 23:47
поделиться

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

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

// 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(...);
1
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: