Hi Christian,
Tja, dann kommt der Overhead von PHP. Du könntest Dir ein PHP-Binary kompilieren, das ausschließlich die Extensions enthält, die Du wirklich brauchst, dann wäre der Overhead natürlich geringer. Oder Du könntest die Extensions als Shared Libraries kompilieren (gibt irgend so eine configure-Option bei PHP, unter Gentoo kannst Du, falls Du dev-lang/php als Ebuild verwendest, das USE-Flag »sharedext« setzen), dann würden sie nur einmal geladen werden, auch wenn multiple PHP-Prozesse laufen.
Hört sich interessant an - ich verwende Debian 3.1, dazu habe ich PHP (aus diversen Gründen) selbst kompiliert und habe dabei immer --with-xyz=shared angegeben, das wird dann in so Extensions kompiliert wie beim Apache es auch die Module gibt, man kann die dann einzeln laden. Hinzu kamen noch ein paar Sachen mit --enable-xyz, wo ich nicht wusste, wie ich die shared machen kann, sodass diese also fest einkompiliert sind.
Jetzt wollte ich hingehen und eine andere php.ini verwenden, in der alle nicht benötigten Extensions nicht geladen werden, ich habe die php.ini angelegt und wollte folgende Shebang verwenden:
#!/usr/local/bin/php5 -c /absoluter/pfad/zur/php.ini
In der php.ini habe ich den IncludePath entsprechend gesetzt, sodass ich eine Datei einfach per include("datei") einbinden kann. Allerdings scheint PHP _nicht_ diese php.ini zu verwenden, was ich daran erkenne, dass der Include-Befehl fehlschlägt mit der Fehlermeldung dass die Datei nicht gefunden wurde. Dabei gibt PHP in der Fehlermeldung ja auch den Include-Path aus, dieser ist aber ganz anders als der aus der php.ini und auch anders als der aus der normalen php.ini - was mich glauben macht, PHP verendet gar keine php.ini in diesem Fall.
Nächster Schritt was dann, dass ich hingegangen bin und selber auf die php.ini verzichtet habe, die Pfade für die Includes vollständig ins Script geschrieben habe und diese Shebang verwendet habe:
#!/usr/local/bin/php5 -n
Allerdings will mir das nicht ganz gefallen, da ich hier keine Einstellungen für PHP mehr vorgeben kann! Geht das vielleicht nicht doch irgendwie auf die erste Art und Weise?
Erfolg hats auf jeden Fall gebracht, der laufende PHP-Prozess brauchte nur noch 1.7% bis 1.8% des RAMs - also deutlich weniger. Ich mache mir aber auch immer noch Gedanken darüber, ob man für einen User auf dem System die maximale Menge an RAM einschränken kann...
Und dann wäre noch die Frage zu klären, wie viel denn 2,9% tatsächlich sind. Wenn Du 128 MiB RAM hast, dann sind 2,9% 3.71 MiB - was IMHO noch vertretbar wäre. Bei 1 GiB RAM wären es dagegen schon 29,7 MiB - was dann doch etwas viel wäre.
Laut top:
Mem: 257044k total, 251060k used, 5984k free, 66932k buffers
Swap: 524280k total, 44k used, 524236k free, 68836k cached
Wären also 251 MB.[1] Ist das eigentlich nich ein gutes Zeichen, wenn der Swap-Bereich noch so gut wie gar nicht genutzt wird?
Bei 251MB wären das also 7,3MB - eigentlich schon etwas viel. Ohne die geladenen Erweiterungen waren es ja nur noch 1,7%, was nur noch 4,3MB wären - schon deutlich besser.
Wenn Du das PHP-Script dreimal fork()st, dann ist das von der Speicherbelastung her genauso, als ob Du drei separate Prozesse starten würdest.
Ok - ich hatte gedacht/gehofft, es wäre möglich, einen PHP-Prozess laufen zu lassen, der von drei Scripte genutzt wird.
MfG, Dennis.
[1] Du wunderst dich über die krumme Zahl und warum ich die Zahl nicht aus einem Vertrag oder so weiß? Nun, recht einfache Sache - es handelt sich ja um den VServer unserer Schule und unser Provider Intertech fördert uns da auch ein bisschen, wir kriegen halt so was wir brauchen, so in etwa ;-)