Fehlermeldungen

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
fliegermichl
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Fehlermeldungen

Beitrag von fliegermichl » 02.04.2008, 13:31:36

Hallo Christian,

ich schreibe das in Off Topic, da es keine Kategorie für Verbesserungsvorschläge gibt :-)

Beim durcharbeiten des ersten Tutorials hatte ich versehentlich die Dateien
./frontend/content/c_de_Startseite.html und
./frontend/content/c_de_Impressum.html genannt anstatt richtig
./frontend/content/c_de_startseite.html und
./frontend/content/c_de_impressum.html

Dann erscheint beim Aufruf der Seite nur
Fatal error: [xmlParser::getAttributesFromString()] Error while parsing: " href='function.file-get-contents'". Maximum number of loops exceeded! in /www/apf/apps/core/pagecontroller/pagecontroller.php5 on line 203

Warning: fopen(./logs/2008_04_02__php.log) [function.fopen]: failed to open stream: No such file or directory in /www/apf/apps/core/logging/Logger.php on line 245

Warning: fwrite(): supplied argument is not a valid stream resource in /www/apf/apps/core/logging/Logger.php on line 248

Warning: fclose(): supplied argument is not a valid stream resource in /www/apf/apps/core/logging/Logger.php on line 253

Da ich in diesem Beispiel genau wusste, an welcher Stelle ich suchen muss, ist es bei einer groesseren Anwendung schwierig bis unmöglich einen solchen Fehler zu lokalisieren.

Viele Grüße
Michl

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fehlermeldungen

Beitrag von dr.e. » 02.04.2008, 15:22:39

Hallo Michl,

danke für den Input. Ich habe den Thread in die FAQs verschoben, da sollte er gut aufgehoben sein.

Erstes Problem, das ich hier sehe ist, dass in den Tutorials nicht aufgeführt wurde, dass

Code: Alles auswählen

html_errors = On
in der php.ini zu Parser-Fehlern führt. Zum zweiten wurde im Tutorial nicht vermerkt, dass die Dateinamen nur Kleinbuchstaben enthalten dürfen. Beides habe ich im Tutorial unter http://www.adventure-php-framework.org/ ... eerstellen nun nachgeholt. Weiterhin habe ich einen Kommentar auf diesen Thread hinterlegt, so dass sich die Benutzer die Thematik nochmal ansehen können.

Was mich etwas stutzig macht ist, dass der Logger ein
failed to open stream
meldet. Hatte der Benutzer, unter dem Apache/PHP läuft keine Schreibrechte für das Verzeichnis ./logs/? Falls doch, kannst du mir Hinweise geben, wie ich dies nachstellen kann um es als Bug verifizieren zu können?
Viele Grüße,
Christian

Benutzeravatar
fliegermichl
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Re: Fehlermeldungen

Beitrag von fliegermichl » 02.04.2008, 15:59:30

Hallo Christian,

sorry, daß mit dem html_errors=on hattest Du mir ja bereits geschrieben und ich hab's erfolgreich ignoriert :oops:.

Das mit dem ./logs/ ist so eine Sache. Das ist ein relativer Pfad und ich habe sowohl einen Ordner logs unter dem apps Ordner sowie einen unter htdocs, in die der Apache user schreiben könnte. Ich weiss allerdings nicht, wo er es versucht.
Es ist sowieso an manchen Stellen schwierig die Ursache eines Fehlers zu lokalisieren.

ich habe z.B. jetzt html_errors=off eingestellt und bekomme jetzt die Fehlermeldungen des Frameworks.
aber anstatt zu melden, dass er mein template "/frontend/content/c_de_startseite.html" nicht findet, sagt er, er kann c_de_404.html nicht finden. Lege ich diese dann an, kann er diese zwar finden, ich weiss aber immer noch nicht, was er denn nun nicht finden konnte.

Für den Anfänger ist die Fülle an verschiedenen Ordnern und Dateien, deren Namen sich das Framework z.T. automatisch zusammensetzt etwas verwirrend. Für den Fortgeschrittenen, welcher genau weiss, wo er suchen muss, ist es natürlich eine Erleichterung, da er ne Menge Tipparbeit spart.

Viele Grüße
Michl

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fehlermeldungen

Beitrag von dr.e. » 02.04.2008, 17:25:47

Hallo Michl,
sorry, daß mit dem html_errors=on hattest Du mir ja bereits geschrieben und ich hab's erfolgreich ignoriert :oops:.
Kein Problem, nun passt das ja. ;-)
Das mit dem ./logs/ ist so eine Sache. Das ist ein relativer Pfad und ich habe sowohl einen Ordner logs unter dem apps Ordner sowie einen unter htdocs, in die der Apache user schreiben könnte. Ich weiss allerdings nicht, wo er es versucht.
Das ist recht einfach: da es nur eine index.php gibt, über die alles abgewickelt wird, musst du alle relativen Pfade relativ zu dieser Datei bemessen. In deinem Fall ist also der Ordner parallel zur index.php wichtig. Möchtest du einen anderen Logging-Ordner haben, dann musst du in der globalen Projekt-Konfiguration die Konstante APPS__LOG_PATH mit dem von dir gewünschten relativen (zur index.php) oder absoluten Ordner füllen. Siehe hierzu auch http://www.adventure-php-framework.org/ ... enz_Logger.
ich habe z.B. jetzt html_errors=off eingestellt und bekomme jetzt die Fehlermeldungen des Frameworks.
aber anstatt zu melden, dass er mein template "/frontend/content/c_de_startseite.html" nicht findet, sagt er, er kann c_de_404.html nicht finden. Lege ich diese dann an, kann er diese zwar finden, ich weiss aber immer noch nicht, was er denn nun nicht finden konnte.
OK, ich gebe zu, dass das nicht ganz transparent ist. Auch in der Beschreibung der Standard-Taglibs ist das Verhalten nicht genau genug beschrieben. Wenn du dir mal den Quelltext der TagLib unter apps/tools/html/taglib/doc_taglib_createobject.php ansiehst, wird dir das Verhalten sicher klarer. Hier wird in der onParseTime()-Methode versucht, eine Content-Datei zu laden um den Knoten des aktuellen Objektbaums mit dem Inhalt der Datei zu befüllen und entsprechend zu erweitern, falls weitere Tags enthalten sind. Findet der Tag die Datei nicht, wird versucht, eine "Fehlerdatei" anzuzeigen statt einem Fehler auszugeben. Ist die 404er-Datei nicht vorhanden, kommt es zum PHP-Fehler. Das ist so beabsichtigt gewesen, da der PHP-Fehler nur während der Entwicklung auftreten sollte. Möchtest du, dass das nicht so ist, kannst du dir deine eigene Taglib erstellen. Letzteres hört sich schwer an, als es letztlich ist. In deinem Fall musst du einfach den Code der aktuellen Taglib in eine neue Datei kopieren, oder von dieser ableiten - sofern Teile wiederverwendbar sind - und den Code anpassen. Wichtig ist dabei, dass folgender Rumpf erhalten bleibt, so dass Tags in den Inhalts-Dateien geparst werden:

Code: Alles auswählen

   class my_taglib_createobject extends Document
   {

      function my_taglib_createobject(){
         // TagLib-Definition aus der Klasse Document übernehmen (Standard-TagLibs!)
         parent::Document();
       // end function
      }

      function onParseTime(){

         // ... do something nice ...

         // Tags extrahieren
         $this->__extractTagLibTags();

         // DocumentController extrahieren
         $this->__extractDocumentController();

       // end function
      }

    // end class
   }
Anschließend kannst du deinen Tag wie folgt innerhalb eines Templates verwenden:

Code: Alles auswählen

<core:addtaglib namespace="path::to::my::taglib" prefix="my" class="createobject" />
<my:createobject my="special" attribute="list" />
Die HTML-/XML-Attribute der Tag-Definition kannst du innerhalb der Klasse my_taglib_createobject jeweils im $this->__Attributes-Array abfragen. Der Inhalt eines nicht selbstschließenden Tags findest du in $this->__Content. Die Liste der Parameter kann beliebig lang sein. Zu diesem Thema kannst du dir mal das Tutorial http://adventure-php-framework.org/Seit ... sErstellen ansehen.

