Wie umfangreiche Library schneller laden?

Hi,

ich habe eine inzwischen recht umfangreiche Lib (190kB, Tendenz weiter steigend), die ich „im Prinzip“ am liebsten in jedem Script geladen hätte.

Nun ist die reine Ladezeit mit zwischen 50 und 100ms (ja, das ist kein Superrechner, aber auch kein Atom, es ist ein Dual Core, Vista, 2GB Ram, HDD) leider an der Grenze dessem, was ich mir so vorstelle (wenn ich z.B. Scripte „chaine“, weil ich separate Threads will summiert sich das …).

Nun suche ich nach einer Möglichkeit, dass der Code im Speicher gehalten wird - schliesslich ist es sowas wie ein Framework.

Bietet IPS da etwas oder kann man PHP-seitig etwas „nachrüsten“, das dann auch wirklich einen Vorteil bringt?

Nicht, dass das Laden des Zusatzes ggf. jedesmal für ein Script vorgenommen wird (es gibt ja kaum Interna zu IPS) und damit der Vorteil wieder aufgebraucht ist.

Da PHP keine Programmiersprache ist, sondern zur Laufzeit interpretiert und übersetzt werden muss, hast du wenig Einfluss darauf wann Teile deines Scripts in den Speicher geladen oder von der CPU bearbeitet werden weil das der Interpreter übernimmt.

Das was du vor hast kannst du, meine ich, aber mit Extensions realisieren. Die sind dann logischerweise aber nicht in Scriptsprache geschrieben.

Gruß,

Toni

Hier bietet es sich doch an eine DLL zu erstellen und diese dann zur Laufzeit in den Speicher zu laden.
Das war ja auch der Vorschlag von Tonic1024 :wink: .

http://www.php.net/manual/de/function.dl.php

Um nicht aneinander vorbeizureden:

Für ne DLL fehlt mir das KnowHow. Ich suche nach einer Möglichkeit, weiter mit PHP Datei(en) zu arbeiten, das System aber so aufzusetzen, dass (bestimmte) Dateien so etwas wie „vorcompiliert“ werden (meinethalben beim ersten Nutzen durch ein Script, kann dann ja beim Startup eingebunden werden) um die Ladezeiten zu minimieren.

Leider gibt es auch keine Doku, wie IPS mit PHP (oder umgekehrt) verzahnt ist.

Ich habe gesagt bekommen, dass Bytecache so etwas machen soll, aber wie bindet man das in IPS ein? Und bringt es dann wirklich etwas oder konterkariert die Art, wie IPS einen PHP Server für ein Script zur Verfügung stellt, evtl. die Vorgehensweise (z.B. dass die Initialzeit bis zur ersten Ausführung einer PHP Codezeile steigt, je mehr Erweiterungen gebraucht werden).

Ich freu mich über jeden Hinweis, der mich da weiter bringt. Aber wie gesagt, DLL ist mir zu hoch.

Schau dir dies mal an (Autoload). Aber schneller wird der selbe Code dadurch auch nicht, da er ja immer noch zur Laufzeit übersetzt werden muss. Erst wenn man dem Interpreter Arbeit abnimmt bewirkt man wirklich was. Vielleicht gibts da nen Bonus für Plattenzugriff, mehr ist aber sicher nicht drin.

Toni

Hi,
grundsätzlich mal, es gibt zwei Möglichkeiten einen Code schneller ausführen zu lassen:
1.) immer bessere Hardware kaufen
2.) den Code optimieren / abspecken

Warum soll der Code denn in JEDEM Script geladen werden? Das ist doch Verschwendung und es gehört sich auch nicht :wink: Nutze immer nur das nötigste!

Aber nun gut. Es gibt eine Möglichkeit den PHP Code in C/C++ zu übersetzen. Diese Technik wurde von den Entwicklern von Facebook entwickelt. Ich kenne aber, noch, zu wenig von IPS um zu wissen, ob diese Technik überhaupt funktioniert. Das Projekt nennt sich hiphop-php.

Du solltest dich also mal über deine Code hermachen.

Gruß

Warum soll der Code denn in JEDEM Script geladen werden? Das ist doch Verschwendung und es gehört sich auch nicht Nutze immer nur das nötigste!

Mensch! Dass ich da nicht selber drauf gekommen bin! Schmunzel.

Aber vielleicht kannst Du mir ja auch erklären, wie ich eine Abstrakte Klasse nachträglich um Konstanten und Methoden erweitern kann … alle, die ich bis jetzt um Rat gefragt habe, mussten da passen …

PHP ist ein Werkzeug für (Web)Server basierte Aufgaben. Vor meinem geistigen Auge sehe ich dich mit der Spitzhacke vorm Schaltschrank stehen um eine Sicherung zu wechseln weil du bei dem Werkzeug bleiben willst was du kennst. :smiley:

Ohne PHP-Background jetzt. Also reine Theorie.

Abstrakte Inhalte von Klassen sind „Platzhalter“ für Code, der zum Zeitpunkt des Klassendesigns noch undefiniert ist. Zum Beispiel weil man noch nicht wissen kann was später vom anwendenden Entwickler mit der Klasse gemacht wird. Du musst eine eigene Klasse schreiben, die du von deine Mutterklasse mit den abstrakten Inhalten ableitest. Alles was dort als „Abstract“ gekennzeichnet ist kannst du (musst aber nicht) dann mit eigenen Inhalten überschreiben während die Grundfunktionen von der Mutterklasse geerbt werden.

Deine Klasse um eigene Methoden zu erweitern ist also schon mal der vollkommen falsche Ansatz. Vererbung ist das Stichwort. Du erzeugst aus der Klasse einen hierachischen Ableger. Der gehört dann dir und du kannst dazu schustern was du willst.

Hier en bissel Futter: http://professionelle-softwareentwicklung-mit-php5.de/

Aber soviel vorweg: Da kaum ein Laie das so richtig beherrscht wird dein Code Vielen schlicht unleserlich, unsauber und unnötig kompliziert vorkommen. Er wird vermutlich aus mehreren Dateien bestehen, die miteinander verknüpft sind und nur zusammen funktionieren. Sowas an Dritte weiter zu geben bedarf einer genauen Beschreibung denn es dürfte den Horizont des Standard-Anwenders übersteigen. Die IPSLibrary geht diesen Weg.

Edit:

PHP ist und bleibt aber deswegen immer noch eine Scriptsprache. Schneller ausgeführt wird der Code deswegen also auch nicht :wink:

Gruß,

Toni

@Tonic:
Spitzhacke: Naja, wenn mir halt ein System nur ne Spitzhacke gibt … diese Diskussion ist nicht fruchtbar --> siehe die gerechtfertigten Aussagen über Deine Libs, die mit jeder Version neu compiliert und zur Verfügung gestellt werden müssen …

DESHALB nur PHP …

Natürlich besteht ein Framework - wie die IPS Lib aus mehreren Dateien. Und genau dort setzt auch meine Frage an, ich will (und habe bereits) soviel als möglich in eine Datei bringen - eben den Framework loader - und trotzdem einigermassen vernüftige Ladezeiten haben.

Es gibt neben den Dateien auch einen „Make“, der aus vielen Dateien und Platzhaltern dann die konkrete Lib baut. Wird alles offengelegt, sodass da auch jeder, der etwas mehr Verständnis hat und Zeit investieren will, Änderungen vornehmen kann. Da die Lib von vornherein auf OpenSource ausgelegt ist, gibt’s auch umfangreiche Doku dazu.

ALLE Funktionen werden dann per [LIB]::funktion() aufgerufen und das kann man einem Laien, zusammen mit einem PDF, das die Funktionen und Vorgehensweisen beschreibt, durchaus vermitteln.

Dass ich mit einer abstrakten Klasse arbeite, kommt AUCH von der (m.E.) besseren Lesbarkeit - gerade für den Laien. Für den „pro“ gibts dann - in einem Rutsch -eine „User-Class“, die die abstract extended und dasselbe Interface hat.

Es bleibt die Herausforderung der Ladezeit und dies ohne alles in -zig Dateien aufzusplitten, was dann ja eben egen der nicht erweiterbarkeit der Klassendefinition (HIER ist das Problem) zu verschiedenen Klassenaufrufen führt. Das möchte ich nicht.

PHP ist und bleibt aber deswegen immer noch eine Scriptsprache. Schneller ausgeführt wird der Code deswegen also auch nicht

Womit wir dann wieder beim Start angekommen sind.

Gibt es irgendwelche Hinweise oder Know How für IPS in Verbindung mit Bytecache? Ich gehe davon aus, dass gerade bei langsamen Maschinen der Bytecache viel bringen kann.

Also ich glaub du hast alles was du brauchst. Will mal versuchen das zusammen zu fassen was ich da raus gelesen hab.

Du willst eine einzige Klasse schreiben ([LIB]::funktion() ist ein klassischer class-method Aufruf) die immer im Speicher präsent ist. Das geht. Dafür brauchst du fundiertes OOP-Wissen (findest du in meinem Link) und autoload/auto_prepend_file.

Du willst bei dem langsamen PHP bleiben und es darum künstlich beschleunigen. Das geht auch. Du musst dafür Zusatzsoftware (Hiphop wurde auch bereits genannt) installieren. Musst eben abwägen ob die dein System ausbremst und so deinen Geschwindigkeitsvorteil zunichte macht. Wenn dein Server eh den ganzen Tag idlet ist ja auch kaum Potential vorhanden.

Zusatzsoftware birgt immer ein gewisses Risiko, denn IPS nimmt keine Rücksicht auf Versionskonflikte. Ich weiss wovon ich spreche (IPS-Plugins bzw „Module“). Wenn das IPS-Update PHP12 installiert, dass nicht mit deiner Zusatzsoftware funktioniert - Pech. Vorher informieren.

@Tonic:

Du willst eine einzige Klasse schreiben ([LIB]::funktion() ist ein klassischer class-method Aufruf) die immer im Speicher präsent ist. Das geht. Dafür brauchst du fundiertes OOP-Wissen (findest du in meinem Link) und autoload/auto_prepend_file.

„Immer im Speicher praesent“ beisst sich mit „autoload/auto_prepend_file“. Was jwka sucht ist ein Weg, PHP Code dauerhaft im Speicher zu halten, ohne es bei jedem Scriptaufruf immer wieder von der Festplatte laden zu muessen.

Ich habe das mal gemacht, indem ich eine PHP Extension in C geschrieben habe, die meine PHP-Lib einmalig beim Hochfahren des IPS Dienstes in RAM geladen hat und dann statt von der HDD eben vom RAM per autoload geladen hat. Mit massiven Geschwindigkeitsvorteilen.

Nachteil der Angelegenheit war, dass ich bei jeder neuen PHP - Version die Extension neu kompilieren musste. Mit Aufkommen moderner SSD Platten ist der Geschwindigkeitsvorteil einfach verschwunden.

Letztendlich hat die Wirtschaftlichkeit gesiegt: statt wochenlang drueber zu gruebeln, wie ich 5 Milisekunden mehr aus einer alten Kiste rauspressen koennte, habe ich den Geldwert von einem Arbeitstag „investiert“ und mir einen modernen, SSD basierten Rechner gebaut. Aus die Maus …

Viele Gruesse

Adrian

Schon klar. War auch mein erster Vorschlag, der dann aber ja abgelehnt wurde.

Und die habe ich ihm mit autoload versucht schmackhaft zu machen :wink:

Hi Adrian ;-]

ist schon klar, dass ne SSD da Vorteile bringt. Aber Du kennst mich ja, ich muss Dinge, die ich als (mögliche) Lösung gesagt kriege, wenigstens mal ausprobiert haben. Und es wurde mir gesagt, dass es sowas - Bytecache genannt - geben soll.

Ausserdem isses nicht nur für mich sondern die Lib soll ja sowas wie „Massentauglich“ werden, weil ggf. als OpenSource rauszugeben und ich möchte nicht die Ladezeiten bei einigen Leuten hier im Forum wissen, die nen Atom am Start haben.

Soll’s ja geben …

@Tonic: Das hat aber alles nix mit autoload zu tun - denn damit gibt’s keinen Geschwindigkeitsgewinn …

… ich grabe weiter …

Hi,
was Du vermutlich gehört hast ist das:

Könnte sein, dass es das ist. Mir wurde gesagt, dass es eine PECL extension (APC) ist. Die soll angebklich in V6 PHP dann integriert sein - oder gemäß dem Link ja sogar schon früher.

Frage heute (ich möchte nicht warten, bis IPS Vx.y rauskommt und dann PHP 6/5.5 unterstützt):

Mit welcher Version von IPS läuft welche dieser Extension?

Vielleicht sollte du dich doch mit anderen Themen beschäftigen (weniger Komplexität, schlanker Code, Back to the roots (nutzen was da ist)) und auf die PHP 5.5 Integration in IPS warten.

Meine kurze Suche zu dem Thema führt zu http://www.php.net/manual/en/opcache.installation.php

A DLL for this PECL extension is currently unavailable.

Aber es gibt auch Hinweise, wie man sich die Windows Version selber compilieren kann ;).

A DLL for this PECL extension is currently unavailable.

DAs ist gar nicht das Problem / die Frage. Es gibt einige Webseiten, die Kompilate zur Verfügung stellen, auch für APC.

Die Frage ist eher, welche der dort verfügbaren tut mit der IPS-Version und ob vielleihct schon jemand damit Erfahrung gesammelt hat.

Ich gebe zu: Ich möchte mir langwieriges rumprobieren mit ungewissem Ausgang ersparen. Aber dazu ist ein Forum ja auch da, oder?

… und wir sind mit IPS bei PHP 5.6 angelangt.

Weiß jemand, ob opcache ins IPS PHP reincompiliert ist oder ob er als extension heute
dazu genommen werden kann?

Grüße, Frank

OPCache ist nicht reinkompiliert, da dies eine Zend Extension ist und PHP nicht erlaubt diese statisch zu linken.
Unter Windows kannst du die Extension zwar laden, jedoch wird diese den Dienst verweigern, da diese nur die offiziellen SAPIs unterstützt.

paresy