Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Подсчитываем кол-во запросов к БД


Автор: CyClon 7.2.2006, 18:44
Код
<?php

function sql_query($query) {
    global $sql_time, $sql_num;
    $mtime = explode(" ", microtime());
    $start = $mtime[1] + $mtime[0];
    mysql_query($query);
    $mtime = explode(" ", microtime());
    $end = $mtime[1] + $mtime[0];
    $sql_time[] = $end - $start;
    $sql_num++;
}

$sql_time['total'] = substr(($sql_time['total']), 0, 5);

?>


Вот то что смог сделать. Теперь вопросы:

1. Как сложить все значения массива. То есть я получу массив с несколькими значениями, типа $sql_time[0], $sql_time[1] и т.д. Мне нужно сложить все значения. Как сделать? Или есть более быстрый вариант?
2. Стоит ли использовать данную функцию или лучше использовать готовый класс.
3. Преимущества класса
4. Преимущества этой функции
5. Ваши предложения по осуществлению этого черного плана smile

Автор: Mal Hack 7.2.2006, 18:54
Вместо substr лучше заюзать sprintf
Что касается функции, то ей вполне можно пользоваться.

array_sum

Автор: CyClon 7.2.2006, 19:20
Забыл задать вопрос:

1. Что быстрее - эта функция или класс?

И хотелось бы все-таки услышать ответы по поводу преимуществ класса.
Добавлено @ 19:31
А если сделать так:

Код
<?php

function sql_query($query) {
    global $sql_start, $sql_end, $sql_num;
    $mtime = explode(" ", microtime());
    $sql_start[] = $mtime[1] + $mtime[0];
    mysql_query($query);
    $mtime = explode(" ", microtime());
    $sql_end[] = $mtime[1] + $mtime[0];
    $sql_num++;
}

    $sql_time = array_sum($sql_end) - array_sum($sql_start);
    $sql_time = sprintf($sql_time, 0, 5);

?>


Я так понимаю, что данный код более оптимальный. Как вы считаете?

Автор: Mal Hack 7.2.2006, 19:39
Цитата(CyClon @ 7.2.2006, 19:20 Найти цитируемый пост)

1. Что быстрее - эта функция или класс?


А это уже как реалиуешь.


Почитай про область видимости переменных.

Автор: CyClon 7.2.2006, 19:42
Почитаю. А если кратко? Получается второй вариант не будет быстрее первого? Mal Hack, посоветуйsmile Просто хочу определится с этой функцией, а потом читать ужеsmile Ну, а дальше видно будет ;)

Автор: Mal Hack 7.2.2006, 19:51
Если ты пишешь свой интерфейс для работы с БД, то, конечно, лучше будет эту функцию завязать с классом, если нет, то тогда нафиг ее...
По сути, эти две операции лишние, и создают лишнюю нагрузку на скрипт.

Автор: CyClon 7.2.2006, 20:01
Mal Hack, я с классами работать не умею вообще. В качестве коннекта к БД использую pconnect и mysql_select_db - две строки.
В общем, две операции - это в первом варанте? Или ты о $mtime = explode(" ", microtime()); ?

Автор: wsr 8.2.2006, 00:45
Код

class SQL {

      var $queries       = 0;          # Количество запросов к базе данных

      function query ( $query ) {
               $result = mysql_query ( $query, $this->sql_id );
               $this->queries++;
               return $result;
      }
}
$sql = new SQL;
$sql->query ( "SELECT ..." );

Ну и все в таком духе. как видишь все реализовано через Класс.

Автор: CyClon 8.2.2006, 14:10
Хм... Вроде бы все просто. Ну может все-таки кто подскажет что юзать, как и сколькоsmile

Автор: RomanK 8.2.2006, 18:54
wsr,
ИМХО, это лучше реализовать через статические методы тогда. Конечно если PHP5. smile

Код
<?php
class Sql
{
    static private $queryes=0;

    static public function Query($query)
    {
        self::$queryes++;
        return mysql_query($query);
    }

    static public function GetQueryes()
    {
        return self::$queryes;
    }
}

$sql=Sql::Query('SELECT * FROM table WHERE 1;');
echo Sql::GetQueryes();
?>

Как бы даже не то что лучше, а удобнее в ДАННОМ случае.

Автор: CyClon 9.2.2006, 09:31
Код
<?php 

$db['host'] = "localhost"; // Хост 
$db['uname'] = "root"; // Имя пользователя 
$db['password'] = ""; // Пароль 
$db['name'] = "slaed"; // Название БД 

$global['sql_count'] = 1; // Активизируем подсчет времени 

$sql_time = 0; 
$queries = 0; 

function sql_connect() { 
    global $db; 
    mysql_pconnect($db['host'], $db['uname'], $db['password']); 
    mysql_select_db($db['name']); 
} 

function sql_query($query) { 
    global $global, $sql_time, $queries; 
    if ($global['sql_count'] == 1) { 
        $mtime = explode(" ", microtime()); 
        $go = $mtime[1] + $mtime[0]; 
        mysql_query($query); 
        $mtime = explode(" ", microtime()); 
        $end = $mtime[1] + $mtime[0]; 
        $sql_time = $sql_time + round(($end - $go), 5); 
        $queries++; 
    } else { 
        mysql_query($query); 
    } 
} 

// Тест 

sql_connect(); 

sql_query("SELECT `cid` FROM `slaed_files` WHERE `title` = '123'"); 
sql_query("SELECT `cid` FROM `slaed_files` WHERE `title` = 'Название'"); 

echo "Затраченное время: ".$sql_time." сек.<br />\nЗапросов к БД: ".$queries; // Выводит ~0.00085 и 2 

?>


Вот значит что я наварганил. Если увидели где-то неоптимальный код и знаете решение - оптишитесь пожалуйста. Кстати, может дествительно в класс как-то все засунуть?

Автор: RomanK 9.2.2006, 18:46
CyClon тебе уже два человека написали как тебе это в класс можно засунуть. [Добавить время выполнения Sql запроса думаю не составит большого труда. (По аналогии)] Выбирай. smile

Автор: wsr 9.2.2006, 20:42
RomanK имхо наши с тобой варианты хороши для разных версий php. Просто у меня у самого стоит на компе PHP4, поэтому и пишу я все скрипты под четвертую версию.
А вообще нормал.

Автор: CyClon 9.2.2006, 21:58
Просто я не хочу пихать все в класс, т.к. не вижу никаких преимуществ. А вообще если буду пихать, то в вариант wsr, просто сам юзаю 4 PHP, да и понятнее как-то все ;)

Автор: RomanK 10.2.2006, 11:49
Цитата(CyClon @ 9.2.2006, 21:58 Найти цитируемый пост)

т.к. не вижу никаких преимуществ

Преимущества только в том, что будет удобнее, ИМХО. Хотя это как сказать... У всех свои предпочтения и вкусы. smile

Автор: Mal Hack 10.2.2006, 12:54
Цитата(CyClon @ 9.2.2006, 21:58 Найти цитируемый пост)

Просто я не хочу пихать все в класс, т.к. не вижу никаких преимуществ.

И не пихай. Когда увидешь преимущества для своей конкретной задачи. ТОгда и будешь пихать. использовать ООП надо грамотно. Так что подход мыслей - правильныйю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)