2012-07-24 16 views
7

Die PHP ordentlich Erweiterung hat eine Funktion ob_tidyhandlerDocs, die mit PHP output bufferingDocs als Callback funktioniert, zB:Wie konfiguriere ich ob_tidyhandler dynamisch?

ob_start('ob_tidyhandler'); 

Ich weiß, dass Tidy a lot of configuration settingsDocs hat, jedoch bin ich für diesen Ausgabepuffer eine Straßensperre zu Setup Standardkonfigurationsoptionen treffen Rückrufen.

Die meisten PHP-Funktionen von Tidy beziehen sich auf ein sauberes Dokument oder Objekt, jedoch mit der Pufferung der Ausgabe, auf die nicht zugegriffen werden kann.

Es gibt eine Konfigurationseinstellung tidy.default_config, die jedoch zur Laufzeit nicht änderbar ist, daher ist sie nicht sehr dynamisch.

Weiß jemand, ob die Konfiguration des Callbacks überhaupt möglich ist? Ich erinnere mich, dass ich einen eigenen Rückruf schrieb, alle Ausgaben sammelte und es mit einem Anruf an tidy_repair_stringDocs reparierte, der Konfiguration als ein Array annimmt. Aber ich dachte, es wäre schön, das nicht zu tun und einfach die Konfiguration für den Ausgabepuffer zu übergeben.

Antwort

10

Ich hatte einen kurzen Blick auf den Code für die saubere Erweiterung, und es gibt eine Möglichkeit, die Konfiguration für den Ausgabepuffer-Handler zu ändern.

Das heißt, es ist kein netter Weg. Es nutzt eine Eigenschaft des Codes, die sich in zukünftigen Versionen offensichtlich ändern kann.

Die Funktion, die die Pufferverarbeitung verarbeitet, ist php_tidy_output_handler und line 1191 ruft das Makro TIDY_SET_DEFAULT_CONFIG auf.

Wenn tidy.default_config nicht festgelegt ist, dann führt das Makro nichts aus. Wenn es gesetzt ist, wird die Konfigurationsdatei von der Festplatte gelesen und die Optionen werden analysiert.

Da die Konfigurationsdatei während die Analyse des Ausgangspuffers geladen wird, ist es möglich, die Konfigurationsdatei von PHP-Skript vor Parsen beginnen zu ändern.

Das bedeutet, Sie müssen tidy.default_config = /file/writable/by/php vornehmen und diese Datei dynamisch aktualisieren, damit sie die gewünschten Optionen enthält. (Ich sagte dir, es war kein netter Weg).


Ich kann sofort ein Problem damit sehen. Es gibt eine mögliche Race-Bedingung.

Wenn zwei Skripts unterschiedliche Optionen erfordern und beide gleichzeitig ausgeführt werden, besteht die Möglichkeit, dass eines der Skripts die falsche Konfiguration erhält.

Die Datei ist offensichtlich nicht dafür gedacht, ad-hoc geändert zu werden - und wie Sie wahrscheinlich aus dem Erweiterungscode folgen können, gibt es keinen anderen Pfad zum Eingeben von Konfigurationsoptionen, da die Optionen spezifisch für das Dokument sind.

  • Ein neuer TidyDoc wird erstellt.
  • Paar Konfigurationsfahnen gesetzt + default_config geladen.
  • Puffer wird analysiert.

Entschuldigung, es fühlt sich an, als würde ich am Ende nur schlechte Nachrichten liefern.

Ihre beste Lösung könnte sein, mit einem benutzerdefinierten ob_start Callback zu gehen, wo Sie die volle Kontrolle über die Dokumentoptionen haben.

Edit:

Hatte ein bisschen ein Brainstorming und versucht, ein paar Dinge, dies zu umgehen. Alles ist gescheitert.

Ich versuchte registering a custom stream wrapper, per-Skript-Werte zurückzugeben, und tidy.default_config = tidy://config festlegen. Es stellt sich heraus, dass Stream-Wrapper nicht vom Config Loader aufgelöst werden und dies funktioniert nicht.

Eine Sache, die ich nicht richtig testen konnte, ist die pro-Verzeichnis-Konfiguration .user.ini oder [PATH=] ini Abschnitt. Diese sind beide nur mit dem CGI/FastCGI SAPI (nicht FPM) verfügbar. Ich vermute, das hilft dir wahrscheinlich auch nicht.

+1

Nun, schlechte Nachrichten liefern, ist es nicht so. Aus der Dokumentation, die ich bereits erwartet hatte, geht nicht, und ich habe auch eine zweite Meinung eingeholt, die Sie weitgehend gemacht haben. Vielen Dank, dass Sie sich die Zeit genommen haben. Es ist wahrscheinlich sinnvoll, darüber nachzudenken, ob eine neue Einstellung/ein neuer Kontext/eine neue Option für diese Callbacks als Feature-Anforderung gewünscht wird, damit diese zur Laufzeit besser kontrolliert werden kann. – hakre

+0

X-Ref: https://github.com/leight/php-src/commit/42ba66ff4e427a28e2e652692a4a10cec8b79df2 – hakre

Verwandte Themen