Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swoole ile Asenkron PHP

Swoole ile Asenkron PHP

Swoole, PHP ile "asenkron", eş zamanlı ve ağ servisleri uygulamalarını hızlı ve kolayca geliştirmemize yardımcı olan ve eklenti olarak gelen yüksek performans bir kütüphanedir. Oturumda "Asenkron" ve "Ağ Servisleri" gibi temelde bilinmesi gereken konulara değinip bu tarz uygulamaları PHP ile geliştirmek için var olan çözüm ve kütüphanelere göz atıp, Swoole eklentisi ile bunları biraz daha derinlemesine irdeleyeceğiz.

D55de538259751cc08d16a0843e1c69f?s=128

Hidayet Doğan

December 12, 2020
Tweet

Transcript

  1. SWOOLE İLE ASENKRON PHP HİDAYET DOĞAN

  2. MERHABA! • 1995 programlama ile tanışma • 1998 yılından itibaren

    PHP • Kurucu Ortak & Yazılım Uzmanı
 @ Yazılım Parkı • Yazılım Uzmanı
 @ İ. D. Bilkent Üniversitesi Fotoğraf: Onur Canalp
  3. FERAGATNAME • Bilgisayar bilimcisi değilim • Birazdan bahsedeceğimiz muhtemel beyin

    yakıcı kavramlar konusunda uzman değilim
  4. ASENKRON Bir görevi durdurmadan/bekletmeden başka görevler yapmak 
 Örnek: Kitap

    okurken çamaşır yıkamak
  5. NEREDE ASENKRON? • Web
 Dosya (video, PDF, imaj) işleme, e-posta

    gönderme • CLI (Command Line Interface)
 Çoklu dosya indirme, ağ servisleri, her türlü ağır iş
  6. NEREDE ASENKRON? mpm_prefork nginx mod_php php-fpm Tarayıcı İstek Yanıt Veritabanı

    işi E-posta işi Video çevirme işi 0.01sn 5 dk 30 dk ±35 dk
  7. NEREDE ASENKRON? mpm_prefork nginx mod_php php-fpm Tarayıcı İstek Yanıt Veritabanı

    işi E-posta işi Video çevirme işi ±0.01sn
  8. NASIL ASENKRON? • İşleri kuyruğa sok (queue). • Arka planda

    kuyrukları çalıştır (worker/consumer).
  9. NASIL ASENKRON? • Beanstalkd • Gearman • Redis • RabbitMQ

    • Veritabanı • AWS SQS
  10. NASIL ASENKRON? mpm_prefork nginx mod_php php-fpm Tarayıcı İstek Yanıt +

    Bağlantıyı Kes die(“PHP sonlandı, hafıza temizlendi.”) E-posta işi Video çevirme işi Kuyruk
  11. NASIL ASENKRON? • İşleri kuyruğa sok (queue). • Arka planda

    kuyrukları çalıştır (worker/consumer). • İşin durumunu aralıklarla sor (AJAX) • İşin durumu sana iletilsin (SSE, WebSocket)
  12. NEREDE ASENKRON? Toplu e-posta gönderme E-posta gönder E-posta gönder E-posta

    gönder 1 sn 1.2 sn 0.9 sn 3.1 sn e-posta-gonderici.php
  13. NEREDE ASENKRON? Toplu e-posta gönderme E-posta gönder E-posta gönder E-posta

    gönder 1 sn 1.2 sn 0.9 sn ±1.2 sn e-posta-gonderici.php
  14. NASIL ASENKRON? • Cron, Kuyruk (queue) • Asenkron e-posta istemcisi,

    Thread, Child Process, Coroutine/Fiber
  15. NEREDE ASENKRON? Web Sayfasına Erişiliyor Mu? HTTP istemci HTTP istemci

    HTTP istemci 0.12 sn 1.3 sn 0.8 sn 2.22 sn web-erisim-kontrol.php
  16. NEREDE ASENKRON? HTTP istemci HTTP istemci HTTP istemci 0.12 sn

    1.3 sn 0.8 sn ±1.3 sn web-erisim-kontrol.php Web Sayfasına Erişiliyor Mu?
  17. NASIL ASENKRON? • Cron, Kuyruk (queue) • Asenkron HTTP istemcisi,

    Thread, Child Process, Coroutine/Fiber
  18. NEREDE ASENKRON? Aptal Bot 1. Müşteriye yanıt 2. Müşteriye yanıt

    3. Müşteriye yanıt chat-bot.php
  19. NEREDE ASENKRON? Akıllı Bot 1. Müşteriye yanıt 2. Müşteriye yanıt

    3. Müşteriye yanıt chat-bot.php
  20. NASIL ASENKRON? • AJAX? Long polling? • Ağ servisi (WebSocket,

    SSE)
  21. NASIL ASENKRON? • JavaScript
 async/await • Go
 go routines •

    C#
 async/await
  22. NASIL ASENKRON? “PHP ile asenkron kod mu yazılır ya.” –

    <?=date('Y') ?> Yılında Yeni Çıkmış "Hype" Programlama Diline Gönül Verip Macbook’unu Etiketle Dolduranlar Derneği
  23. REACTPHP • Non-Blocking I/O • Event Loop • Sunucu, İstemci,

    DNS Çözümleyici • Promise reactphp.org
  24. AMP • Non-Blocking I/O • Event Loop • Sunucu, Asenkron

    İstemci, DNS Çözümleyici • Parallel Processing, Promise, Coroutine amphp.org
  25. SWOOLE • Non-Blocking I/O • Event Loop • Sunucu, İstemci,

    DNS Çözümleyici • Parallel Processing, Coroutine swoole.co.uk
  26. EVENT LOOP? • select (Linux, Windows) • poll (Solaris) •

    epoll (Linux) • kqueue (BSD, Mac) Okuyacak/gönderilecek veri var mı? Hata oluştu mu? Zaman aşımı var mı? stream_select() / socket_select()
  27. NON-BLOCKING? • Blocking Kipi
 Programın işleyişi işlemler (I/O, bağlantı kurma/

    kabul etme gibi) bitene kadar bekler. • Non-Blocking Kipi
 İşlemler anında yanıt döner. Bittiğinde programa haber/sinyal verilir. PHP’de işlemler aksi belirtilmedikçe BLOCKING (işlemin bitmesi beklenir) stream_set_blocking() / socket_set_(non)block()
  28. PROMISE? (Asenkron) işlemlerin olası sonuçlarını temsil eder. Durumlar
 * waiting/pending


    * resolved/success
 * failed/failure AKA: “Futures”
  29. COROUTINE? • Kanal (channel) aracılığı ile haberleşme (IPC) • AKA:

    "Fiber", "lightweight thread" • Jonglörün topları çevirmesi Araya girilebilen, asenkron işler yapmamızı sağlayan fonksiyonlar/arayüzler.
  30. Non-Blocking Event Loop Promise Coroutine Concurrency Parallel Multi-Process Thread

  31. KISS Senkron Programlama • İşlemi başlatırız. • Bitmesini bekleriz. •

    Sonraki işlemlere geçeriz.
  32. KISS Asenkron Programlama • İşlemi başlatırız. • Bitmesini beklerken başka

    işlemlere geçeriz. • Bitince bize haber verir. (callback/promise)
  33. KISS Asenkron Programlama • Ayrı bir “thread” veya “process” ile

    uygulanmış olabilir. • Tek “process” ile event loop üzerinde uygulanmış olabilir. • Uygulama detayları kullanıcıdan soyutlanır (kullanımı basitleştirilir, coroutine, async/ await).
  34. KISS Asenkron Programlama • PHP’de işlemler aksi belirtilmedikçe BLOCKING (işlemin

    bitmesi beklenir) • PHP’de ek kütüphane veya eklentilerle asenkron programlama yapabiliriz. • Asenkron işlemler içinde BLOCKING işlemlerden kaçınılır.
  35. pecl install swoole

  36. • Asenkron dosya işlemleri • Coroutines • HTTP, HTTP/2, WebSocket,

    Redis, TCP/UDP ağ sunucuları • HTTP, HTTP/2, WebSocket, Redis, MySQL, PostgreSQL, DNS, TCP/UDP istemcileri • SSL/TLS Özellikleri
  37. Master Manager Worker Worker Task Worker Task Worker Reactor Reactor

    Timer Yapısı
  38. HTTP Sunucu

  39. WebSocket Sunucu

  40. Coroutine HTTP İstemci

  41. Channel

  42. WaitGroup

  43. • Global (variable scope), static (singleton) değişkenlere dikkat! • use

    Swoole\Table; • use Swoole\Atomic; • Blocking işlemlere dikkat! Uyarılar
  44. Table

  45. • PHP 7.4 + Swoole 4.5 • NodeJS 12 ("http")

    • Go 1.14 ("net/http") Benchmark (HTTP Sunucu) ab -c 500 -n 500000 • CPU: 8 core (Intel Xeon) • RAM: 16GB • Ubuntu 18.04 LTS https://medium.com/@rioastamal/benchmark-php-swoole-vs-nodejs-vs-go-539a5493b067
  46. https://medium.com/@rioastamal/benchmark-php-swoole-vs-nodejs-vs-go-539a5493b067

  47. https://medium.com/@rioastamal/benchmark-php-swoole-vs-nodejs-vs-go-539a5493b067

  48. https://medium.com/@rioastamal/benchmark-php-swoole-vs-nodejs-vs-go-539a5493b067

  49. • Laravel
 https://github.com/swooletw/laravel-swoole
 https://github.com/hhxsv5/laravel-s • Symfony
 https://github.com/k911/swoole-bundle • PSR Middleware


    https://github.com/imefisto/psr-swoole-native
 https://github.com/mezzio/mezzio-swoole • Siler
 https://siler.leocavalcante.dev/swoole Diğerleri ile Kullanımı
  50. Kullananlar

  51. 拉屎! Belge ve Kaynaklar swoole.com swoole.co.uk

  52. Belge ve Kaynaklar https://gumroad.com/l/swoolebook/PHPKonf PHPKonf'a özel %40 indirim 25 Aralık'a

    kadar
  53. DEMO http://swoole.hi.do

  54. TEŞEKKÜRLER! KAYNAKLAR • swoole.co.uk • reactphp.org • amphp.org Hİ.DO •

    http://hi.do • @hdogan • github.com/hdogan • speakerdeck.com/hdogan • tr.linkedin.com/in/hdogan