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
<?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:
<?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:
//$result = unserialize(implode('',file($file)));
return $records;
Linkback: https://www.modified-shop.org/forum/index.php?topic=39676.0