Mam sobie dwa pliki ( napisałem na podstawie niedawnej dyskuj na forum na temat dołanczania plików ):
  1. <?php
  2.  
  3. /**
  4.  * Funkcja ładująca automatycznie pliki klas potrzebne do działania skryptu
  5.  *
  6.  * @version 1.0.0
  7.  * @package Spot
  8.  * @copyright Copyright: 2004 Lublin, Łęczna
  9.  * @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail>
  10.  *
  11.  * $Id$
  12.  */
  13.  
  14. function __autoload( $strClassName )
  15. {
  16. static $arrConfig;
  17. if( ! $arrConfig )
  18. {
  19. $objAutoload = Autoload::GetInstance( 'lib' );
  20. $arrConfig = parse_ini_file( $objAutoload->GetClassesFile() );
  21.  
  22. }
  23.  
  24. if( array_key_exists( $strClassName, $arrConfig ) )
  25. {
  26. require_once( $arrConfig[ $strClassName ] );
  27. }
  28. else
  29. {
  30. echo '<br /><b>Fatal error</b>: Class '<b>' . $strClassName . '</b>' not found.<br />';
  31. }
  32. }
  33.  
  34. ?>

  1. <?php
  2.  
  3. /**
  4.  * Klasa tworząca mapę plików z klasami
  5.  *
  6.  * @version 1.0.0
  7.  * @package Spot
  8.  * @copyright Copyright: 2004 Lublin, Łęczna
  9.  * @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail>
  10.  *
  11.  * $Id$
  12.  */
  13.  
  14. class Autoload
  15. {
  16. private $arrClassesMap  = array();
  17. private $strDirName = '';
  18.  
  19. private $strClassesMapFile = 'ClassesMap.php';
  20.  
  21. public function __construct( $strDirName )
  22. {
  23. $this->strDirName = $strDirName;
  24. if( ! file_exists( $this->strDirName . '/' . $this->strClassesMapFile ) )
  25. {
  26. $this->GetClassesMap();
  27. $this->CreateClassesMapFile();
  28. }
  29. }
  30.  
  31. private function GetClassesMap()
  32. {
  33. $objRecursiveDirectory = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $this->strDirName ), true );
  34. foreach( $objRecursiveDirectory as $objFile )
  35. {
  36. if( ! is_file( $objFile->getPathname() ) )
  37. {
  38. continue;
  39. }
  40.  
  41. $arrTokenAll = token_get_all( file_get_contents( $objFile->getPathname() ) );
  42.  $blnIsClass = false;
  43.  foreach ($arrTokenAll as $intToken)
  44.  {
  45.  if ( ! is_string( $intToken ) )
  46.  {
  47.  list( $intTokenID, $strTokenValue ) = $intToken;
  48.  switch($intTokenID)
  49.  {
  50.  case T_CLASS:
  51.  $blnIsClass = true;
  52.  break;
  53.  case T_INTERFACE:
  54.  $blnIsClass = true;
  55.  break;
  56.  case T_STRING: 
  57.  if ($blnIsClass)
  58.  {
  59.  $this->arrClassesMap[ $strTokenValue ] = $objFile->getPathname();
  60.  $blnIsClass = false;
  61.  }
  62.  break;
  63. case T_WHITESPACE:
  64.  break;
  65. default:
  66.  $blnIsClass = false;
  67.  break;
  68.  }
  69. }
  70.  }
  71. }
  72. }
  73.  
  74. private function CreateClassesMapFile()
  75. {
  76. $strHeader = '<?php' . &#092;"nn\";
  77.  
  78. $strBody = '';
  79.  
  80. foreach( $this->arrClassesMap as $strKey => $strValue )
  81. {
  82. $strBody .= $strKey . ' = ' . './' . $strValue;
  83. $strBody .= &#092;"n\";
  84. }
  85.  
  86. $strFooter = &#092;"n\" . '?>';
  87.  
  88. file_put_contents( $this->strDirName . '/' . $this->strClassesMapFile, $strHeader . $strBody . $strFooter );
  89. }
  90.  
  91. public function GetClassesFile()
  92. {
  93. return './' . $this->strDirName . '/' . $this->strClassesMapFile;
  94. }
  95.  
  96. static public function GetInstance( $strDirName )
  97. {
  98. static $objInstance;
  99. if( !isset( $objInstance ) )
  100. {
  101. $objInstance = new Autoload( $strDirName );
  102. }
  103. return( $objInstance );
  104. }
  105. }
  106. ?>

Po krótce to działa tak:
1. Klasa Autoload tworzy plik z mapą klas.
2. Funkcja __autoload() działa na podstawe pliku utworzonego przez klasę Autoload.

A teraz w czym problem.
Jeżeli plik jest to działa wyśmienicie, jeżeli go nie ma to działanie klasy wiesza Apache'a. Oto logi:
Cytat
May 11 19:07:50 ( ... ) kernel: pid 10817 (httpd), uid 80: exited on signal 11
May 11 19:07:53 ( ... ) kernel: pid 10818 (httpd), uid 80: exited on signal 11
May 11 19:07:55 ( ... ) kernel: pid 10819 (httpd), uid 80: exited on signal 11
May 11 19:07:57 ( ... ) kernel: pid 10820 (httpd), uid 80: exited on signal 11
May 11 19:08:00 ( ... ) kernel: pid 10821 (httpd), uid 80: exited on signal 11

Uwaga exclamation.gif!
Problem nie występuje na Windzie. Ale za to wystepuje na FreeBSD 5.4 z Apache 2.0.54 i php 5.0.4.

Po wnikliwej analizie błądów doszedłem do tego że odpowiedzialna jest za to linia 33 w klasie Autoload ( czyli wiersz z iteratorami ).

Jakieś pomysły questionmark.gif