Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: xtc_db_queryCached.inc.php Performance

    DieterW

    • Mitglied
    • Beiträge: 140
    xtc_db_queryCached.inc.php Performance
    am: 06. November 2018, 16:03:06
    Habe null Zeit .... wenn sich jemand interessiert schaut auch mal in die aktuelle Version ob das Problem da auch noch ist.
    Es geht um eine 1.06 Datei inc/xtc_db_queryCached.inc.php
    So war die
    Code: PHP  [Auswählen]
    <?php
    /* -----------------------------------------------------------------------------------------
       $Id: xtc_db_queryCached.inc.php 782 2005-02-19 19:26:00Z khan_thep $

       XT-Commerce - community made shopping
       http://www.(( Wir dulden keine kommerziellen Werbelinks - Bitte <a href="index.php?topic=3013.0">Forenregeln</a> beachten! ))

       Copyright (c) 2003 XT-Commerce
       -----------------------------------------------------------------------------------------
       based on:
       (c) 2002-2003 osCommerce(database.php,v 1.19 2003/03/22); www.oscommerce.com


       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/




      function xtc_db_queryCached($query, $link = 'db_link') {
        global $$link;

        // get HASH ID for filename
        $id=md5($query);


        // cache File Name
        $file=SQL_CACHEDIR.$id.'.xtc';

        // file life time
        $expire = DB_CACHE_EXPIRE; // 24 hours

        if (STORE_DB_TRANSACTIONS == 'true') {
          error_log('QUERY ' . $query . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
        }

        if (file_exists($file) && filemtime($file) > (time() - $expire)) {

         // get cached resulst
            $result = unserialize(implode('',file($file)));

            } else {

             if (file_exists($file)) @unlink($file);

            // get result from DB and create new file
            $result = mysql_query($query, $$link) or xtc_db_error($query, mysql_errno(), mysql_error());

            if (STORE_DB_TRANSACTIONS == 'true') {
                    $result_error = mysql_error();
                    error_log('RESULT ' . $result . ' ' . $result_error . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
            }

            // fetch data into array
            $records = array();
            while ($record = xtc_db_fetch_array($result))
                    $records[]=$record;


            // safe result into file.
            $stream = serialize($records);
            $fp = fopen($file,"w");
            fwrite($fp, $stream);
            fclose($fp);
            $result = unserialize(implode('',file($file)));

       }

        return $result;
      }
    ?>
     
    Jetzt so:
    Code: PHP  [Auswählen]
    <?php
    /* -----------------------------------------------------------------------------------------
       $Id: xtc_db_queryCached.inc.php 782 2005-02-19 19:26:00Z khan_thep $

       XT-Commerce - community made shopping
       http://www.(( Wir dulden keine kommerziellen Werbelinks - Bitte <a href="index.php?topic=3013.0">Forenregeln</a> beachten! ))

       Copyright (c) 2003 XT-Commerce
       -----------------------------------------------------------------------------------------
       based on:
       (c) 2002-2003 osCommerce(database.php,v 1.19 2003/03/22); www.oscommerce.com


       Released under the GNU General Public License
       ---------------------------------------------------------------------------------------*/




      function xtc_db_queryCached($query, $link = 'db_link') {
        global $$link;

        // get HASH ID for filename
        $id=md5($query);


        // cache File Name
        $file=SQL_CACHEDIR.$id.'.xtc';

        // file life time
        $expire = DB_CACHE_EXPIRE; // 24 hours

        if (STORE_DB_TRANSACTIONS == 'true') {
          error_log('QUERY ' . $query . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
        }

        if (file_exists($file) && @filemtime($file) > (time() - $expire)) {

         // get cached resulst
            $records = unserialize(implode('',file($file)));

            } else {

             if (file_exists($file)) @unlink($file);

            // get result from DB and create new file
            $result = mysql_query($query, $$link) or xtc_db_error($query, mysql_errno(), mysql_error());

            if (STORE_DB_TRANSACTIONS == 'true') {
                    $result_error = mysql_error();
                    error_log('RESULT ' . $result . ' ' . $result_error . "\n", 3, STORE_PAGE_PARSE_TIME_LOG);
            }

            // fetch data into array
            $records = array();
            while ($record = xtc_db_fetch_array($result))
                    $records[]=$record;


            // safe result into file.
            $stream = serialize($records);
            $fp = fopen($file,"w");
            fwrite($fp, $stream);
            fclose($fp);
            //$result = unserialize(implode('',file($file)));
      }

        return $records;
      }
    ?>
     
    Die brachte bei einer Abfrage mit über 40000 Zeilen die Links mit wirren Zeichenkombinationen enthielten einen Speicherüberlauf.
    Bei näherer Betrachtung macht es eventuell zwar zur Fehlersuche Sinn, wenn man die Cache-Datei schreibt, die Datei wieder liest und dann ausgibt. Wenn das Schreiben fehlschlägt, bekommt man gleich ein Problem.

    Blöd ist hier nur ... es wird die Datei nochmal gelesen, was Zeit kostet .... und dann zusätzlich in eine NEUE Variable geschrieben. Und das bei JEDEM Cache miss ...

    Meine Version schreibt in die Datei, liest das aber nicht noch mal, sondern gibt es gleich in der Variable weiter die mit return ausgespuckt wird.

    Änderungen sind im einzelnen:

    Code: PHP  [Auswählen]
            $records = unserialize(implode('',file($file)));
    Code: PHP  [Auswählen]
    //$result = unserialize(implode('',file($file)));
    Code: PHP  [Auswählen]
        return $records;
     


    Linkback: https://www.modified-shop.org/forum/index.php?topic=39676.0
    Templateshop - Eine große Auswahl an neuen und modernen Templates für die modified eCommerce Shopsoftware

    DieterW

    • Mitglied
    • Beiträge: 140
    Re: xtc_db_queryCached.inc.php Performance
    Antwort #1 am: 07. November 2018, 09:40:27
    Habe etwas Zeit gefunden. Betrifft nur die Versionen 1.x. In der 2.x ist das caching wesentlich intelligenter aufgesetzt. Danke an das Team dafür!
    rechtstexte für onlineshop
    0 Antworten
    1041 Aufrufe
    28. Mai 2018, 15:41:33 von webald
    15 Antworten
    7259 Aufrufe
    08. August 2012, 09:00:29 von keineLustmehr
    2 Antworten
    927 Aufrufe
    09. September 2019, 09:24:13 von Jürgen
    3 Antworten
    3595 Aufrufe
    23. Oktober 2009, 20:49:54 von guensi