Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ładowanie plików - inna wersja ;-)
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
Speedy
Witam

Ociu już coś podobnego zrobił tu: http://forum.php.pl/index.php?showtopic=41389

Ja też jakiś czas temu napisałem sobie pewną prostą klasę, która jeszcze robi przy okazji małe cache winksmiley.jpg.

  1. <?php
  2.  
  3. /**
  4.  * ładowanie klas
  5.  * @author Speedy <sppeedy@poczta.fm>
  6.  * @version 1.0
  7.  */
  8. class autoload {
  9.  
  10. var $classdir;
  11. var $cache_file;
  12.  
  13. /**
  14.  * konstruktor
  15.  * @param string $classdir
  16.  * @param string $cache_file
  17.  * @return void
  18.  */ 
  19. function autoload($classdir,$cache_file)
  20. {
  21. $this->classdir  = $classdir.'/';
  22. $this->cache_file = $cache_file;
  23. $this->load_classes();
  24. } 
  25.  
  26. /**
  27.  * pobiera klasy ze zdefiniowanego katalogu
  28.  * struktura pliku z klasą jest następująca:
  29.  * nazwa_klasy.class.php
  30.  * @param void
  31.  * @return array $classes
  32.  */
  33. function get_classes()
  34. {
  35.  
  36. $classes = array();
  37.  
  38. if (is_dir($this->classdir)) 
  39. {
  40.  if ($dh = opendir($this->classdir)) 
  41.  {
  42.  while (($file = readdir($dh)) <> false) 
  43.  {
  44.  $parts  = explode('.',$file);
  45.  $path_parts = pathinfo($file);
  46.  if($parts[1] == 'class' && $path_parts['extension'] == 'php')
  47.  {
  48.  $classes[$parts[0]] = $this->classdir.$file;
  49.  }
  50.  }
  51.  closedir($dh);
  52.  }
  53. }
  54. return $classes;
  55. }
  56.  
  57. /**
  58.  * tworzy cache z tablicą ze wszystkimi klasami
  59.  * @param void
  60.  * @return void
  61.  */
  62. function create_class_cache()
  63. {
  64.  
  65. $classes = serialize($this->get_classes());
  66. $file = fopen($this->cache_file, "w");
  67. flock($file, 2);  
  68. fwrite($file, $classes);
  69. flock($file, 3);
  70. fclose($file);
  71.  
  72. }
  73.  
  74. /**
  75.  * przygotowuje klasy do załadowania
  76.  * @param void
  77.  * @return array $classes
  78.  */
  79. function preload_classes()
  80. {
  81.  
  82. if(!file_exists($this->cache_file))
  83. {
  84. $this->create_class_cache();
  85. }
  86.  
  87. $file  = fopen($this->cache_file,"r");
  88. $classes = unserialize(fread($file, filesize($this->cache_file)));
  89. fclose($file);
  90. return $classes;
  91. }
  92.  
  93. /**
  94.  * ładuje klasy
  95.  * @param void
  96.  * @return void
  97.  */
  98. function load_classes()
  99. {
  100.  
  101. $classes = $this->preload_classes();
  102.  
  103. foreach($classes as $class)
  104. {
  105. if(file_exists($class))
  106. {
  107. require_once $class;
  108. }
  109. }
  110.  
  111. }
  112.  
  113. }
  114.  
  115. ?>


Użycie:

Pierwszym parametrem jest katalog z klasami (pliki: *.class.php), natomiast drugim ścieżka do docelowego pliku, w którym będzie przechowywane cache.

  1. <?php
  2.  
  3. new autoload('classes/primary','cache/classes/primaryclasses.cache.php');
  4.  
  5. ?>


Pozdrawiam.
dr_bonzo
Ale po co tworzyc tyle obiektow, nie wystarczy zrobic to raz i potem tylko
$autoload->load(...);?
Speedy
Hm... chyba wystarczy, ale tak mi chyba było wygodniej biggrin.gif. Chociaż nie wiem, czy uruchomienie tych kilku metod więcej aż tak bardzo spowolni skrypt smile.gif.
dr_bonzo
Moze i nie spowolni, ale logicznie mi nie pasuje: dzialanie (ladowanie klas) powinno byc wykonywane przez funkcje/metody a nie klasy.
Spirit86
Ja to zrobiłem tak:
  1. <?php
  2.  
  3. $handle  = opendir($dir);
  4. while($res = readdir($handle))
  5. {
  6.       if(eregi('.php', $res) include($dir.'/'.$res);
  7. }
  8.  
  9. ?>


też działa, po co pisać do najprostszych operacji tysiący linijek kodu?!

swoją drogą nierozumiem, po co cache do inlcudowanych plików??
Speedy
Spirit86: Ten kod, który napisałeś ładuje pliku *.php, a mój 'klasa.class.php'.
Jeśli chodzi o cachowanie, to w przypadku, gdy jest trochę klas do załadowania, to po co tracić czas na każdorazowe generowanie tablicy z plikami lub na otwieranie katalogu, skoro można raz stworzyć cache i ładować pliki na podstawie niego? smile.gif
Spirit86
Cytat(Speedy @ 2006-02-21 17:06:26)
Spirit86: Ten kod, który napisałeś ładuje pliku *.php, a mój 'klasa.class.php'.
Jeśli chodzi o cachowanie, to w przypadku, gdy jest trochę klas do załadowania, to po co tracić czas na każdorazowe generowanie tablicy z plikami lub na otwieranie katalogu, skoro można raz stworzyć cache i ładować pliki na podstawie niego? smile.gif

  1. <?php
  2. $handle = opendir($dir);
  3. while($res = readdir($handle))
  4. {
  5. if(eregi('.class.php', $res) include($dir.'/'.$res);
  6. }
  7. ?>


już masz taki sam efekt.
nie wydaje mi się, żeby operacje na katalogu były szybsze od otwierania pliku, "rozpłaszczania" tablicy i includowania pliku, aż sprawdzę z ciekawości smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.