Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php/pdo] query logger

Pagina: 1
Acties:

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
Ik ben bezig met een kleine laag over de PDO class van pdo, zodat ik query tijden kan loggen.

Ik gebruik de pdo query() en execute() functies voor mijn queries. Nu loop ik echter een beetje vast op het loggen van queries met prepared statements.

de query($query) functie voert hem namelijk meteen uit, waardoor ik hem makkelijk kan loggen, maar bij de execute() gaat het iets anders:

PHP:
1
2
3
4
5
$stmt = $db->prepare("SELECT * FROM fruit WHERE soort = :soort");

$stmt->bindParam(':soort', 'appel', PDO::PARAM_STR);

$stmt->execute();


Kan iemand mij vertellen hoe ik dit op kan vangen in mijn pdo extended class?
Ik heb namelijk geen idee hoe ik dit met die variables, en functies binnen die variables op kan lossen.

Op mijn manier geeft hij namelijk niks terug als ik een query execute() (naast het fijt dat ik de statement niet op kan slaan in de array omdat ik de statement niet kan achterhalen)

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
class PDODebug extends PDO
{
    private $logarray = array();
     
    private function log($statement, $time, $type = 'query')
    {
        $logarray[] = 'PDODebug '.$statement.':::time:'. $time.', type:'.$type;
        $this->logarray = $logarray;
    }
    
    public function query($statement)
    {
        $time = microtime(true);
        $result = parent::query($statement);
        $time = microtime(true) - $time;

        $this->log($statement, $time);

        return $result;
    }
    
    public function execute()
    {
        $time = microtime(true);
        $result = parent::execute();
        $time = microtime(true) - $time;
        
        $this->log('xx', $time, 'execute');
    }

    public function get_log()
    {
        return $this->logarray;
    }
}

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Waarom zou je dit willen? Je zit minimaal nu inclusief php-tijd en pdo-tijd en connectie-tijd te meten.
Hoe sneller je query's hoe groter de afwijking.

Ik zou zeggen : Meet het zo dicht mogelijk bij de uitvoerder (oftewel mysql).

En helemaal met PDO, dan verstuur je (zoals je zelf al ziet) geen query meer naar de database, maar je verstuurt allerlei losse delen van een query en zegt dan tegen mysql : Voer maar uit...
Wil je de query weten dan zal je echt bij de dbase moeten navragen wat die nou uitgevoerd heeft, je php heeft hier geen weet van.

  • Tarilo
  • Registratie: December 2007
  • Laatst online: 18-11 15:02
Als je queries wil loggen kan je dat veel beter overlaten aan dat onderdeel dat de queries uitvoert, namelijk de SQL server. Deze heeft meer dan genoeg mogelijkheden om queries te loggen.

Wat bijvoorbeeld heel handig kan zijn is om alleen langzame queries te loggen, of queries die geen gebruikmaken van indexen. Twee dingen die MySQL in ieder geval ondersteund en ik neem aan alle andere grote RDBMSen ook.

Daarnaast voorkom je op deze manier inderdaad de problemen die Gomez12 al beschrijft met betrekking tot precisie.

  • sky-
  • Registratie: November 2005
  • Niet online

sky-

qn nna 👌

Je kunt de RDBMS ook laten loggen, zie http://dev.mysql.com/doc/refman/5.1/en/query-log.html - uitgaande van MySQL.

don't be afraid of machines, be afraid of the people who build and train them.


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Of het een goed idee is laat ik in het midden, sommige mensen kunnen hun config van de DB niet aanpassen bijvoorbeeld, dan kan dit best een redelijke oplossing zijn.

http://www.php.net/manual/en/pdo.setattribute.php
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
<?php // Niet getest!
class PDODebug extends PDO
{
    public function __construct(/*params*/)
    {
        parent::__construct(/*params*/);
        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementDebug'));
    }
    // De rest
}

class PDOStatementDebug extends PDOStatement 
{
    public function bindParam($k, $v, $type)
    {
        $this->params[$k] = $v;
        return parent::bindParam($k, $v, $type);
    }

    public function execute()
    {
        $result = parent::execute();
        $this->log('Time: '.$time.', Query: '.$this->queryString.' Params: '.print_r($this->params, true));
        return $result;
    }
}


Maar als ik jou was zou ik eens kijken naar doctrine (niet perse de ORM, maar de DBAL), die heeft al dit soort functionaliteit al ingebakken.

  • Saven
  • Registratie: December 2006
  • Laatst online: 20:24

Saven

Administrator

Topicstarter
thanks ga ik doen :)
Pagina: 1