php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.03.2011, 17:49  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard $mysqli->multi_query(); & $mysqli_stmt->free();

Ich frage mich jetzt, nachdem ich einige Funktionen der Klasse mysqli überladen habe, ob dies denn eine gute Idee war? Ist doch denke ich praktischer wenn man das ->free(); nicht manuell machen muss (muss man bei multi_query ja) Ist es denn nicht aber besser es einfach ohne Klasse zu machen, als $arr = $this->sql->multi_query("…"); var_dump($arr[0]); einfach so schreiben zu können? Weil es dennoch ein bisschen Overhead produziert…? Die Frage dabei ist, ob es sich lohnt…

PHP-Code:
<?php

class dbal extends mysqli {

    protected 
$result_non_free_multi_query;

    final function 
dbal($host,$user,$pass,$db) {
        return 
parent::mysqli($host,$user,$pass,$db);
    } 
//function dbal
    
    // multi_query's with the result false disabled
    
final function multi_query($sql)
    {
        
$arr = &$this->result_non_free_multi_query;
        for(
$i=count($arr)-1;$i>0;--$i)
            
$arr[$i]->free();
        
$arr = array();
        if (
parent::multi_query($sql))
        {
            
$i=-1;
            do {
                if (
$arr[++$i] = parent::store_result())
                    
$results true;
                else
                    unset(
$arr[$i--]);
            } while (
parent::more_results() && parent::next_result());
        } else return 
$this->error;
        if (
$results)
            return 
$arr;
        else
            return -
1;
    }
    
    final function 
query($sql)
    {
        
$arr = &$this->result_non_free_multi_query;
        for(
$i=count($arr)-1;$i>0;--$i)
            
$arr[$i]->free();
        
$arr = array();
        return 
parent::query($sql);
    }

// class mysqli

?>

Geändert von bwoebi (14.03.2011 um 22:09 Uhr).
bwoebi ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.03.2011, 19:08  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Overhead ist denke ich zu vernachlässigen. Ich habe kein Argument gegen die Vorgehensweise, aber so richtig toll finde ich sie auch nicht.

Ist mir glaube ich zu wenig Gewinn dafür, eine abgeleitete Klasse zu erstellen. Du verschiebst gewissermaßen nur etwas die Art und Weise, wie mysqli funktioniert. Du musst nun zwar keine Results mehr manuell „befreien“, aber dafür kannst du keine Results mehr über den nächsten Aufruf einer query-Methode hinweg behalten.

Weiß nicht. Ich würde sagen: Lohnt alles nicht.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 14.03.2011, 19:10  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Du musst nun zwar keine Results mehr manuell „befreien“, aber dafür kannst du keine Results mehr über den nächsten Aufruf einer query-Methode hinweg behalten.
Das kann man doch so oder so nicht??? oder habe ich da das Manual falsch verstanden? Beim ->free() wird doch das ganze Objekt (also die Ressource dahinter) gelöscht? Täte man es ja nicht, käme ja ein "#2014: Commands out of sync; you can't run this command now "?
bwoebi ist offline   Mit Zitat antworten
Alt 14.03.2011, 21:23  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ups, du hast Recht. Das müsste passen. Ich habe außerdem nicht genau hingeguckt und gedacht, dass die query-Methode auch den klasseninternen Result-Speicher nutzen würde. Sorry, vergiss den Einwand.

Was die Performance angeht: Deine Klasse wird sicherlich über einen längeren Zeitraum (bis Scriptende bzw. bis zur nächsten Query) mehr Ressourcen benötigen (vermutlich auch auf dem MySQL-Server, denn irgendwas wird das free() ja tun ) als die rein sequentielle Abarbeitung mit store, free, store, free, store, free. Ich habe versucht, dazu Informationen zu finden, aber sowas ist irgendwie traditionell immer schwierig.

Ich bleibe bei meiner Einschätzung, dass es wahrscheinlich nicht wirklich ins Gewicht fallen dürfte. Allerdings ist diese Einschätzung leider nicht sonderlich fundiert.

Edit: Im Zweifel wäre es ja kein Thema, noch eine freeAll-Methode hinzuzufügen.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (14.03.2011 um 21:40 Uhr).
mermshaus ist offline   Mit Zitat antworten
Alt 14.03.2011, 22:08  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

d.h.: so in etwa:

PHP-Code:
<?php

class dbal extends mysqli {

    protected 
$result_non_free_multi_query;

    final function 
dbal($host,$user,$pass,$db) {
        return 
parent::mysqli($host,$user,$pass,$db);
    } 
//function dbal
    
    // multi_query's with the result false disabled
    
final function multi_query($sql)
    {
        
$arr = &$this->result_non_free_multi_query;
        
$this->free_results_multi_query();
        
$results false;
        if (
parent::multi_query($sql))
        {
            
$i=-1;
            do {
                if (
$arr[++$i] = parent::store_result())
                    
$results true;
                else
                    unset(
$arr[$i--]);
            } while (
parent::more_results() && parent::next_result());
        } else return 
false;
        if (
$results)
            return 
$arr;
        else
            return 
true;
    }

    public function 
free_results_multi_query ()
    {
        
$arr = &$this->result_non_free_multi_query;
        for(
$i=count($arr)-1;$i>0;--$i)
            
$arr[$i]->free();
        
$arr = array();
    }
    
    final function 
query($sql)
    {
        
$this->free_results_multi_query();
        return 
parent::query($sql);
    }

// class mysqli

?>
Gute Idee
Und es ist ja schon manchmal störend immer das ganze Multiquery-Konstrukt mit einzubinden… Vorallem ein paar UPDATE und DELETE lassen sich so einfach ohne das Multiquery-Konstrukt in einem Befehl zusammen senden… Wobei… Ich frage mich schon fast, ob es nicht aber schneller ist einzelne $mysqli->query()'s loszuschicken?

Geändert von bwoebi (14.03.2011 um 22:57 Uhr).
bwoebi ist offline   Mit Zitat antworten
Alt 15.03.2011, 04:50  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich habe keine Ahnung. Wahrscheinlich bringt es einen gewissen Geschwindigkeitsgewinn.

Wozu die Multi-Queries gut sein sollen, weiß ich aber ohnehin nicht so recht. Das liegt auch daran, dass ich MySQLi nicht nutze (wenn dann PDO) und andere Adapter das meines Wissens nicht unterstützen. Wahrscheinlich gibt es sinnvolle (mehr oder weniger exotische) Anwendungsfälle dafür.

Die Implementierung sieht grundsätzlich okay aus, die möglichen „Nachteile“ haben wir angesprochen. Ich würde es wie gesagt so nicht nutzen, weil mir der Gewinn zu gering wäre, aber ich würde auch Multi-Queries insgesamt nicht einsetzen.

Wozu hast du das denn gedacht? Vielleicht hilft es, das etwas „oberflächlicher“ zu besprechen.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 15.03.2011, 09:53  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

a) Leserlichkeit des Codes (wo die Performance aber nicht zu viel leiden darf…)
b) und warum multi_query überhaupt? Um den Datenbanktraffic (einzelne query()'s haben ja mehr Overhead als multi_query()'s) zu verringen und die PHP-Performance zu erhöhen…

Denn ich habe relativ viele query()'s im Code die ich jetzt durch multi_query()'s ersetzen will… query()'s sind ja im allgemeinen schon sehr langsam, da ist es besser zu optimieren wo man kann^^
bwoebi ist offline   Mit Zitat antworten
Alt 15.03.2011, 12:37  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Zitat:
b) und warum multi_query überhaupt? Um den Datenbanktraffic (einzelne query()'s haben ja mehr Overhead als multi_query()'s) zu verringen und die PHP-Performance zu erhöhen…
Wie bildest du das denn zum Beispiel in einem Model ab? Also, welche Queries würdest du zusammenfassen?
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 15.03.2011, 13:00  
Benutzer
 
Registriert seit: 07.07.2010
Beiträge: 87
PHP-Kenntnisse:
Fortgeschritten
bwoebi zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hauptsächlich mal DELETE/UPDATE/INSERT usw… SELECT vllt. auch aber… ich weiß nicht so recht bei SELECT denke SELECT mach ich auch…
bwoebi ist offline   Mit Zitat antworten
Alt 15.03.2011, 17:45  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von bwoebi Beitrag anzeigen
Hauptsächlich mal DELETE/UPDATE/INSERT usw… SELECT vllt. auch aber… ich weiß nicht so recht bei SELECT denke SELECT mach ich auch…
Hört sich prinzipiell fast unbedacht für mich an.

Wenn du Query-Collections ausführen willst, die du irgendwo irgendwann sammelst aber dessen Resultat du nicht direkt behandeln willst ( Fehler-Symbiose innerhalb der gesamten Anwendung also schleifen lassen und irgendwann an anderen Anwendungspunkten abarbeiten ? ) kannst du ja generell per multi-query gegen die datenbank werfen, aber einzeln sammeln.

PHP-Code:
class mysqli_ext extends mysqli {
   public function 
__construct($host$user$pass$db) {
      
parent::__construct($host,$user,$pass,$db);
   }

   protected 
$colStmt=Array();

   public function 
collectQuery($stmt) {
      
$col_hash hash('sha1'$stmt);
      if ( isset(
$this->colStmt[$col_hash]) ) {
         throw new 
Exception('Query [ '.$stmt.' ] allready exists in collection stack.');
      }
      else {
         
$this->colStmt[$col_hash] = $stmt;
      }
   }

   public function 
runCollection() {
      if ( 
count($this->colStmt) > ) return 0// return 0 - no query data
      
elseif ( count($this->colStmt) > ) {
         
$multi_query join(";"$this->colStmt);
         
$multi_result $this->multi_query($multi_query);
         do {
            if ( 
$curResult $this->store_result() ) {
               
$curResult->free();
            }
         } while ( 
$this->next_result() )
         return 
1// return 1 - indicate it's multiquery success state
      
}
      elseif ( 
count($this->colStmt) == ) return $this->query(join($this->colStmt));
   }

Ein Anwendungsfall der mir persönlich einfallen würde wo ich multi-queries nutzen wollen würde wäre das ausführen eines MySQL-Dumps, um step by step untersuchen zu können was mit den einzelnen queries so passiert.

Aber vielleicht hab ich auch den Sinn und Zweck den du verfolgst indem du multi-queries nutzen willst, nicht ganz verstanden. In dem Fall klär mich bitte auf.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
multi_query, mysqli performance, php multi_query optimize, sqlite query array mysqli, mysqli multi_query, php mysqli free result, mysqli multi query, mysqli_stmt::free result(), \mulit_query\ commands out of sync; you can\'t run this command now, mysqli methoden free, mysqli query klasse, mysqli user schon vorhanden, array mysqli, mysqli speicher verbessern, multi_query insert, php mysqli multi_query, php multi_query beschleunigen, mysqli mulit_query, unterschied mysqli mysqli_stmt, mysqli_stmt

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:30 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum