Slide 1

Slide 1 text

SWOOLE İLE ASENKRON PHP HİDAYET DOĞAN

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

ASENKRON Bir görevi durdurmadan/bekletmeden başka görevler yapmak 
 Örnek: Kitap okurken çamaşır yıkamak

Slide 5

Slide 5 text

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ş

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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?

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

NASIL ASENKRON? • JavaScript
 async/await • Go
 go routines • C#
 async/await

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

PROMISE? (Asenkron) işlemlerin olası sonuçlarını temsil eder. Durumlar
 * waiting/pending
 * resolved/success
 * failed/failure AKA: “Futures”

Slide 29

Slide 29 text

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.

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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.

Slide 35

Slide 35 text

pecl install swoole

Slide 36

Slide 36 text

• 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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

HTTP Sunucu

Slide 39

Slide 39 text

WebSocket Sunucu

Slide 40

Slide 40 text

Coroutine HTTP İstemci

Slide 41

Slide 41 text

Channel

Slide 42

Slide 42 text

WaitGroup

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Table

Slide 45

Slide 45 text

• 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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

• 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ı

Slide 50

Slide 50 text

Kullananlar

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

DEMO http://swoole.hi.do

Slide 54

Slide 54 text

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