Multithreading PHP

jannicars

Erfahrenes Mitglied
Hallo,

Ich habe derzeit ein Projekt am laufen, wo ich jede Nacht um 1:00 Uhr
Daten aus XML Files beziehe.
Im Moment sind knapp 5.000 Einträge vorhanden.
100 Einträge = 11 Sek.
1.000 Einträge = 110 Sek.
5.000 Einträge = 550 Sek.
550 % 60 = ~9 Minuten
Ausgenommen immer ein DB Update.
Also sagen wir mal, dass dauert 10 Minuten.

Wenn ich jetzt 50.000 Einträge hätte, würde das ganze 100 Minuten dauern.
Nun dachte ich mir, währe es doch theoretisch möglich 10 Files gleichzeitig zu beziehen,
würde das ganze um dem Faktor 10 beschleunigen.

Diese pcntl_fork Geschichte scheint wohl nicht das wahre zu sein,
da ich mir da wahrscheinlich schon ein eigenes Framework(zumindest eine umfangreiche Klasse) basteln müsste.

So nun meine Frage:
Hätte jemand eine Idee wie man dies schneller und effektiver lösen kann?
 

javaDeveloper2011

Erfahrenes Mitglied
Hi jannicars,

ich würde mal ganz schlicht sagen: PHP hat nicht wirklich Threading, und einfach so "herzaubern" kann man das auch nicht.
Sind die Aktionen kompliziert?
Ist die Beschleunigung (sehr) wichtig?
Du könntest auch einfach ein "normales" Programm, z.B. in C++ schreiben und dann aus PHP heraus aufrufen.

Gruß
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

eine weitere einfache alternative... wenn die Import-Vorgänge alle unabhängig voneinander sind, dann starte doch einfach X PHP-Prozesse zur Verarbeitung deiner Dateien mit unterschiedlicher Parameterisierung (Prozess 1: Files 0-1000, Prozess 2: Files: 1001-2000, etc.).

Gruß Tom
 

jannicars

Erfahrenes Mitglied
Hi javaDeveloper2011,

Die Beschleunigung des Scriptes ist sehr wichtig,
da dass Script mit 5.000 Einträgen knapp 1 Stunde braucht.
Es werden bestimmt bald locker sich um die 50.000 Einträge in der
Datenbank rumtummeln.
Das Problem an der anderen Sprache währe,
1. Ich kann keine andere Sprache.
2. Ich benutze ein Framework in PHP(bestimmt könnte es auch ohne gehen, wird dann aber wieder komplizierter.)

So umfangreich ist das ganze Script auch nicht:
1. Schritt-> Alle Einträge in eine Schleife packen
2. Schritt-> In der Schleife dann das File immer einzeln laden, Daten entnehmen,
ein MySQL Datenbank update (1 Eintrag editieren) und in eine andere Tabelle 1 Insert.
Schritt 2 Halt immmer in einer Schleife.



Hallo,

eine weitere einfache alternative... wenn die Import-Vorgänge alle unabhängig voneinander sind, dann starte doch einfach X PHP-Prozesse zur Verarbeitung deiner Dateien mit unterschiedlicher Parameterisierung (Prozess 1: Files 0-1000, Prozess 2: Files: 1001-2000, etc.).

Gruß Tom
Darüber habe ich mir auch schonmal Gedanken gemacht.
Mein gedachter Weg dies zu realisieren:
1. Alle Einträge zählen und in 10-20 Prozesse aufteilen.
2. per Exec() die Datei aufrufen mit GET(?!) Parametern.
3. Den Rest halt da weiterlaufen lassen.

Klingt irgendwie ganz gut.
 
Zuletzt bearbeitet:
B

ByeBye 154279

Hey,

wie ist dein Import-Vorgang gelöst bzw. programmiert?
Vielleicht gibt es dort noch Potenzial ...

mfg
bo
 

ComFreek

Mod | @comfreek
Moderator
So umfangreich ist das ganze Script auch nicht:
1. Schritt-> Alle Einträge in eine Schleife packen
2. Schritt-> In der Schleife dann das File immer einzeln laden, Daten entnehmen,
ein MySQL Datenbank update (1 Eintrag editieren) und in eine andere Tabelle 1 Insert.
Schritt 2 Halt immmer in einer Schleife.
Wie wäre es, wenn du zuerst alle SQL-Statements sammelst und sie dann gemeinsam auf einen Schlag ausführst?

2. per Exec() die Datei aufrufen mit GET(?!) Parametern.
Rufe es lieber mit Parametern auf:
Code:
php -f /path/to/the/file.php firstparam secondparam

Und im PHP-Skript kannst du per $argv auf die Paramter zugreifen.
 

jannicars

Erfahrenes Mitglied
Wie wäre es, wenn du zuerst alle SQL-Statements sammelst und sie dann gemeinsam auf einen Schlag ausführst?

Würde das so drastisch den ganzen Ablauf beschleunigen?
Aber dafür braucht das Script mehr RAM?

Rufe es lieber mit Parametern auf:
Code:
php -f /path/to/the/file.php firstparam secondparam

Und im PHP-Skript kannst du per $argv auf die Paramter zugreifen.

Ich hab früher auch schon versucht, Scripte per command line auszuführen, scheiterte immer beim includen von anderen Dateien.
Ich hab da glaub ich immer
Code:
php -c oder -x
benutzt.
 

ComFreek

Mod | @comfreek
Moderator
Würde das so drastisch den ganzen Ablauf beschleunigen?
Aber dafür braucht das Script mehr RAM?
Habe gerade schnell mal einen Test gemacht:

Tabelle:
SQL:
CREATE TABLE big_table ( id INTEGER AUTO_INCREMENT PRIMARY KEY, sometext CHAR(255) )

Es werden jeweils 1000 255 Zeichen lange Strings eingefügt:
1.) [phpf]mysqli_query[/phpf] bei jedem Durchlauf der Schleife (Zeitdifferenz in Mikrosekunden | RAM in Bytes):
1.8684060573578 | 331760

2.) [phpf]mysqli_query[/phpf] außerhalb der Schleife mit 1000 INSERT VALUES-Kommandos:
0.075608015060425 | 592648

Also, es lohnt sich auf jeden Fall. Wenn du dann noch ein [phpf]mysqli_query[/phpf]-Kommando nach jedem x. Hinzufügen von Werten einbaust, kannst du auch noch die RAM-Nutzung regulieren.

Ich hab früher auch schon versucht, Scripte per command line auszuführen, scheiterte immer beim includen von anderen Dateien.

[phpf]set_include_path[/phpf] könnte dir helfen.
 

jannicars

Erfahrenes Mitglied
Also einfach in der Schleife alles in ein Array packen,
am schluss das ganze Array in einer For Schleife mit Insert und Update machen in einem Rutsch?

Könntest du am besten mal das Testscript posten? :D
 

Lime

frisch fruchtig
Also einfach in der Schleife alles in ein Array packen,
am schluss das ganze Array in einer For Schleife mit Insert und Update machen in einem Rutsch?

Könntest du am besten mal das Testscript posten? :D

Dann führst du immer noch jedes SQL-Statement einzeln aus.
Du sollst die Statements zusammenhängen...

SQL:
INSERT INTO table (id) VALUES (12);INSERT INTO table (id) VALUES (12);INSERT INTO table (id) VALUES (12)
 
Zuletzt bearbeitet von einem Moderator: