SlideShare uma empresa Scribd logo
1 de 13
Jak pararelizovat v PHP
a nezbláznit se z toho
Martin Strouhal
SmartEmailing
K čemu to je?
Kdy to v PHP nemá smysl?
• Úlohy vytěžující procesor
– Lze zlepšit algoritmus?
– PHP je z principu pomalé
– Někdy je lepší změnit jazyk
Kdy to má smysl?
• Asynchronní úlohy
– Akce po registraci na webu
• Když proces na něco čeká
– Typicky síťová komunikace
Možnosti pararelizace
• Vlákna
– PECL pthreads
• Procesy
– PCNTL
• Pararelní běh několika skriptů
– Cron, Task Scheduler
PCNTL
• Pararelizace pomocí procesů
$pid = pcntl_fork();
if ($pid === -1) {
throw new RuntimeException('Cannot fork');
}
if ($pid) {
pcntl_wait($status); // we do not want zombies
}
else {
$this->runChild();
}
Problémy
• Obtížná komunikace mezi procesy
• Sdílené file descriptory
– SQLSTATE[HY000] [2013] Lost connection to MySQL server during query
– SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
private function runChild() {
$this->connection = new Connection(…);
}
Pararelní skripty
• Bez nutnosti speciálních rozšíření
– Stačí jen naplánovat úlohy
• Velmi omezené možnosti komunikace
– Databáze nebo soubor
Zásady pro práci s databází
• Transakce skoro nevyhnutelné
– Jaká úroveň izolace je třeba?
• Časté deadlocky
– Nutné s nimi počítat a umět je ustát
Deadlocky
private function getBatch() {
for ($i = 0; $i < 5; $i++) {
try {
$this->connection->beginTransaction();
$result = $this->fetchBatchAndDelete();
$this->connection->commit();
return $result;
}
catch (PDOException $e) {
$this->connection->rollBack();
sleep(rand(1, 3));
}
}
return false;
}
Jak pararelizovat v PHP
a nezbláznit se z toho?
Nedělat to (-:
Dotazy?
Díky za pozornost!
• www.smartemailing.cz
• www.facebook.com/smartemailing

Mais conteúdo relacionado

Destaque

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Péhápkaři
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPBrnoPHP
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Péhápkaři
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkMartin Zeman
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspectiveBrnoPHP
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clusterJakub Kulhan
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconVojta Svoboda
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJSJakub Nesetril
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowJakub Nesetril
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015David Grudl
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?David Grudl
 
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQLMike Crabb
 

Destaque (15)

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
 
Neo4j Jízdomat
Neo4j JízdomatNeo4j Jízdomat
Neo4j Jízdomat
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php framework
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspective
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
 
Asynchronně v PHP
Asynchronně v PHPAsynchronně v PHP
Asynchronně v PHP
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJS
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?
 
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
 

How to parallelize in PHP and not go crazy

  • 1. Jak pararelizovat v PHP a nezbláznit se z toho Martin Strouhal SmartEmailing
  • 3. Kdy to v PHP nemá smysl? • Úlohy vytěžující procesor – Lze zlepšit algoritmus? – PHP je z principu pomalé – Někdy je lepší změnit jazyk
  • 4. Kdy to má smysl? • Asynchronní úlohy – Akce po registraci na webu • Když proces na něco čeká – Typicky síťová komunikace
  • 5. Možnosti pararelizace • Vlákna – PECL pthreads • Procesy – PCNTL • Pararelní běh několika skriptů – Cron, Task Scheduler
  • 6. PCNTL • Pararelizace pomocí procesů $pid = pcntl_fork(); if ($pid === -1) { throw new RuntimeException('Cannot fork'); } if ($pid) { pcntl_wait($status); // we do not want zombies } else { $this->runChild(); }
  • 7. Problémy • Obtížná komunikace mezi procesy • Sdílené file descriptory – SQLSTATE[HY000] [2013] Lost connection to MySQL server during query – SQLSTATE[HY000]: General error: 2006 MySQL server has gone away private function runChild() { $this->connection = new Connection(…); }
  • 8. Pararelní skripty • Bez nutnosti speciálních rozšíření – Stačí jen naplánovat úlohy • Velmi omezené možnosti komunikace – Databáze nebo soubor
  • 9. Zásady pro práci s databází • Transakce skoro nevyhnutelné – Jaká úroveň izolace je třeba? • Časté deadlocky – Nutné s nimi počítat a umět je ustát
  • 10. Deadlocky private function getBatch() { for ($i = 0; $i < 5; $i++) { try { $this->connection->beginTransaction(); $result = $this->fetchBatchAndDelete(); $this->connection->commit(); return $result; } catch (PDOException $e) { $this->connection->rollBack(); sleep(rand(1, 3)); } } return false; }
  • 11. Jak pararelizovat v PHP a nezbláznit se z toho? Nedělat to (-:
  • 13. Díky za pozornost! • www.smartemailing.cz • www.facebook.com/smartemailing