Ihr kennt das Problem: Eine PHP-Anwendung muss hunderte API-Calls machen, tausende Bilder verarbeiten oder massive Datenmengen parallel bearbeiten. Die klassische Antwort? „PHP kann das nicht, nimm Python oder Node.js.“ Falsch! Mit der parallel Extension für PHP 8 könnt ihr echtes Multithreading nutzen und eure Applikationen dramatisch beschleunigen. Bei Never Code Alone haben wir uns die Extension intensiv angeschaut und zeigen euch heute, wann sie sich lohnt, wie ihr sie einsetzt und wo die Fallstricke liegen.
Warum parallel? Der Game-Changer für CPU-intensive Tasks
PHP war jahrelang auf sequentielle Verarbeitung beschränkt. Ein Request, ein Thread, eine Aufgabe nach der anderen. Das funktioniert für die meisten Webanwendungen prima, aber sobald ihr rechenintensive Jobs habt, stößt PHP an seine Grenzen. Genau hier setzt die parallel Extension an.
Die Extension nutzt echte Threads unter der Haube und ermöglicht es euch, mehrere Tasks gleichzeitig auf verschiedenen CPU-Kernen laufen zu lassen. Keine Process-Forks wie bei pcntl_fork(), sondern shared memory und echte Thread-Pools. Das macht den Unterschied zwischen „funktioniert“ und „funktioniert verdammt schnell“.
Ein konkretes Beispiel aus unserer Community: Eine E-Commerce-Anwendung musste für 10.000 Produkte Thumbnails in verschiedenen Größen generieren. Sequentiell: 45 Minuten. Mit parallel auf einem 8-Core-Server: 7 Minuten. Das ist der Faktor 6,4x – und genau solche Zahlen interessieren auch eure Entscheider.
So funktioniert parallel/run: Die Basics
Die parallel Extension stellt euch eine elegante API zur Verfügung. Kern ist die parallelRuntime Klasse und ihre run() Methode. Hier ein einfaches Beispiel:
<?php
use parallelRuntime;
$runtime = new Runtime();
$future = $runtime->run(function() {
// Dieser Code läuft in einem separaten Thread
$result = 0;
for ($i = 0; $i < 1000000; $i++) {
$result += $i;
}
return $result;
});
// Hauptthread arbeitet weiter
echo "Hauptthread arbeitet...n";
// Warten auf Ergebnis
$value = $future->value();
echo "Ergebnis aus Thread: {$value}n";
Was passiert hier? Die run() Methode nimmt eine Closure entgegen und führt sie asynchron in einem eigenen Thread aus. Der Rückgabewert ist ein parallelFuture Objekt – quasi ein Versprechen auf einen zukünftigen Wert. Mit value() wartet ihr auf die Completion und holt das Ergebnis ab.
Das Schöne: Threads teilen sich keinen State automatisch. Jeder Thread hat seinen eigenen Scope, was Race Conditions und Synchronisations-Albträume reduziert. Wenn ihr Daten zwischen Threads austauschen wollt, nutzt ihr parallelChannel – aber dazu später mehr.
Die 10 wichtigsten Fragen zu parallel in PHP 8
1. Was genau ist die parallel Extension in PHP 8?
Die parallel Extension ist eine PECL-Extension für PHP 8, entwickelt von Joe Watkins (krakjoe). Sie ermöglicht echtes Multithreading in PHP durch die Nutzung von POSIX Threads. Im Gegensatz zu Process-Forking mit pcntl_fork() arbeiten parallel-Threads im selben Prozess-Space und können effizienter Daten austauschen.
Die Extension ist speziell für PHP 8 designed und nutzt moderne PHP-Features wie typed properties und JIT. Sie ist der offizielle Nachfolger der veralteten pthreads Extension. Die PHP-Dokumentation empfiehlt explizit den Einsatz von parallel statt pthreads.
Wichtig: parallel ist nicht Teil des PHP-Core. Ihr müsst sie separat installieren. Dazu gleich mehr.
2. Wie installiere ich parallel in PHP 8?
Die Installation von parallel hat eine entscheidende Voraussetzung: Ihr braucht PHP im ZTS-Modus (Zend Thread Safe). Die meisten Standard-PHP-Installationen laufen im Non-ZTS-Modus, weil sie für Apache mod_php oder FPM optimiert sind.
So installiert ihr parallel auf Linux:
# 1. PHP mit ZTS kompilieren oder aus Paketquellen installieren
# Ubuntu/Debian Beispiel
apt-get install php8.3-zts-dev
# 2. Extension über PECL installieren
pecl install parallel
# 3. Extension aktivieren
echo "extension=parallel.so" > /etc/php/8.3-zts/conf.d/20-parallel.ini
# 4. Verifizieren
php -m | grep parallel
Auf macOS über Homebrew:
brew install php --with-thread-safety
pecl install parallel
Unter Windows ist es komplizierter. Ihr braucht eine Thread-Safe PHP-Version und die passende DLL von PECL. Ehrlich gesagt: Für Production würden wir Windows nicht empfehlen. Nutzt Docker mit einem Linux-Image – das spart euch Troubleshooting-Stunden.
Bei nevercodealone.de haben wir mehrere Projekte mit parallel umgesetzt. Wenn ihr Unterstützung bei Setup und Integration braucht, schreibt uns gerne an roland@nevercodealone.de. Wir haben über 15 Jahre Erfahrung mit Softwarequalität und helfen euch remote beim optimalen Deployment.
3. Brauche ich wirklich ZTS für parallel?
Ja, absolut. ZTS (Zend Thread Safe) ist zwingend erforderlich. Der Grund: Non-ZTS PHP ist nicht thread-safe. Viele PHP-Extensions und der Core selbst nutzen globalen State, der bei paralleler Ausführung zu Race Conditions führen würde.
ZTS PHP kompiliert mit Thread-Safety-Mechanismen, die genau das verhindern. Der Preis: Minimaler Performance-Overhead für Single-Thread-Szenarien. In der Praxis ist der Unterschied bei modernen PHP-Versionen aber vernachlässigbar.
Checkt euren aktuellen Modus:
php -v
# Ausgabe zeigt: "PHP 8.3.0 (cli) (built: Nov 22 2024 16:45:30) (NTS)"
# NTS = Non-Thread Safe = parallel funktioniert nicht
# vs.
# "PHP 8.3.0 (cli) (built: Nov 22 2024 16:45:30) (ZTS)"
# ZTS = Thread Safe = parallel läuft
Viele Hoster bieten standardmäßig kein ZTS-PHP an. Fragt explizit nach oder nutzt Container-Setups, wo ihr die volle Kontrolle habt.
4. Was ist der Unterschied zwischen parallel und pthreads?
Gute Frage! Beide Extensions ermöglichen Threading, aber parallel ist der modernere, besser designte Ansatz:
pthreads (veraltet):
- Nur bis PHP 7.4
- Komplexe API mit Thread-Klassen
- Shared State durch extends Thread
- Höhere Fehleranfälligkeit
- Nicht mehr aktiv maintained
parallel (aktuell):
- PHP 8.0+
- Elegante Functional API
- Isolated Execution (weniger Race Conditions)
- Channels für explizite Kommunikation
- Aktive Entwicklung
Der Paradigmenwechsel: pthreads war objektorientiert und State-sharing. parallel ist funktional und isolation-first. Das macht Code sicherer und einfacher zu reasonen.
Migration von pthreads? Das ist kein Drop-In-Replacement. Ihr müsst umarchitekturieren. Aber die Mühe lohnt sich – parallel-Code ist wartbarer und performanter.
5. Funktioniert parallel unter Windows?
Technisch ja, praktisch mit Einschränkungen. Die Extension ist verfügbar als DLL über PECL, aber ihr trefft auf folgende Probleme:
- ZTS-Builds für Windows sind selten und schlecht supported
- Installation oft knifflig (DLL-Version muss exakt zu PHP passen)
- Performance unter Windows generell schlechter als Linux
- Weniger Community-Erfahrung und Support
Unsere Empfehlung aus über 15 Jahren Remote Consulting: Entwickelt auf Windows mit WSL2 (Windows Subsystem for Linux) oder Docker. Deployed auf Linux-Servern. Das gibt euch ein konsistentes Environment und spart Kopfschmerzen.
Wenn ihr auf Windows deployed, habt ihr eh andere Probleme (lizenzkosten, Performance, Tooling). Überlegt besser einen Wechsel zu Linux oder Cloud-Hosting.
6. Welche Alternativen gibt es zu krakjoe/parallel?
Es gibt mehrere Ansätze für Concurrency in PHP, je nach Use Case:
amphp/parallel:
- Userland-Library, kein Native-Threading
- Nutzt Process-Forking, nicht Threads
- Funktioniert ohne ZTS
- Event-Loop-basiert (wie Node.js)
- Gut für I/O-bound Tasks
spatie/fork:
- Sehr einfache API
- Process-Forking unter der Haube
- Perfekt für einfache Parallelisierung
- Keine ZTS-Anforderung
- Ideal für kleine bis mittlere Workloads
ReactPHP / Swoole:
- Event-Loop-Frameworks
- Async I/O statt Threading
- Andere Architektur (persistente Prozesse)
- Gut für Realtime-Apps, WebSockets
pcntl_fork():
- Built-in PHP, kein Install nötig
- Process-Forking, kein Threading
- CLI-only, funktioniert nicht in Web-Context
- Mehr Overhead als Threads
Die Wahl hängt von eurem Use Case ab. CPU-bound und maximale Performance? Nehmt krakjoe/parallel. I/O-bound API-Calls? amphp oder ReactPHP reichen oft. Einfache Batch-Jobs? Spatie/fork ist super zugänglich.
7. Kann ich parallel mit Apache mod_php nutzen?
Nein. Das ist ein fundamentales Limit. Apache mod_php läuft im Non-ZTS-Modus, weil mod_php selbst nicht thread-safe ist. Selbst wenn ihr ZTS-PHP habt, funktioniert parallel nur in folgenden Szenarien:
- CLI Scripts (Command Line)
- PHP-FPM mit ZTS-Build
- Standalone PHP-Server
- RoadRunner, Swoole (Alternative Runtimes)
Für Web-Requests über Apache mod_php: Vergesst parallel. Hier müsst ihr auf andere Lösungen setzen oder eure Architektur anpassen. Viele nutzen parallel für Background-Worker, die via Queue angesprochen werden. Der Web-Layer bleibt klassisch, die Heavy-Lifting-Jobs laufen parallel in separaten Worker-Prozessen.
8. Wie debugge ich parallele PHP-Prozesse?
Debugging von Multithreading ist generell tricky, und parallel macht da keine Ausnahme. Unsere Praxis-Tipps nach zahlreichen Projekten:
Logging ist euer bester Freund:
$runtime->run(function() {
file_put_contents(
'/tmp/parallel_debug.log',
sprintf("[%s] Thread gestartetn", date('H:i:s')),
FILE_APPEND
);
// ... work
});
Xdebug ist problematisch: Die meisten IDEs haben Schwierigkeiten mit Thread-Debugging. Stepthrough-Debugging funktioniert selten zuverlässig.
Error Handling explizit:
try {
$future = $runtime->run(function() {
throw new RuntimeException("Fehler im Thread");
});
$result = $future->value();
} catch (parallelRuntimeErrorKilled $e) {
// Thread wurde gekillt
error_log("Thread killed: " . $e->getMessage());
}
Unit Tests: Isoliert eure Thread-Logic in testbare Funktionen. Testet die Logik single-threaded, nutzt parallel nur für Integration.
Monitoring Tools: Bei Production-Einsatz nutzt APM-Tools wie Tideways oder New Relic. Die können Thread-Activity tracken und Performance-Bottlenecks zeigen.
9. Ist parallel production-ready?
Ja und nein. Die Extension ist stabil und wird aktiv maintained. Sie läuft in Production bei verschiedenen Projekten erfolgreich. Aber es gibt Considerations:
Pro:
- Mature Codebase (mehrere Jahre Development)
- Aktive Community
- Gute Performance
- Offizielle PHP-Empfehlung
Contra:
- PECL-Extension = manueller Install/Maintenance-Aufwand
- ZTS-Requirement limitiert Hosting-Optionen
- Kleinere Community als Core-PHP
- Bei Problemen weniger Stack Overflow Answers
Unsere Empfehlung: Ja für interne Tools, CLI-Workloads, Batch-Processing. Mit Vorsicht für kritische User-facing Features. Habt immer einen Fallback (z.B. sequentielle Verarbeitung bei Problemen).
Bei nevercodealone.de setzen wir parallel für Data-Processing-Pipelines und Report-Generierung ein. Für kritische Payment-Flows oder User-Authentication bleiben wir sequential. Es geht um Risk-Management und realistische Einschätzung.
Wenn ihr Unterstützung bei der Evaluation braucht oder parallel in bestehende Systeme integrieren wollt: Meldet euch bei roland@nevercodealone.de. Wir bringen 15+ Jahre Erfahrung in Softwarequalität und Remote Consulting mit.
10. Welche Performance-Verbesserungen bringt parallel wirklich?
Die ehrliche Antwort: Es kommt drauf an. parallel ist kein Silberbullet. Die Gains hängen stark von eurem Workload ab:
Ideale Use Cases (5-10x Speedup möglich):
- Image/Video-Processing
- Kryptographische Operationen (Hashing, Encryption)
- Komplexe Mathematische Berechnungen
- Daten-Aggregation über große Datasets
- PDF-Generierung in Bulk
Schlechte Use Cases (kaum/kein Speedup):
- Datenbankintensive Operationen (DB ist der Bottleneck)
- API-Calls (Netzwerk-Latenz dominiert)
- Kleine, schnelle Tasks (Thread-Overhead größer als Nutzen)
Ein Praxis-Beispiel aus unserer Community:
- Task: 5000 Produktbilder resizen (3 Größen pro Bild = 15.000 Operations)
- Sequential: 38 Minuten (Standard PHP mit GD)
- Mit parallel (8 Threads, 8-Core-Server): 6 Minuten
- Speedup: 6,3x
Aber Achtung:
Der Speedup war nicht linear. Mit 4 Threads: 4,2x schneller. Mit 16 Threads auf 8-Core-Maschine: 6,8x. Der Overhead durch Thread-Management und Context-Switching limitiert die Gains.
Unsere Faustregel:
- Bei CPU-bound Tasks: Speedup ≈ Anzahl CPU-Cores (praktisch eher 60-80% davon)
- Bei I/O-bound Tasks: Marginal bis kein Speedup
- Immer messen, nicht raten!
Benchmarkt in eurem spezifischen Szenario. Die Tool-Chain: PHPBench für Micro-Benchmarks, Blackfire.io oder Tideways für Production-Profiling.
Wann lohnt sich parallel wirklich?
Nach unseren Erfahrungen bei nevercodealone.de lohnt sich parallel in folgenden Szenarien besonders:
1. Batch-Processing mit CPU-Last
Ihr verarbeitet regelmäßig große Datenmengen? Reports, Exports, Transformationen? Parallel ist perfekt. Ein nächtlicher Cron-Job wird von 4 Stunden auf 45 Minuten reduziert.
2. Media-Verarbeitung
Thumbnails generieren, Videos konvertieren, PDFs erstellen – klassische Fälle für Parallelisierung. Die einzelnen Operations sind unabhängig und CPU-intensiv.
3. Data-Science und Analytics
Machine-Learning-Inference, statistische Auswertungen, Aggregationen über Millionen Rows. Teilt die Arbeit auf Threads auf und lasst die CPU-Kerne glühen.
4. Testing und CI/CD
Parallele Testausführung beschleunigt eure CI-Pipeline massiv. PHPUnit kann mit parallel Hunderte Tests gleichzeitig laufen lassen.
Nicht sinnvoll bei:
- Standard-Webanwendungen (CRUD, Forms, Authentication)
- API-Gateways (I/O-bound, nicht CPU-bound)
- Realtime-Apps (WebSockets – hier lieber Swoole/RoadRunner)
Die Alternative: Event-Loop und Async I/O
Bevor ihr auf parallel setzt, überlegt: Ist euer Problem wirklich CPU-bound oder eher I/O-bound? Viele Performance-Probleme in PHP kommen nicht von langsamen Berechnungen, sondern von Warten auf externe Services (DB, APIs, Filesystems).
Für I/O-bound Tasks sind Event-Loop-Libraries oft die bessere Wahl:
- ReactPHP
- Amp
- Swoole
Diese Libraries ermöglichen non-blocking I/O ohne Threading. Tausende HTTP-Requests parallel? Kein Problem mit ReactPHP. Hunderte DB-Queries concurrent? Amp hat euch covered.
Der Vorteil: Kein ZTS nötig, einfacheres Deployment, weniger Overhead. Der Nachteil: Anderes Programmiermodell (async/await-Style, Promises).
Channels: Kommunikation zwischen Threads
Ein mächtiges Feature von parallel sind Channels. Sie erlauben explizite Kommunikation zwischen Threads:
use parallel{Runtime, Channel};
$channel = new Channel();
$runtime = new Runtime();
$future = $runtime->run(function($channel) {
// Thread empfängt Daten
$work = $channel->recv();
$result = process($work);
// Thread sendet Ergebnis zurück
$channel->send($result);
}, [$channel]);
// Hauptthread sendet Arbeit
$channel->send(['data' => 'some work']);
// Hauptthread empfängt Ergebnis
$result = $channel->recv();
Channels sind typsicher und blockieren bei recv() bis Daten verfügbar sind. Ihr könnt sie für Producer-Consumer-Patterns, Worker-Pools und komplexe Thread-Coordination nutzen.
Ein Tipp aus der Praxis: Haltet Channel-Communication simpel. Je mehr ihr zwischen Threads kommuniziert, desto höher der Overhead. Optimal: Gebt Tasks rein, holt Results raus, fertig.
Best Practices aus 15+ Jahren Erfahrung
Bei Never Code Alone haben wir gelernt, was in Production wirklich funktioniert:
1. Stateless Threads
Jeder Thread sollte unabhängig arbeiten können. Keine shared State, keine gegenseitigen Dependencies. Das macht Code testbar und reduziert Bugs.
2. Graceful Degradation
Habt immer einen Fallback. Wenn parallel nicht verfügbar ist (falsches PHP-Build, Extension fehlt), sollte eure App sequential weiterarbeiten:
if (extension_loaded('parallel')) {
// Fast path: parallel
$results = processInParallel($data);
} else {
// Fallback: sequential
$results = array_map('process', $data);
}
3. Resource Limits
Begrenzt Thread-Pools. Nicht einfach 100 Threads starten, weil ihr 100 Cores habt (was eh niemand hat). Realistisch: 2-4x Anzahl CPU-Cores als Maximum.
4. Error Handling
Threads können crashen. Fangt Exceptions ab, loggt sie, handelt sie graceful:
foreach ($futures as $future) {
try {
$results[] = $future->value();
} catch (Throwable $e) {
// Thread failed, log and continue
error_log("Thread error: " . $e->getMessage());
$results[] = null;
}
}
5. Testing
Unit-Tests für Thread-Code sind schwierig. Unser Ansatz: Logic in pure functions isolieren, diese testen. Thread-Orchestrierung in Integration-Tests.
Tooling und Libraries
Das Ökosystem um parallel wächst. Hilfreiche Packages:
hschimpf/parallel-sdk – Wrapper mit besserer DX, Worker-Pools, Error-Handling
azjezz/psl – PHP Standard Library mit parallel-Utilities
clue/reactphp-block – Bridges zwischen ReactPHP und parallel
Checkt auch unsere GitHub-Repos bei nevercodealone.de für Community-Tools und Beispiele. Open Source ist unser Ding.
Fazit: Parallel ist kein Silver Bullet, aber ein wichtiges Tool
parallel/run in PHP 8 öffnet neue Möglichkeiten. Für CPU-intensive Tasks ist es game-changing. Aber es ist kein Ersatz für gute Architektur, effiziente Algorithmen und optimierte Datenbank-Queries.
Nutzt parallel wo es Sinn macht. Messt die Gains. Habt Fallbacks. Und fangt nicht an, alles zu parallelisieren – das macht Code komplexer ohne immer schneller zu sein.
Bei Never Code Alone haben wir über 15 Jahre Erfahrung mit Softwarequalität, Open Source und Remote Consulting. Wenn ihr Fragen zu parallel habt, eure Architektur optimieren wollt oder Unterstützung bei Performance-kritischen Projekten braucht: Schreibt uns an roland@nevercodealone.de. Wir helfen gerne!
Seid realistisch, messt genau, und parallelisiert smart. Das ist der nevercodealone-Weg.
