Мне очень сложно переписывать свой код каждый раз, когда я узнаю что-то новое о 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; }
Это кажется скудным и неэффективным способом запроса db ( тем более, что вам нужен дескриптор mysql для таких функций, как mysql_real_escape_string). Какая правильная форма для этого? Может кто-нибудь, пожалуйста, помогите мне?
Спасибо, я бы очень признателен за честный ответ.
Обычно соединения происходят после загрузки страницы. AKA
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 () не использует пул соединений. – ночной клуб
Возможно, вам стоит подумать, используете ли вы mysql_connect
или mysql_pconnect
. Тем не менее, вы должны подключаться только один раз к сценарию.
Вам не нужно подключаться к базе данных в каждой функции. Вам нужно подключиться к базе данных при запуске скрипта и сохранить объект подключения в глобальном состоянии. В любой функции вы можете использовать этот объект соединения для запроса базы данных. Ваш объект соединения будет воссоздан для каждого запуска сценария, но он будет очень быстрым, потому что за сценой используется специальный пул соединений, поэтому соединение будет выполнено немедленно (вопрос микросекунд, потому что на самом деле соединение не было даже сломано, это было сохранен в пуле соединений).
Вот пример, который вы просили:
// 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(...);