PHP Prozess beschleunigen

#1
Guten Morgen Community,
ich habe etwas Schwierigkeiten, welche es für mich gilt zu lösen.

Auf meinem Server Linux, oder auch Windows / (QUAD CORE) läuft eine einzelne PHP Applikation. Diese Applikation, bestehend aus einem PHP Script läuft bei mir zu 100% (shell linux / info aus shell Befehl htop) nur auf einem Kern und benötigt eine Zeit zur Vertigstellung von größer 3 Tage. Selbst bei Verstellung des nice wertes -17 ändert sich nichts.

- Bitte nicht diskutieren ob java c, c++ nicht besser wären, denn Grundlage ist PHP -

Wenn die Applikation über den Client/Webserver gestartet wird, beendet der Browser, oder ähnliches die Verbindung.

Somit habe ich das Script direkt über auf dem Server gestartet und erhalte erstmal keinen Abbruch und eine Fertigstellung nach größer 3 Tage.

Gibt es doch noch eine Möglichkeit den Prozess auf meherer Kerne aufzuteilen, oder das ganze zu beschleunigen ?

Danke vorab ...
 
#2
Nein.
Gibt es nicht.
Zumindest nicht ohne den Code umzuschreiben.
( multithreading - Php multithread - Stack Overflow , PHP: Thread - Manual )
Wenn es im Kontext eines Webservers laufen muss grundsätzlich nicht(z.b. Apache, wie es mit PHP-FPM aussieht, weiss ich nicht wäre aber auch für Infos dankbar)
Der Hintergrund ist, das ein Prozess, erstmal nur aus einem Thread besteht und der nicht parallel auf mehreren Kernen laufen kann.

Ich muss also auch bei C/C++,Java,C#, etc. Threads in die Programmierung mit einbauen, da ich sonst vor dem gleichen Problem stehe.

Hier wären Informationen nützlich was das Skript macht(evtl Code?), ggf. ist die Umstrukturierung einfacher als gedacht, zB. starten des Skriptes mehrmals mit bestimmten Parametern um Raceconditions zu vermeiden, so muss man den Code nicht anpassen und kann "Mutlithreading" über das Starten mehrer Prozesse erzwingen, solange es keine IPC geben muss ist das die schnellste Möglichkeit, aber ich würde das nur als letzte Möglichkeit in betracht ziehen da die Wartung und Erweiterbarkeit sehr leiden kann, da man Programmieren muss als wenn man Threads hat obwohl die im Code nicht vorkommen.

Wurde den schon eine Umstrukturierung der Datenstrukturen in Betracht gezogen,zB ist ein Kreuzprodukt über mehrere Tabellen nicht gerade geil was die Speicherauslastung und Timeouts angeht, so kann man zB den Prozess soweit beschleunigen das Multithreading nicht mehr nötig ist.

Sonst wäre ein Cronjob eine Abhilfe.
Gruß

Fluffy
 
Zuletzt bearbeitet:
#3
Fluffy hat absolut Recht. Ohne zu wissen was das Skript tut, kann man dazu wenig sagen. Performance-Optimierungen bei PHP-Skripten sind prinzipiell Sache des Codes. Evtl. werden Datenbank-Abfragen gemacht, die nicht optimal sind und daher ewig dauern. Evtl. kann man im Skript gemachte Berechnungen durch Multithreading paralllelisieren um so die CPU-Power besser zu nutzen. Evtl. sind zu viele Festplatten-Zugriffe im Skript, die man durch richtiges Caching vermeiden kann. Oder oder oder... Möglichkeiten gibt es viele. Und die hängen prinzipiell vom Skript ab und nicht von den Systemeinstellungen.
 
#4
Guten MOrgen,
ein paar Zeilen Script zur Verfügung zu stellen wird schwer.

Eigentlich erstelle ich einen größeren Katalog aus HTML, welchen ich via DOMPDF in das PDF Format tranformieren möchte.

Hier habe ich leider nicht die Möglichkeit die externe Library so zu erweitern das hier Threads abgearbeitet werden können, denn das Pdf wird ja sequentiell erstellt.

Ich denke dann muss ich hier entweder auf mpdf umsteigen, hier ist der Support nur sehr unschön / quasi null, oder mit der Rechenzeit leben ...
 
#5
1) PDF seitenweise erstellen, und später die Seiten mergen (falls die Rohdaten schon alle am Anfang vorhanden sind)? Dann jeder CPU eine Teilaufgabe zuweisen.

2) Hardware is cheap / throw hardware at it: bessere CPU (wahrscheinlich am ausschlaggebendsten), SSD-Festplatte, schnellerer RAM
 
Oben