Kennt ihr das Problem? (zu viele Dateien included?)

Hi Leute,

ich schreibe im Moment mit ein paar Kumpels an einem ziemlich großen Projekt. Mittlerweile sind es einige 1000 Zeilen PHP code und ziemlich viele jscripts.

Letztens stoßen wir beim Programmieren auf ein Mal ein Problem:

Es werden zwar alle Dateien eingebunden, aber trotzdem werden einige Funktionen mal gefunden, mal nicht. Das trat aber erst nach einiger Zeit auf, wobei wir es erst auf die eingebundene Größe des Scripts schoben (wir arbeiten mir require_once():wink: und uns dannd ie maximale Größe des Scripts in der php.ini anschauten. Das konnte aber nicht sein, da die Fehlermeldung nur besagte, dass eine Funktion nicht gefunden wurde. Aber wie gesagt trat dieser Fehler nicht immer auf. Bei einer Abfrage schon, dann nicht mehr, und so weiter.

Nun kam ich auf die Idee doch mal zu versuchen die Dateien, die nach logischer Funktion gegliedert sind, in eine zusammen zu fassen. Natürlich habe ich hierfür nicht alle hergenommen, aber 10 habe ich zusammen gefasst. Der Fehler kommt nicht mehr.

Habt ihr eine Idee woran das liegen könnte? Ich würde die Dateien gerne wieder gliedern. 

lg

Artur

Hallo Arthur,

Es werden zwar alle Dateien eingebunden, aber trotzdem werden
einige Funktionen mal gefunden, mal nicht. Das trat aber erst
nach einiger Zeit auf, wobei wir es erst auf die eingebundene
Größe des Scripts schoben (wir arbeiten mir require_once():wink:
und uns dannd ie maximale Größe des Scripts in der php.ini
anschauten. Das konnte aber nicht sein, da die Fehlermeldung
nur besagte, dass eine Funktion nicht gefunden wurde. Aber wie
gesagt trat dieser Fehler nicht immer auf. Bei einer Abfrage
schon, dann nicht mehr, und so weiter.

Wenn php sagt, dass eine Funktion nicht gefunden wurde, dann fehlt in dem Script der include bzw. require_once.

Nun kam ich auf die Idee doch mal zu versuchen die Dateien,
die nach logischer Funktion gegliedert sind, in eine zusammen
zu fassen. Natürlich habe ich hierfür nicht alle hergenommen,
aber 10 habe ich zusammen gefasst. Der Fehler kommt nicht
mehr.

Logisch, wenn alles in einer Datei ist, sind der Anwendung ja alle Funktionen bekannt.

Habt ihr eine Idee woran das liegen könnte? Ich würde die
Dateien gerne wieder gliedern. 

Les dir mal das durch: http://www.php.net/manual/de/function.spl-autoload-r…

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.

Gruß XXD

mir wäre nicht bekannt das es in php eine beschränkung der scriptgröße / includes gibt.

kann es sein das ihr auf unterschiedlichen hostsystemen arbeitet?
windows + linux zum beispiel?

dann könnte es an der Groß und Kleinschreibung der Dateien / Pfade liegen.
unter Windows ist das egal, unter linux ist test.php != Test.php

gab es eine Fehlermeldung? lasst das Script mal mit aktiven Error Reporting laufen.

error_reporting(-1)

Gruß
Phillip

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!

Hallo Artur,

wenn es ab und zu auftritt, kann es nicht an evtl. gleichen Funktionsnamen und fehlenden Namensraum liegen (theoretisch). Also…

…wie sieht den euere Testumgebung bzw. Developmentumgebung aus (OS,Server+Version, PHP-Version)?

Und wie die Produktivumgebung (PHP-Version hattest du ja geschrieben, fehlt noch OS und Server + Version), z.B unterscheidet sich manches in Apache -> nginx.

Schon mal während des Tests die Serverlog Datei begutachtet: tail -f /var/log/server.log ?

Schwer aus der ferne zu helfen, da hilft nur Schritt für Schritt, also evtl. auch eine kleine Testumgebung schreiben, wenn nicht schon geschehen (phpunit).

Gruß XXD

Hei schon wieder :smile:

Da ich das alles nur nebenbei mache, bin ich noch nicht dazu gekommen daran weiter zu arbeiten.
sobald ich kann, werde ich mal eine Testumgebung bei mir mit xampp und auf windows mit wamp aufbauen. Mal schauen was lokal passiert.

Im moment läuft unsere Test und Prod umgebung noch auf dem selben Server.
Serverlog werde ich heute mal aktivieren und rein schauen.

Leider habe ich, da ich gerade unterwegs bin, keinen Zugriff auf meine KeyPass Datei wodurch ich nicht auf die Server zugreifen kann.

Ich werde mich melden sobald ich irgendetwas herausgefunden habe. Diese Problematik gehört offensichtlich der Welt mitgeteilt. Ich finde nichts im Internet darüber :frowning:

lg

Artur

Hi,

Hei schon wieder :smile:

Da ich das alles nur nebenbei mache, bin ich noch nicht dazu
gekommen daran weiter zu arbeiten.
sobald ich kann, werde ich mal eine Testumgebung bei mir mit
xampp und auf windows mit wamp aufbauen. Mal schauen was lokal
passiert.

Keine gute Idee! Wie Philip schon geschrieben hatte, unterscheidet Windows nicht, zwischen Groß -und Kleinschreibung, besser setzte dir ein einfaches Linux (Ubuntu, Mint) auf und entwickel dort, jedoch unter Linux kein Xampp installieren (kann zu unvorgesehenen Verhalten führen), meist ist schon ein Apache mit dabei und mysql ist Ruckzuck nachinstalliert.

Im moment läuft unsere Test und Prod umgebung noch auf dem
selben Server.

Lokaler Server? Denn wenn öffenttlich (ob gesperrt oder nicht) sollte man vermeiden, allein des Zeitaufwands wegen -> Dateien hin und her zu schieben.

Also Webanwendungen ( besonders php) unter Windows zu entwickeln sind Horror, nimm hierfür Linux, ob jetzt als Dualboot, Wubi (gibt es das noch?) oder in einer Virtuellen-Umgebung, sei dir überlassen. Per „tail -f /var/log/*.log“ den Stern ersetzt du durch die relevanten Logdateien, kannst in Echtzeit beobachten was passiert und du hast lokal wesentlich mehr Spielraum zum Testen und Entwickeln, als auf einem Hoster.

Gruß XXD

Hi,

bei solchen unklaren Fehlern, würde ich eher auf execution time oder memory limits tippen.

Schon in der php.ini das Ganze erhöht - sofern es der Provider zulässt?

Gruss
Joey

max_execution_time liegt bei 30 sekunden und der memorylimit bei 94 mb…

mein skript kommt da nicht mal ansatzweise ran.

Hi,
Keine gute Idee! Wie Philip schon geschrieben hatte,
unterscheidet Windows nicht, zwischen Groß -und
Kleinschreibung, besser setzte dir ein einfaches Linux
(Ubuntu, Mint) auf und entwickel dort, jedoch unter Linux kein
Xampp installieren (kann zu unvorgesehenen Verhalten führen),
meist ist schon ein Apache mit dabei und mysql ist Ruckzuck
nachinstalliert.

Das Ding wurde zuerst auf einer Windows Maschine entwickelt und läuft jetzt auf einem Server auf dem Windows Server installiert ist. Somit sollte das alles laufen. Generell arbeite ich sowieso entweder mit meinem Mac oder mit einem Linux. Trotzdem würde ich gerne den Unterschied testen und werde deswegen das Ganze zusätzlich auf einem virtuellen Windows durchführen.

Lokaler Server? Denn wenn öffenttlich (ob gesperrt oder nicht)
sollte man vermeiden, allein des Zeitaufwands wegen -> Dateien
hin und her zu schieben.

Nein, Server von Hetzner. Also einen Root-Server.

Also Webanwendungen ( besonders php) unter Windows zu
entwickeln sind Horror, nimm hierfür Linux, ob jetzt als
Dualboot, Wubi (gibt es das noch?) oder in einer
Virtuellen-Umgebung, sei dir überlassen. Per „tail -f
/var/log/*.log“ den Stern ersetzt du durch die relevanten
Logdateien, kannst in Echtzeit beobachten was passiert und du
hast lokal wesentlich mehr Spielraum zum Testen und
Entwickeln, als auf einem Hoster.

Danke für den Hinweis, aber unser Server ist wie oben schon beschrieben ein Root Server auf den wir über mstsc vollen Zugriff haben. Auf dem Gerät läuft ein Windows Server. Also auch das Testen und entwickeln auf dem Server ist für uns kein Problem. Bevorzugt mit Aptana direkt über ftp.

Ich bin selber kein Fan von Webentwicklung auf Windows. Also eigentlich bin ich selber kein Fan von allem auf Windows :smiley: :smiley:

Gruß XXD

Ebenfalls Gruß!

Artur

max_execution_time liegt bei 30 sekunden und der memorylimit
bei 94 mb…

mein skript kommt da nicht mal ansatzweise ran.

Wenn das unter Windows und IIS läuft, hat das aber auch noch Einfluss.
Was sagt das Eventlog bzw. die IIS Log-Files?

Du hast sicher in der php.ini den „error_log“ einschaltet. Da laufen ja normalerweise massenhaft Meldungen auf. Nichts dabei?

btw: 94mb ist nicht sonderlich viel …

Interessant:

Füge ich eine Funktion, die hin und wieder nicht gefunden wird an den Anfang der Datei wird diese gefunden und eine andere nicht…

übrigens auch bei mir lokal.

lg

Artur

Nun bin ich komplett verwirrt.

Das Problem lies sich nicht lösen und der Server_Log gab auch nichts her…

Der einzige Unterschied den ich nun zwischen einer funktionierenden und der nicht funktionierenden Umgebung gefunden habe, war dass auf der nicht funktionierenden die beiden Dinge
APC
eAccelerator
aktiviert waren. APC wird für ein anderes Projekt benötigt. eAccelerator haben wir deaktiviert.

jetzt scheint es zu funktionieren…

Was, wenn man noch mal drüber nachdenkt, ziemlich logisch erscheint :smiley: