jestem w trakcie pisania klasy która będzie cachowała wyniki zapytania sql i utknąłem w jedym miejscu. Chodzi o to że w pierwszym kroku tworzymy plik z cache uchwytu i zapisywane jest to do tablicy zserializowanej po czym plik jest oczytywany poprzez unserialize, problem zaczyna się gdy odczytam plik zapisze do tablicy i chce wyświetlić w pętli while wywołanie rekordów z bazy wygląda tak
  1. <?php
  2. $oDb->sql_cache('wiadomosci');
  3.  
  4. $bHandleArt = $oDb->execute('SELECT tytul FROM mod_artykuly LIMIT 10');
  5.  
  6. while($aRows = $oDb->fetch_array($bHandleArt)){
  7. echo $aRows['tytul'].'<br />';
  8. }
  9.  
  10.  
  11. $oDb->sql_cache();
  12. ?>


więc muszę odczytać zcachowany plik w tej samej pętli co zapytanie z bazy. Nie mam pojęcia jak to wykonać, abym tak samo jak wywoluje dane z bazy czyli np $aRows['tytul'] potem mogl zawsze w ten sam sposob bez modyfikacji odczytac plik cache


  1. <?php
  2.  
  3. include ('config.php');
  4.  
  5. define('CACHE_DIR', './sql_cache/');
  6.  
  7.  
  8. class db {
  9.  
  10. private $bDbh;
  11. private $bHandleQuery;
  12. private $aCacheBufor = array();
  13. private $sCacheFile;
  14. private $iCacheState;
  15.  
  16. static public $oDb = false;
  17.  
  18.  
  19.  
  20. private function __construct(){
  21. $this->bDbh = mysql_pconnect( config::$sDbHost, config::$sDbUser, config::$sDbPass );
  22. if(!is_resource( $this->bDbh ) ){
  23. throw new Exception( 'blad polaczenia z baza' );
  24. }
  25. if( !mysql_select_db( config::$sDbBase, $this->bDbh ) ){
  26. throw new Exception( mysql_error() );
  27. }
  28. }
  29.  
  30. public static function getInstance(){
  31. if(self::$oDb == false ){
  32. self::$oDb = new db();
  33. }
  34. return self::$oDb;
  35. }
  36.  
  37. public function execute( $sQuery ){
  38. if($this->iCacheState == 1){
  39. return 0;
  40. } else {
  41. $this->bHandleQuery = mysql_query( $sQuery, $this->bDbh );
  42. if( !$this->bHandleQuery )
  43. throw new Exception( mysql_error() );
  44. else
  45. return $this->bHandleQuery;
  46. }
  47. }
  48.  
  49. private function is_cache_file( $sFile ){
  50. return file_exists( CACHE_DIR.'db_'.$sFile.'.buf' );
  51. }
  52.  
  53. public function sql_cache( $sHandle = 0 ){
  54. if( is_string( $sHandle ) ){
  55. $this->sHandle = $sHandle;
  56. if( !$this->is_cache_file( $this->sHandle ) ){
  57. $this->sCacheFile = CACHE_DIR.'db_'.$this->sHandle.'.buf';
  58. $this->iCacheState = 2;
  59. } else {
  60. $this->iCacheState = 1;
  61. }
  62. } else {
  63. if($this->iCacheState != 1){
  64. file_put_contents( $this->sCacheFile, serialize($this->aCacheBufor) );
  65. }
  66. }
  67. }
  68.  
  69. public function fetch_array( $bHandle ){
  70. if( $this->iCacheState == 1 ){
  71.  
  72. $this->aResult = unserialize( file_get_contents( CACHE_DIR.'db_'.$this->sHandle.'.buf' ) );
  73.  
  74. /*
  75. echo'<pre>';
  76. print_r($this->aResult);
  77. echo'</pre>';
  78. */
  79.  
  80. } elseif( $this->iCacheState == 2 ) {
  81. return $this->aCacheBufor[] = mysql_fetch_array( $bHandle );
  82. }
  83. }
  84.  
  85. }
  86.  
  87.  
  88. try {
  89. $oDb = db::getInstance();
  90.  
  91. $oDb->sql_cache('wiadomosci');
  92.  
  93. $bHandleArt = $oDb->execute('SELECT tytul FROM mod_artykuly LIMIT 10');
  94.  
  95. while($aRows = $oDb->fetch_array($bHandleArt)){
  96. echo $aRows['tytul'].'<br />';
  97. }
  98.  
  99.  
  100. $oDb->sql_cache();
  101.  
  102.  
  103. }
  104. catch(Exception $e){
  105. echo $e->getMessage();
  106. }
  107.  
  108. ?>