Die Dokumentation der TagLibs habe ich unter http://adventure-php-framework.org/Seite/TagLibTags, Kapitel 3.1 deutsch sowie englisch nachgezogen und in einem Kommentar auf diesen Thread verwiesen.
Es ist sowieso an manchen Stellen schwierig die Ursache eines Fehlers zu lokalisieren.
Sollte es sich nicht um ein PHP- oder Apache-Spezifikum handeln, dass das Framework nicht lokalisieren kann, hilft dir der Stacktrace eigentlich gut weiter, da er dir die Verkettung der Ursachen aufzeigt. Dann kannst du an den entsprechenden Stellen mit einem echo() oder printObject() (Wrapper für PHP's print_r()) die relevanten Variablen ausgeben lassen. Ich gebe jedoch auch hier zu, dass man schon ein wenig Übung braucht, um die Kategorie des Fehlers erkennen zu können. Für Fehler geben, die du nicht selbst findest gibt es ja immer noch das Forum. :) Im Grunde gibt es bei der Arbeit mit dem Framework aus meiner Erfahrung folgende Kategorien von Fehler:
  • Referenzfehler (vor PHP 4.4.0)
  • Timing-Fehler
  • Race-Conditions durch Timing-Fehler
  • Null-Pointer (PHP's "fatal error. Call to a member function on a non object...")
  • Parser-Fehler (wie besprochen)
  • Tags werden nicht geparst (Tipp-Fehler!)
Für den Anfänger ist die Fülle an verschiedenen Ordnern und Dateien, deren Namen sich das Framework z.T. automatisch zusammensetzt etwas verwirrend. Für den Fortgeschrittenen, welcher genau weiss, wo er suchen muss, ist es natürlich eine Erleichterung, da er ne Menge Tipparbeit spart.
Auch richtig. Es mag auf den ersten Blick auch etwas umständlich oder überflüssig erscheinen, jedoch folge ich streng einem definierten Schema von Bezeichnungen oder eines Pfad-Aufbaus. Solltest du hier Fragen haben, können wir diese gerne diskutieren.
Viele Grüße,
Christian

Benutzeravatar
fliegermichl
Beiträge: 114
Registriert: 29.01.2008, 11:51:45
Wohnort: Echzell

Re: Fehlermeldungen

Beitrag von fliegermichl » 03.04.2008, 08:52:01

Hallo Christian,
Das ist recht einfach: da es nur eine index.php gibt, über die alles abgewickelt wird, musst du alle relativen Pfade relativ zu dieser Datei bemessen. In deinem Fall ist also der Ordner parallel zur index.php wichtig. Möchtest du einen anderen Logging-Ordner haben, dann musst du in der globalen Projekt-Konfiguration die Konstante APPS__LOG_PATH mit dem von dir gewünschten relativen (zur index.php) oder absoluten Ordner füllen. Siehe hierzu auch http://www.adventure-php-framework.org/ ... enz_Logger.
Hmm nicht ganz. Ich habe das apps Verzeichnis in einer Ebene mit htdocs (dem DocumentRoot). In dem ersten Tutorial schreibst Du zwar, man soll es unterhalb von htdocs haben, an anderer Stelle lese ich aber, daß nur die index.php, frontend usw also alles, was vom Browser direkt erreichbar sein muß unterhalb von htdocs sein soll.
Das ist meiner Ansicht nach auch besser, da so die php Dateien nicht versehentlich im Klartext ausgegeben werden können.

In der globalen Konfigurationsdatei hatte ich
APPS__LOG_PATH = "./logs" notiert und in der index.php
define('APPS__PATH', '/www/apf/apps'); // das DocumentRoot ist /www/apf/htdocs


Es hat auch soweit alles funktioniert (ausser das Log).
Ich habe vor das fopen mal ein echo "$LogFile" geschrieben und bekomme "./logs/2008_04_03__php.log"
Dann hatte ich ein $cwd=getcwd(); echo $cwd dabei und das brachte die Erleuchtung "/". und auf
/logs hat der Apache User natürlich keinen Zugriff.
Ich habe jetzt den absoluten Logpfad in die globale Konfigurationsdatei eingetragen und nun klappt es auch mit der Logdatei Nachbarin ;-)

Deine Ausführungen zu den taglibs Erweiterungen lese ich mir noch einmal durch, wenn ich eine Chance hab, es zu verstehen :-)

Ich versuche gerade mit dem APF zwei kleine Module zu erstellen. Jedes der beiden Module soll seinen Namen und einen von zwei Zustaenden ausgeben. Beide Module sollen per Tag im Content Bereich der Tutorialwebseite eingebunden werden. Jedes Modul soll einen Link haben, welcher den Zustand des entsprechenden Moduls umschaltet ohne sich um das andere Modul kümmern zu müssen.

Viele Grüße
Michl

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fehlermeldungen

Beitrag von dr.e. » 04.04.2008, 09:18:28

Hallo Michl,

schön, dass die Fehler nun behoben. :)
Jedes Modul soll einen Link haben, welcher den Zustand des entsprechenden Moduls umschaltet ohne sich um das andere Modul kümmern zu müssen.
Solltest du dazu Fragen haben, meld dich einfach. Ich empfehle dir jedoch den linkHandler (http://adventure-php-framework.org/Seite/Links) für die Generierung der Links zu verwenden, dann bist du schon mal Link-technisch Modul-unabghängig.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast