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.

Hidayet Doğan

December 12, 2020
Tweet

More Decks by Hidayet Doğan

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

  3. FERAGATNAME
    • Bilgisayar bilimcisi değilim
    • Birazdan bahsedeceğimiz muhtemel beyin yakıcı
    kavramlar konusunda uzman değilim

    View Slide

  4. ASENKRON
    Bir görevi durdurmadan/bekletmeden başka
    görevler yapmak

    Örnek: Kitap okurken çamaşır yıkamak

    View Slide

  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ş

    View Slide

  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

    View Slide

  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

    View Slide

  8. NASIL ASENKRON?
    • İşleri kuyruğa sok (queue).
    • Arka planda kuyrukları çalıştır (worker/consumer).

    View Slide

  9. NASIL ASENKRON?
    • Beanstalkd
    • Gearman
    • Redis
    • RabbitMQ
    • Veritabanı
    • AWS SQS

    View Slide

  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

    View Slide

  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)

    View Slide

  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

    View Slide

  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

    View Slide

  14. NASIL ASENKRON?
    • Cron, Kuyruk (queue)
    • Asenkron e-posta istemcisi, Thread, Child
    Process, Coroutine/Fiber

    View Slide

  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

    View Slide

  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?

    View Slide

  17. NASIL ASENKRON?
    • Cron, Kuyruk (queue)
    • Asenkron HTTP istemcisi, Thread, Child Process,
    Coroutine/Fiber

    View Slide

  18. NEREDE ASENKRON?
    Aptal Bot
    1. Müşteriye yanıt
    2. Müşteriye yanıt
    3. Müşteriye yanıt
    chat-bot.php

    View Slide

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

    View Slide

  20. NASIL ASENKRON?
    • AJAX? Long polling?
    • Ağ servisi (WebSocket, SSE)

    View Slide

  21. NASIL ASENKRON?
    • JavaScript

    async/await
    • Go

    go routines
    • C#

    async/await

    View Slide

  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

    View Slide

  23. REACTPHP
    • Non-Blocking I/O
    • Event Loop
    • Sunucu, İstemci, DNS Çözümleyici
    • Promise
    reactphp.org

    View Slide

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

    View Slide

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

    View Slide

  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()

    View Slide

  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()

    View Slide

  28. PROMISE?
    (Asenkron) işlemlerin olası sonuçlarını temsil eder.
    Durumlar

    * waiting/pending

    * resolved/success

    * failed/failure
    AKA: “Futures”

    View Slide

  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.

    View Slide

  30. Non-Blocking
    Event Loop
    Promise
    Coroutine
    Concurrency
    Parallel
    Multi-Process
    Thread

    View Slide

  31. KISS
    Senkron Programlama
    • İşlemi başlatırız.
    • Bitmesini bekleriz.
    • Sonraki işlemlere geçeriz.

    View Slide

  32. KISS
    Asenkron Programlama
    • İşlemi başlatırız.
    • Bitmesini beklerken başka işlemlere geçeriz.
    • Bitince bize haber verir. (callback/promise)

    View Slide

  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).

    View Slide

  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.

    View Slide

  35. pecl install swoole

    View Slide

  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

    View Slide

  37. Master
    Manager
    Worker Worker Task Worker Task Worker
    Reactor Reactor Timer
    Yapısı

    View Slide

  38. HTTP Sunucu

    View Slide

  39. WebSocket Sunucu

    View Slide

  40. Coroutine HTTP İstemci

    View Slide

  41. Channel

    View Slide

  42. WaitGroup

    View Slide

  43. • Global (variable scope), static (singleton)
    değişkenlere dikkat!
    • use Swoole\Table;
    • use Swoole\Atomic;
    • Blocking işlemlere dikkat!
    Uyarılar

    View Slide

  44. Table

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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ı

    View Slide

  50. Kullananlar

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide