Резюме
Это восьмая статья о внедрении swool: реализация пула соединений MySQL swool.
- Глава 7: внедрение RPC swool
- Часть 6: swool интегрирован в небольшую структуру
- Часть 5. применение мультипротокола swool и многопортового
- Часть 4: применение swool http
- Часть 3: применение swool websocket
- Часть 2: применение задачи Свула
- Часть 1: применение таймера свула
После получения консультации от читателей у вас также может возникнуть такая ситуация, поэтому давайте поговорим об этом здесь:
“Брат Лян, мне 30 лет. У меня кризис среднего возраста. В последнее время я немного беспокоюсь. Я обнаружил, что, хотя я занят своей работой, я не чувствую, что мои способности улучшились. Я не могу закончить писать бизнес-коды весь день напролет. Время поджимает, а качество временного кода не очень хорошее. Я знаю, что еще многое можно улучшить, но у меня не было времени все время это менять. Это главным образом потому, что более поздние проекты являются неотложными. Я собираюсь в ближайшее время приступить к разработке. В такой ситуации что я могу сделать? “
Во-первых, я курица-овощ. Если мне это не нравится, не распыляйте его. Тогда я выскажу свое мнение:
Приведенное выше описание является субъективным. Иногда люди не могут найти свои собственные способности очень нормальными. Иногда, когда у них есть способность, они не могут показать ее сразу. Но когда они достигают определенной стадии, они внезапно обнаруживают, что они настолько могущественны.
Конечно, существует много видов способностей, таких как профессиональные способности, способность к быстрому обучению, способность контролировать прогресс, уверенность в себе-это тоже своего рода способность, бесстыдство-это своего рода способность, настойчивость-это своего рода способность.
На самом деле, самый быстрый способ улучшить свои способности-это практика работы. Спокойно спросите себя, присоединились ли вы ко многим группам Дэниела в wechat. Улучшились ли ваши способности? Чтение самостоятельной работы не практикуется, не является большим поглощением.
Если вам нужно дать конкретный план, то это для того, чтобы больше делиться в команде, потому что, прежде чем делиться, вы полностью подготовитесь к тому, чтобы избежать обмена, даже если иногда вы знаете, что, когда вы это говорите, это не так.
Обмен информацией на ранней стадии может заключаться в чтении рукописи, а обмен информацией на более поздней стадии может осуществляться без рукописи.
Тогда давайте поговорим еще немного. 30, поставьте перед собой цель. Не занимайтесь вслепую каждый день. Например, цель-технический эксперт, а цель-бизнес-эксперт. Это очень хорошо. Конечно, цель связана с вашей личностью.
Составьте несколько планов вокруг поставленной цели. Не думайте, что учиться каждый день естественно. Есть много возможностей и связей.
Наконец, если вы действительно чувствуете себя подавленным, измените свое окружение и не отпускайте себя.
Начиная с сегодняшней статьи, в этой статье реализован пул соединений MySQL swool. Код разработан на основе статьи “Реализация RPC swool”.
Сначала ознакомьтесь с содержанием предыдущей статьи:
- Реализованные запросы http/TCP
- Включает синхронные/асинхронные запросы
- Поделился исходным кодом onrequest. php и onreceive.php
- Ложные данные, возвращаемые в бизнес-логике order.php
Основные функции этой статьи:
- Данные в базе данных MySQL возвращаются в бизнес-логике order.php.
- Задача включает оркестровку
- Поддержка конфигурации главной/подчиненной базы данных
- Реализовать пул подключений к базе данных
- Реализовать творог базы данных
Код
Код
mysql = $pool->get(); $this->table = 'order'; } public function add($code = '', $name = '') { //Todo verification return $this->mysql->insert($this->table, ['code' => $code, 'name' => $name]); } public function edit($id = 0, $name='') { //Todo verification return $this->mysql->update($this->table, ['name' => $name], ['id' => $id]); } public function del($id = 0) { //Todo verification return $this->mysql->delete($this->table, ['id' => $id]); } public function info($code = '') { //Todo verification return $this->mysql->select($this->table, ['code' => $code]); } }
Задача включить процесс
I. необходимо добавить две новые конфигурации:
enable_coroutine = true task_enable_coroutine = true
II. Изменены параметры обратного вызова
$serv->on('Task', function ($serv, $task_id, $src_worker_id, $data) { ... }); Revised to: $serv->on('Task', function ($serv, $task) { $task - > worker? ID; // from which 'worker' process $task - > ID; // task number $task - > data; // task data });
Конфигурация ведущего/ведомого устройства базы данных
Конфигурация ведущего/ведомого устройства базы данных
Пул подключений к базе данных
Пул подключений к базе данных
pool)) { $this->config = $config; $this->pool = new chan($config['master']['pool_size']); for ($i = 0; $i < $config['master']['pool_size']; $i++) { go(function() use ($config) { $mysql = new MysqlDB(); $res = $mysql->connect($config); if ($res === false) { throw new RuntimeException("Failed to connect mysql server"); } else { $this->pool->push($mysql); } }); } } } public function get() { if ($this->pool->length() > 0) { $mysql = $this->pool->pop($this->config['master']['pool_get_timeout']); if (false === $mysql) { throw new RuntimeException("Pop mysql timeout"); } Defer (function() use ($MySQL) {// release $this->pool->push($mysql); }); return $mysql; } else { throw new RuntimeException("Pool length <= 0"); } } }
База данных творог
База данных творог
_execute($arguments[0]); } } public function connect($config) { // main library $master = new Swoole\Coroutine\MySQL(); $res = $master->connect($config['master']); if ($res === false) { throw new RuntimeException($master->connect_error, $master->errno); } else { $this->master = $master; } // slave Library $slave = new Swoole\Coroutine\MySQL(); $res = $slave->connect($config['slave']); if ($res === false) { throw new RuntimeException($slave->connect_error, $slave->errno); } else { $this->slave = $slave; } $this->config = $config; return $res; } public function insert($table = '', $data = []) { $fields = ''; $values = ''; $keys = array_keys($data); foreach ($keys as $k) { $fields .= "`".addslashes($k)."`, "; $values .= "'".addslashes($data[$k])."', "; } $fields = substr($fields, 0, -2); $values = substr($values, 0, -2); $sql = "INSERT INTO `{$table}` ({$fields}) VALUES ({$values})"; return $this->_execute($sql); } public function update($table = '', $set = [], $where = []) { $arr_set = []; foreach ($set as $k => $v) { $arr_set[] = '`'.$k . '` = ' . $this->_escape($v); } $set = implode(', ', $arr_set); $where = $this->_where($where); $sql = "UPDATE `{$table}` SET {$set} {$where}"; return $this->_execute($sql); } public function delete($table = '', $where = []) { $where = $this->_where($where); $sql = "DELETE FROM `{$table}` {$where}"; return $this->_execute($sql); } public function select($table = '',$where = []) { $where = $this->_where($where); $sql = "SELECT * FROM `{$table}` {$where}"; return $this->_execute($sql); } private function _where($where = []) { $str_where = ''; foreach ($where as $k => $v) { $str_where .= " AND `{$k}` = ".$this->_escape($v); } return "WHERE 1 ".$str_where; } private function _escape($str) { if (is_string($str)) { $str = "'".$str."'"; } elseif (is_bool($str)) { $str = ($str === FALSE) ? 0 : 1; } elseif (is_null($str)) { $str = 'NULL'; } return $str; } private function _execute($sql) { if (strtolower(substr($sql, 0, 6)) == 'select') { $db = $this->_get_usable_db('slave'); } else { $db = $this->_get_usable_db('master'); } $result = $db->query($sql); if ($result === true) { return [ 'affected_rows' => $db->affected_rows, 'insert_id' => $db->insert_id, ]; } return $result; } private function _get_usable_db($type) { if ($type == 'master') { if (!$this->master->connected) { $master = new Swoole\Coroutine\MySQL(); $res = $master->connect($this->config['master']); if ($res === false) { throw new RuntimeException($master->connect_error, $master->errno); } else { $this->master = $master; } } return $this->master; } elseif ($type == 'slave') { if (!$this->slave->connected) { $slave = new Swoole\Coroutine\MySQL(); $res = $slave->connect($this->config['slave']); if ($res === false) { throw new RuntimeException($slave->connect_error, $slave->errno); } else { $this->slave = $slave; } } return $this->slave; } } }
Вызовите На Рабочий Старт
try { MysqlPool::getInstance(get_config('mysql')); } catch (\Exception $e) { $serv->shutdown(); } catch (\Throwable $throwable) { $serv->shutdown(); }
запрос на тычок клиента
'SW', 'token' => 'Bb1R3YLipbkTp5p0', 'param' => [ 'class' => 'Order', 'method' => 'add', 'param' => [ 'code' => 'C'.mt_rand(1000,9999), 'name' = > order - '. Mt_rand (10009999), ], ], ]; // Editor $demo = [ 'type' => 'SW', 'token' => 'Bb1R3YLipbkTp5p0', 'param' => [ 'class' => 'Order', 'method' => 'edit', 'param' => [ 'id' => '4', 'name' = > order - '. Mt_rand (10009999), ], ], ]; // delete $demo = [ 'type' => 'SW', 'token' => 'Bb1R3YLipbkTp5p0', 'param' => [ 'class' => 'Order', 'method' => 'del', 'param' => [ 'id' => '1', ], ], ]; // query $demo = [ 'type' => 'SW', 'token' => 'Bb1R3YLipbkTp5p0', 'param' => [ 'class' => 'Order', 'method' => 'info', 'param' => [ 'code' => 'C4649' ], ], ]; $ch = curl_init(); $options = [ CURLOPT_URL => 'http://10.211.55.4:9509/', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => json_encode($demo), ]; curl_setopt_array($ch, $options); curl_exec($ch); curl_close($ch);
расширять
Официальное руководство клиента MySQL:
Официальное руководство клиента MySQL:
Вы можете попробовать другие методы, предоставляемые правительством.
Резюме
Демонстрационный код предназначен только для справки. В этом есть много слабых мест.
Измените в соответствии с вашими собственными потребностями, такими как проверка, связанная с бизнес-кодом, инкапсуляция метода творога…
Рекомендую идеальный продукт-пул подключений к базе данных MySQL (smproxy), разработанный swool:
Рекомендую идеальный продукт-пул подключений к базе данных MySQL (smproxy), разработанный swool:
Для демонстрации выше нужен исходный код, а также мой wechat. (меню – > добавить мой wechat – > сканировать меня)
Рекомендуемое чтение
- Системное объяснение Единый вход единого входа
- Системное объяснение – Защита веб-безопасности PHP
- Системное объяснение – Технология кэширования PHP
- Системное объяснение – Проверка подписи интерфейса PHP
- Системное объяснение – Высокоточная работа PHP с плавающей запятой
Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!