С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
tekken
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 13
1

Постоянные соединения

05.04.2016, 10:15. Просмотров 493. Ответов 5
Метки нет (Все метки)

Добрый день.
В предыдущей теме поднимал вопрос, почему БД уходит в даун. Проблема оказалась в передаче конструктору PDO атрибута ATTR_PERSISTENT => true. Но вопрос теперь в другом: согласно документации:
Код
Во многих приложениях может оказаться полезным использование постоянных соединений к базам данных.
Постоянные соединения не закрываются при завершении работы скрипта, они кэшируются и используются повторно, когда другой скрипт запрашивает соединение с теми же учетными данными.
Постоянные соединения позволяют избежать создания новых подключений каждый раз, когда требуется обмен данными с базой, что в результате дает прирост скорости работы таких приложений.
Т.е. вещь очень даже полезная. Собственно вопрос - как убить двух зайцев (что бы и постоянное соединение было, и БД не падала)?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2016, 10:15
Ответы с готовыми решениями:

Потеря соединения с БД
К одной БД имеют доступ два пользователя. Оба могут делать в ней изменения (по...

Нет соединения с БД
Добрый день эксперты!Такая проблема-скинули мне сайт готовый,закинул его в...

Дескриптор соединения с MySQL
Что такое дескриптор соединения с MySQL? Какой тип данных он представляет?

Ошибка соединения с PDO
Пытаюсь осваивать PDO define('DB_DRIVER','mysql');...

Неработающая проверка соединения с БД
Привет. Всегда провожу соединение с базой данных через new mysqli. В конце...

5
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
05.04.2016, 12:59 2
Цитата Сообщение от tekken Посмотреть сообщение
что бы и постоянное соединение было, и БД не падала
подумайте сами, зачем вам постоянное соединение при нулевой посещаемости, а сервер отваливается по таймауту? нажмите f5 в бараузере. На хостинге будет нормальный сервер и ничего падать не будет. конечно если в вашем коде не происходит явного закрытия соединения с последующей попыткой обратится к нему.
0
tekken
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 13
05.04.2016, 14:10  [ТС] 3
Цитата Сообщение от wq Посмотреть сообщение
подумайте сами, зачем вам постоянное соединение при нулевой посещаемости, а сервер отваливается по таймауту? нажмите f5 в бараузере. На хостинге будет нормальный сервер и ничего падать не будет. конечно если в вашем коде не происходит явного закрытия соединения с последующей попыткой обратится к нему.
А где уверенность, что на хостинге ничего падать не будет? Для меня этот проект учебный, но ответы на вопросы такого рода нужны для профессионального развития.

А на счёт кода, он ниже:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class DatabaseHandler
{
  // Переменная для хранения экземпляра класса PDO
  private static $_mHandler;
  // private-конструктор, не позволяющий напрямую создавать объекты класса
  private function __construct()
  {
  }
  // Возвращает проинициализированный дескриптор базы данных
  private static function GetHandler(){
    // Создаем соединение с базой данных, только если его еще нет
    if(!isset(self::$_mHandler)){
      // Выполняем код, перехватывая потенциальные исключения
      try{
        // Создаем новый экземпляр класса PDO
        self::$_mHandler = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD, array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));
        // Настраиваем PDO на генерацию исключений
        self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      }
      catch(PDOException $e){
        // Закрываем дескриптор и генерируем ошибку
        self::Close();
        trigger_error($e->getMessage(), E_USER_ERROR);
      }
    }
    // Возвращаем дескриптор базы данных
    return self::$_mHandler;
  }
  // Очищаем экземпляр класса PDO
  public static function Close(){
    self::$_mHandler = null;
  }
  // Метод-обертка для PDOStatement::execute()
  public static function Execute($sqlQuery, $params = null){
    // Пытаемся выполнить SQL-запрос или хранимую процедуру
    try{
      // Получаем дескриптор базы данных
      $database_handler = self::GetHandler();
      // Подготавливаем запрос к выполнению
      $statement_handler = $database_handler->prepare($sqlQuery);
      // Выполняем запрос
      $statement_handler->execute($params);
      self::Close();
    }// Генерируем ошибку, если при выполнении SQL-запроса возникло исключение
    catch(PDOException $e){
      // Закрываем дескриптор базы данных и генерируем ошибку
      self::Close();
      trigger_error($e->getMessage(), E_USER_ERROR);
    }
  }
  // Метод-обертка для PDOStatement::fetchAll()
  public static function GetAll($sqlQuery, $params = null, $fetchStyle = PDO::FETCH_ASSOC){
    // Инициализируем возвращаемое значение в null
    $result = null;
    // Пытаемся выполнить SQL-запрос или хранимую процедуру
    try{
      // Получаем дескриптор базы данных
      $database_handler = self::GetHandler();
      // Подготавливаем запрос к выполнению
      $statement_handler = $database_handler->prepare($sqlQuery);
      // Выполняем запрос
      $statement_handler->execute($params);
      $result = $statement_handler->fetchAll($fetchStyle);
      self::Close();
    }catch (PDOException $e){
      // Закрываем дескриптор базы данных и генерируем ошибку
      self::Close();
      trigger_error($e->getMessage(), E_USER_ERROR);
    }
    return $result;
  }
  // Метод-обертка для PDOStatement::fetch()
  public static function GetRow($sqlQuery, $params = null, $fetchStyle = PDO::FETCH_ASSOC){
    // Инициализируем возвращаемое значение в null
    $result = null;
    // Пытаемся выполнить SQL-запрос или хранимую процедуру
    try{
      // Получаем дескриптор базы данных
      $database_handler = self::GetHandler();
      // Подготавливаем запрос к выполнению
      $statement_handler = $database_handler->prepare($sqlQuery);
      // Выполняем запрос
      $statement_handler->execute($params);
      $result = $statement_handler->fetchAll($fetchStyle);
      self::Close();
    }catch (PDOException $e){
      // Закрываем дескриптор базы данных и генерируем ошибку
      self::Close();
      trigger_error($e->getMessage(), E_USER_ERROR);
    }
    return $result;
  }
  // Возвращает значение первого столбца из строки
  public static function GetOne($sqlQuery, $params = null){
    // Инициализируем возвращаемое значение
    $result = null;
    // Пытаемся выполнить SQL-запрос или хранимую процедуру
    try{
    // Получаем дескриптор базы данных
      $database_handler = self::GetHandler();
    // Готовим запрос к выполнению
      $statement_handler = $database_handler->prepare($sqlQuery);
    // Выполняем запрос
      $statement_handler->execute($params);
    // Получаем результат
      $result = $statement_handler->fetch(PDO::FETCH_NUM);
      /* Сохраняем первое значение из множества (первый столбец первой строки)
      в переменной $result */
      $result = $result[0];
      self::Close();
    }catch (PDOException $e){
      // Закрываем дескриптор базы данных и генерируем ошибку
      self::Close();
      trigger_error($e->getMessage(), E_USER_ERROR);
    }
    return $result;
  }
}
0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
05.04.2016, 14:47 4
Запомните авторов вашего учебника по php, чтобы больше не покупать эти перлы(по вашему коду ориентируюсь). Учебник можно пустить на растопку. К сожалению начал на це, поэтому посоветовать нормальный учебник по пхп не могу. Разве что официальный мануаль,но он конечно не ударит по рукам за такую привязанность к статике в классах
0
tekken
0 / 0 / 0
Регистрация: 12.01.2016
Сообщений: 13
05.04.2016, 17:38  [ТС] 5
Цитата Сообщение от wq Посмотреть сообщение
Запомните авторов вашего учебника по php, чтобы больше не покупать эти перлы(по вашему коду ориентируюсь). Учебник можно пустить на растопку. К сожалению начал на це, поэтому посоветовать нормальный учебник по пхп не могу. Разве что официальный мануаль,но он конечно не ударит по рукам за такую привязанность к статике в классах
Спасибо за ответ "по теме".
0
wq
85 / 78 / 32
Регистрация: 26.11.2015
Сообщений: 481
05.04.2016, 17:42 6
Цитата Сообщение от tekken Посмотреть сообщение
Спасибо за ответ "по теме"
какая тема такой и ответ.
0
05.04.2016, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2016, 17:42

Закрытие соединения MySQLi
Добрый день, товарищи. Я сделал страницу с простой формой и обработчик к ней....

PHP и Firebird - нет соединения
Ребят плиз подскажите что можно сделать!!! Скрипт на PHP не соединяется с базой...

Измерение скорости интернет соединения
Здравствуйте, форумчане. Хочу сделать сайт для измерения пропускной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru