<?php /** * Funkcja ładująca automatycznie pliki klas potrzebne do działania skryptu * * @version 1.0.0 * @package Spot * @copyright Copyright: 2004 Lublin, Łęczna * @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail> * * $Id$ */ function __autoload( $strClassName ) { if( ! $arrConfig ) { $objAutoload = Autoload::GetInstance( 'lib' ); } { require_once( $arrConfig[ $strClassName ] ); } else { exit; } } ?>
<?php /** * Klasa tworząca mapę plików z klasami * * @version 1.0.0 * @package Spot * @copyright Copyright: 2004 Lublin, Łęczna * @author Michał 'Jojo' Małolepszy <adres@e.mail>, Michał Mech <adres@e.mail> * * $Id$ */ class Autoload { private $strDirName = ''; private $strClassesMapFile = 'ClassesMap.php'; public function __construct( $strDirName ) { $this->strDirName = $strDirName; { $this->GetClassesMap(); $this->CreateClassesMapFile(); } } private function GetClassesMap() { $objRecursiveDirectory = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $this->strDirName ), true ); foreach( $objRecursiveDirectory as $objFile ) { { continue; } $blnIsClass = false; foreach ($arrTokenAll as $intToken) { { list( $intTokenID, $strTokenValue ) = $intToken; switch($intTokenID) { case T_CLASS: $blnIsClass = true; break; case T_INTERFACE: $blnIsClass = true; break; case T_STRING: if ($blnIsClass) { $this->arrClassesMap[ $strTokenValue ] = $objFile->getPathname(); $blnIsClass = false; } break; case T_WHITESPACE: break; default: $blnIsClass = false; break; } } } } } private function CreateClassesMapFile() { $strHeader = '<?php' . \"nn\"; $strBody = ''; foreach( $this->arrClassesMap as $strKey => $strValue ) { $strBody .= $strKey . ' = ' . './' . $strValue; $strBody .= \"n\"; } $strFooter = \"n\" . '?>'; file_put_contents( $this->strDirName . '/' . $this->strClassesMapFile, $strHeader . $strBody . $strFooter ); } public function GetClassesFile() { return './' . $this->strDirName . '/' . $this->strClassesMapFile; } static public function GetInstance( $strDirName ) { static $objInstance; if( !isset( $objInstance ) ) { $objInstance = new Autoload( $strDirName ); } return( $objInstance ); } } ?>
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
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

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
