Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

How to parallelize in PHP and not go crazy

605 views

Published on

At Brno PHP April 2014 meetup by Martin Strouhal

Published in: Software
  • Be the first to comment

  • Be the first to like this

How to parallelize in PHP and not go crazy

  1. 1. Jak pararelizovat v PHP a nezbláznit se z toho Martin Strouhal SmartEmailing
  2. 2. K čemu to je?
  3. 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. 4. Kdy to má smysl? • Asynchronní úlohy – Akce po registraci na webu • Když proces na něco čeká – Typicky síťová komunikace
  5. 5. Možnosti pararelizace • Vlákna – PECL pthreads • Procesy – PCNTL • Pararelní běh několika skriptů – Cron, Task Scheduler
  6. 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. 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. 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. 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. 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. 11. Jak pararelizovat v PHP a nezbláznit se z toho? Nedělat to (-:
  12. 12. Dotazy?
  13. 13. Díky za pozornost! • www.smartemailing.cz • www.facebook.com/smartemailing

×