2015-01-28 6 views
3

Я новичок в программировании (особенно в PHP). Я пишу простой PHP-сайт. Я также использую базу данных PostgreSQL. Вот мой маленький класс для работы с базой данных.PHP PostgreSQL открытое/закрытое соединение

class dbWorker { 

    private static $conString = "host=localhost port=5432 dbname=myDB user=postgres password=root"; 

    public static function execute($sql) { 
    $db_conn = pg_connect(self::$conString) or die('Could not connect: ' . pg_last_error()); 
    pg_query($sql) or die('Query error: ' . pg_last_error()); 
    pg_close($db_conn); 
    return; 
    } 

    public static function queryOne($sql) { 
    $allData = self::queryAll($sql); 
    if ($allData) { 
     return $allData[0]; 
    } 
    return null; 
    } 

    public static function queryAll($sql) { 
    $db_conn = pg_connect(self::$conString) or die('Could not connect: ' . pg_last_error()); 
    $qu = pg_query($db_conn, $sql) or die('Query error: ' . pg_last_error()); 


    $retval = []; 
    while ($data = pg_fetch_object($qu)) { 
     $retval[] = $data; 
    } 


    pg_free_result($qu); 
    pg_close($db_conn); 

    if (!empty($retval)) { 
     return $retval; 
    } 

    return null; 
    } 

} 

Это довольно удобно, используя это. Но когда я использую этот класс 10-20 раз на странице - время загрузки страницы занимает около 5-6 секунд. Затем я удалил следующие строки:

pg_free_result($qu); 
    pg_close($db_conn); 

После этого время загрузки страницы составило 161 миллисекунду.

Вопрос в том, как лучше организовать этот процесс.

Должен ли я написать что-то вроде этого?

dbWorker::open_connection(); 
... 
all my functions calls (like getComments(), getMessages(), getTasksList() ect.) 
... 
dbWorker::close_connection(); 

На данный момент я новичок, и я ищу простое решение. (Заранее спасибо за помощь и извините за мой английский)

+1

Да, нет смысла открывать и закрывать соединение несколько раз на одной странице. Я не знаю, есть ли какое-либо значение при явном закрытии соединения, если это веб-страница. – halfer

+1

Во-первых, почему вы хотите многократно открывать и закрывать соединение с базой данных для одной страницы? Это только приводит к проблемам с производительностью. Во-вторых, всегда используйте пул соединений, например pgBouncer или pgPool, для повышения производительности и масштабируемости. –

ответ

2

Я создал соединение один раз, выполнил все ваши запросы sql, а затем закрою соединение.

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

+2

Постоянство должно обрабатываться пулом соединений, а не приложением. –

+1

В этом простом случае я не думаю, что постоянная связь не нужна. –

Смежные вопросы