14

Ich möchte JavaScript ausführen und die Ergebnisse mit PHP erhalten und frage mich, ob es eine Bibliothek für PHP gibt, die es mir ermöglicht, sie zu analysieren. Mein erster Gedanke war, node.js zu verwenden, aber da node.js Zugriff auf Sockets, Dateien und Dinge hat, würde ich das lieber vermeiden.JavaScript in PHP interpretieren

Begründung: Ich bin Bildschirm in PHP Schaben tun und haben viele Szenarien auftreten, wo die Daten von JavaScript auf dem Frontend produziert wird, und ich möchte Funktionen schreiben können spezielle Filterung vermeiden, auf dem JavaScript auf ein handeln im Einzelfall, da dies viel Zeit in Anspruch nimmt. Der allgemeinere Fall wäre, das JavaScript direkt zu analysieren.

Downvoting: Ich sehe nicht wirklich, was an dieser Frage so kontrovers ist, moderne Web-Crawler sind dafür bekannt, der einzige Unterschied ist, dass sie nicht in PHP geschrieben werden. [1]

[1] http://blogs.forbes.com/velocity/2010/06/25/google-isnt-just-reading-your-links-its-now-running-your-code/

+6

Warum in der Welt wollen Sie das tun passieren kann?!?!? Wenn Sie es * tun * müssen, können Sie einen CLI-JavaScript-Interpreter kompilieren und ausführen: http://code.google.com/p/v8/. – Blender

+3

für welchen Zweck? PHP hat bereits eine Vielzahl von Datumsfunktionen. – stillstanding

Antwort

5

Es ist eine interessante Frage und die Down-Wähler sind phantasielos über mögliche Anwendungsfälle. Seitenarchivierungswerkzeuge, Druckskripts, Vorschaubilder - alle gültigen Gründe, um ein Dokument mit dem in der Seite enthaltenen JavaScript zu bearbeiten.

Mir sind keine existierenden PHP-Implementierungen bekannt, aber Sie könnten Mozillas SpiderMonkey wahrscheinlich als ein PHP-Modul anpassen, oder als ein eigenständiges Werkzeug, um ein DOMDocument zu manipulieren und das Ergebnis zurückzugeben.

Ich habe keine Erfahrung mit serverseitigen JavaScript hatte, aber einige Probleme, die ich glauben könnte, müssen behandelt werden mit:

  • Host-Objekte wie document und window sind nicht Bestandteil der ECMAScript-Spezifikation (diese sind Objekte, die vom implementierenden Browser bereitgestellt werden. Sie müssen also sicherstellen, dass die Bibliothek entsprechende Host-Objekte bereitstellt.
  • Sie haben möglicherweise Sicherheitsprobleme beim Ausführen von clientseitigen Skripts in einer serverseitigen Umgebung. Das ist so, als würde man dem Benutzer erlauben, ein PHP-Skript zur Bewertung einzureichen, also müssen Sie sicherstellen, dass die Sicherheits-Sandbox fest ist.

Eine andere (vielleicht) sicherer und einfacher Option implementieren könnte eine modifizierte FireFox oder WebKit-Instanz zu verwenden, die als Browser ausgeführt wird, um die Zielseiten Laden und die modifizierte Quelle zu Ihrer Anwendung zurück.

+0

Ich bin froh, dass Sie auf das Problem mit dem Dokument und dem Fenster hingewiesen haben, dass dieses spezielle Problem nicht angeklickt wurde. Ich denke, wenn ich dieses Problem lösen wollte, würde ich den Weg des Schreibens eines PHP-Moduls gehen, wie Sie vorgeschlagen haben. –

+0

@KitSunde Werfen Sie einen Blick auf Selen. Es ermöglicht Ihnen Browser aus jeder Sprache zu steuern. Bei node.js geben Node-Entwickler normalerweise node.js auf und verwenden stattdessen phantom.js, sodass selbst Knotenentwickler mit diesem Problem konfrontiert werden. Phantom.js ist weder node.js noch ist es eine Bibliothek von node.js (obwohl es Bibliotheken gibt, die es dem Knoten erlauben, Phantom zu steuern). Phantomjs ist ein Browser anstelle eines Interpreters (es ist eine Verzweigung von Google Chrome) mit Fenstern, Tabs usw., aber die Fenster werden nie auf dem Bildschirm gezeichnet. Es ist ein kopfloser Browser. – slebetman

+0

@slebetman Danke, ich habe Selen in den 7 Jahren seit ich diese Frage gestellt habe, festgestellt. : p –

1

NodeJS (oder ein anderes Derivat von Googles v8) könnte in der Tat der beste Weg sein, hier zu gehen. Wenn Sie sich Sorgen machen über die verschiedenen Dinge, die nodejs tun kann (zB Sockets, etc), können Sie wahrscheinlich "strippen", indem Sie Module und/oder Addons entfernen - ich denke, sogar das eingebaute Zeug wird letztendlich in solch einem implementiert so, dass es ziemlich leicht ausgestrichen werden konnte.

Ein alternativer Ansatz besteht darin, die require-Funktion von node.js einfach zu ersetzen, zu überschreiben oder zu entfernen.

Es gibt auch envjs, die es einfacher machen sollte, js auszuführen, das entworfen wurde, um den Browser auszuführen.

+0

Ich habe noch nie envjs gesehen, das ist wirklich interessant. Ich werde weiter darüber nachdenken, danke. :) –

+0

Gern geschehen. Viel Glück. (und nicht von den Downvotern entmutigt werden). – Lee

4

Von PHP 5.3 können Sie V8JS extention from PHP verwenden. Es ist eine native Bibliothek, die die neue Google V8-Javascript-Engine verwendet, um JS auszuführen und das Ergebnis zurückzugeben.

Es ist gut, weil du Vars in PHP Arrays und interpretiert sehr gut