Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ładowanie plików - inna wersja ;-), klasa, PHP4 i PHP5
Speedy
post
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Speedy 4.05.2006, 10:28:26


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Ale po co tworzyc tyle obiektow, nie wystarczy zrobic to raz i potem tylko
$autoload->load(...);?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Speedy
post
Post #3





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Speedy 6.02.2006, 00:03:06


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Moze i nie spowolni, ale logicznie mi nie pasuje: dzialanie (ladowanie klas) powinno byc wykonywane przez funkcje/metody a nie klasy.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Spirit86
post
Post #5





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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??

Ten post edytował Spirit86 21.02.2006, 00:40:12


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post
Speedy
post
Post #6





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

Ostrzeżenie: (0%)
-----


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


--------------------
Sygnatura niezgodna z regulaminem.
Go to the top of the page
+Quote Post
Spirit86
post
Post #7





Grupa: Zarejestrowani
Postów: 607
Pomógł: 23
Dołączył: 8.09.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Audio: Metallica, Soil, RHCP, OffSpring, Green Day, "Retro", Gorillaz, Disturbed, Coma
DB: MySQL 4.1 | php: 4.4.3 Pomogłem Ci? Wciśnij przycisk POMÓGŁ.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 09:39