Hallo Arthur,
Wenn php sagt, dass eine Funktion nicht gefunden wurde, dann
fehlt in dem Script der include bzw. require_once.
Leider kann ich dir nicht Recht geben. Wenn ich mir in meinem Error Handling alle eingebundenen Dateien ausgeben lasse, sind die benötigten definitiv dabei…
Logisch, wenn alles in einer Datei ist, sind der Anwendung ja
alle Funktionen bekannt.
Komischerweise habe ich die Dateien in der zusammengefasst, die die Funktion enthielt, die nicht gefunden wurde. Generell werden meine Dateien includiert, indem ich den Ordner auslese und alle darin befindlichen Dateien includiere. Aber wie oben schon erwähnt, es sind alle Dateien da.
Les dir mal das durch:
http://www.php.net/manual/de/function.spl-autoload-r…
Danke.
Eine andere Möglichkeit ist, sich eine Datei z.B common.php zu
schreiben welche, überall wo benötigt, diese inkludiert wird.
Diese Datei läd z.B. eine Datei includeAllClasses.php, die
alle Klassen inkludiert und für Scripte (wo nur Methoden
stehen) eine Datei includeAllScripts.php. Dann dürfte eurer
Fehler nicht mehr auftreten.
Also damit du weißt worum es geht:
Das Projekt ist unabhängig von seiner Oberfläche und dem Datenmodell. Es kann also wie ein Framework für Applikationen jeder Art hergenommen werden. Somit können wir Applikationen frei nach Kundenwunsch erstellen, und haben die meiste Logik bereits verbaut.
Ich habe für das Projekt eine Datei die heißt flib.php (So haben wir es genannt). Diese wird im Webprojekt, das die Logik benötigt, eingebunden. Hier wird meine config.php eingebunden die DB Zugriff etc enthält. Dann kommt eine Funktion die über ein Bestimmtes Verzeichnis drüber läuft. Darunter gibt es die Verzeichnisse plugins, functionality, classes, infoareas, base. in Plugins kommen plugins, in functionality steckt die Funktionalität des, nennen wir es Frameworks. in Classes werden je nach DB die Klassen über eine Oberfläche generiert die für den Datenbankzugriff und die Datenkonsistens benötigt werden, sie vertreten sozusagen eine Tabelle in der DB. In den Infoareas werden Logische Klassen geschrieben, die als Basis die Klassen in classes ableiten und dem Objekt „Leben einhauchen“., in base stecken Basisklassen wie z. B. die Klasse von der die DB-Klassen abgeleitet werden.
Desweiteren gibt es auf der Ebene von flib.php auch eine backbone.php die ebenfalls die flib einbindet und AJAX requests abarbeitet.
Nun hatte ich in der functionality verschiedene php Dateien die nach logik gegliedert waren. Eine davon hieß functions.php, in der logisch unabhängige Funktionen geschrieben werden.
In den Ordner plugins kommen, wie der Name schon sagt, plugins.
eineinhalb Jahre lang lief diese Applikation ohne Probleme.
Ohne etwas am bestehenden code zu ändern (da dieser eigentlich fertig is und nur noch über Plugins geändert werden sollte), schrieb ich ein neues Plugin und schob das in den Ordner plugins. Alle Dateien werden eingebunden, doch auf ein Mal gab es eine Funktion nicht mehr, die aber in der Datei functions.php steckt. Die Datei war aber immer noch eingebunden.
Jetzt habe ich alle Dateien im Verzeichnis functionality in die Datei functions.php zusammen gefasst, und es funktioniert wieder…
Was das Verhalten noch komischer macht, ist dass die Funktionen, wenn ich die selbe Logik einfach immer und immer wieder laufen lasse, mal gefunden wird, mal nicht. Dann ist es wieder eine andere Funktion die erst später aufgerufen wird, und dann läuft es wieder durch. Und es liegt nicht an der einen Datei. Nur in der functions.php ist es mir aufgefallen, weil ich dort sehr viel benutze.
Folgender Versuch:
ich habe ein kleines javascript geschrieben, dass jede Sekunde 10 mal den selben Aufruf auf meine Backbone gefeuert hat und habe es eine Stunde laufen lassen. Bei Erfolg und bei Abbruch habe ich in die Datenbank schreiben lassen. etwa zwei Drittel der Aufrufe waren fehlerhaft, der Rest hat geklappt.
Der selbe Code! der selbe Server! Immer waren alle Dateien vorhanden.
Um dem Ganzen noch das kleine Krönchen aufzusetzen und uns Entwicklern schlaflose Nächte zu bereiten, habe ich noch folgenden Versuch gemacht.
Ich habe eine rekursive Funktion in PHP geschrieben, die immer wieder alle registrierten Funktionen aufruft. Nach einigen 10tausend Aufrufen (Aber immer wieder verschieden) kommt der Fehler. Mit jeder Datei, die ich weniger includiere, kann ich die Funktion länger laufen lassen. und ab unter 35 includierten Dateien läuft sie bis zum Sanktnimmerleinstag (natürlich nur bis zur max_execution_time in der php.ini).
wir haben bei unseren Server-Dienstleister-Anbieter-Wieauchimmer bereits angefragt uns einen anderen mit einer abweichenden PHP Version bereit zu stellen. Dort werden wir mal eine Applikation aufsetzen und flib einbinden. Mal sehen wie sich das verhält. Komischerweise müssten dann alle die z. B. Wordpress benutzen (bei einem Projekt von mir mit 182 includierten files) und die selbe PHP Version haben (5.3.28) das Selbe Problem kennen.
Ich werde berichten!
danke schonmal!