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

PHP ile Soket Programlama ve Ağ Servisleri

PHP ile Soket Programlama ve Ağ Servisleri

PHP ile soket programlama nasıl yapılır, ağ servisleri nasıl oluşturulabilir, günümüzde adını sıkça duyduğumuz WebSocket ve gerçek zamanlı web uygulamalarını PHP ile nasıl geliştirebiliriz gibi soruların yanıtlarını alıp, bunlar için geliştirilen kütüphane ve eklentileri tanıyacağız.

Hidayet Doğan

July 25, 2015
Tweet

More Decks by Hidayet Doğan

Other Decks in Programming

Transcript

  1. PHP İLE SOKET PROGRAMLAMA
    & AĞ SERVİSLERİ
    HİDAYET DOĞAN

    View full-size slide

  2. MERHABA!
    • 1995 programlama ile tanışma
    • 1998 yılından itibaren PHP
    • 1999 yılından itibaren iş hayatı
    • 1998 (ya da 1999) yılından
    itibaren ögrenci
    • Kurucu Ortak & Yazılım Uzmanı

    @ Yazılım Parkı
    • Yazılım Uzmanı

    @ İ. D. Bilkent Üniversitesi
    Fotoğraf: Onur Canalp

    View full-size slide

  3. MERHABA!
    • 1996 C ile soket servis

    Bulletin Board System (BBS), Multi User Dungeon
    (MUD)


    https://github.com/hdogan/HuskyBBS

    View full-size slide

  4. FERAGATNAME
    • Ağ uzmanı değilim
    • Soket programlama
    uzmanı değilim
    • C uzmanı değilim
    • Linux kernel uzmanı
    değilim

    View full-size slide

  5. KISALTMALAR
    • IP: Internet Protocol

    Veri paketlerini (datagram) karşı tarafa aktarma
    • TCP: Transmission Control Protocol

    Teslim edilecek veri paketlerin bütünlüğünü doğrulama

    Örnek: HTTP, WebSocket
    • UDP: User Datagram Protocol

    Düşük gecikmeli, veri paketi teslimatı garantisiz

    Örnek: DNS

    View full-size slide

  6. TANIMLAR
    • IP Adresi

    Ağda bulunan sunucunun/aygıtın kimliği

    Örnek: 8.8.4.4, 127.0.0.1, ff02::1,
    2001:0db8:85a3:0000:0000:8a2e:0370:7334
    • Port Numarası

    Ağ servisinin sunucu/aygıt üzerindeki kimliği

    Örnek: 80, 443, 53, 143, 993, 65535

    View full-size slide

  7. SOKET?
    Ağ iletişimini temin eden uyarlama

    View full-size slide

  8. SOKET?
    Servis
    IP: 203.0.113.1
    Port: 80
    İstemci #1
    IP: 192.0.2.1
    Port: 56910
    İstemci #2
    IP: 198.51.100.35
    Port: 25612
    Soket (Priz)
    Soket (Priz)
    Veri Akışı (Fiş)
    Soket (Priz)

    View full-size slide

  9. VERİ AKIŞI
    • Simplex

    Tek yönlü, yanıt almaya ihtiyaç duymayan

    Örnek: Yangın alarmı
    • Half-Duplex

    Çift yönlü, fakat akış bir seferde tek bir yöne

    Örnek: Faks
    • Full-Duplex

    Çift yönlü, akış aynı anda tüm yönlere

    Örnek: Telefon

    View full-size slide

  10. KİPLER
    BLOCKING & 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.


    View full-size slide

  11. OLAYLARI YÖNETMEK
    • 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ı?

    View full-size slide

  12. İŞLEYİŞ (TCP AĞ SERVİSİ)
    1. Soket oluştur (Socket)
    2. IP ve Port belirle (Bind)
    3. Dinle (Listen)
    4. Everything is something happened?

    (select, poll, epoll, kqueue)
    5. Yeni bir bağlantı mı var? (Accept)
    6. Oku / Yaz / Bağlantıyı kapat (Read / Write / Close)
    7. Goto 4

    View full-size slide

  13. PHP İLE SOKET PROGRAMLAMA
    “PHP ile soket programlama mı olur ya.”
    –Troll Dayı
    “Hafıza kaçakları var, çatlıyor, patlıyor.”
    –Fosil Dayı

    View full-size slide

  14. PHP İLE SOKET PROGRAMLAMA
    • Socket Eklentisi

    Düşük seviye, C tarzı
    • Streams Eklentisi

    Basit, PHP 5 ile dahili

    View full-size slide

  15. PHP İLE SOKET PROGRAMLAMA
    SOCKET EKLENTİSİ
    1. Soket oluştur: socket_create()
    2. IP ve Port belirle: socket_bind()
    3. Dinle: socket_listen()
    4. Everything is something happened? socket_select()
    5. Yeni bağlantıyı kabul et: socket_accept()
    6. Oku / Yaz / Bağlantıyı kapat:

    socket_read() socket_write() socket_close()

    View full-size slide

  16. PHP İLE SOKET PROGRAMLAMA
    SOCKET EKLENTİSİ

    View full-size slide

  17. PHP İLE SOKET PROGRAMLAMA
    SOCKET EKLENTİSİ

    View full-size slide

  18. PHP İLE SOKET PROGRAMLAMA
    SOCKET EKLENTİSİ

    View full-size slide

  19. PHP İLE SOKET PROGRAMLAMA
    SOCKET EKLENTİSİ

    View full-size slide

  20. PHP İLE SOKET PROGRAMLAMA
    STREAM EKLENTİSİ
    1. Soket oluştur: stream_socket_server()
    2. IP ve Port belirle: stream_socket_server()
    3. Dinle: stream_socket_server()
    4. Everything is something happened? stream_select()
    5. Yeni bağlantıyı kabul et: stream_accept()
    6. Oku / Yaz / Bağlantıyı kapat: fread() fwrite() fclose()

    View full-size slide

  21. PHP İLE SOKET PROGRAMLAMA
    STREAM EKLENTİSİ

    View full-size slide

  22. PHP İLE SOKET PROGRAMLAMA
    STREAM EKLENTİSİ

    View full-size slide

  23. PHP İLE SOKET PROGRAMLAMA
    STREAM EKLENTİSİ

    View full-size slide

  24. PHP İLE SOKET PROGRAMLAMA
    STREAM EKLENTİSİ

    View full-size slide

  25. WEBSOCKET
    HTML 5 protokolü
    TCP üzerinden Full-Duplex istemci / sunucu iletişimi
    RFC 6455 ile tanımlı

    View full-size slide

  26. WEBSOCKET
    • Düşük gecikme süresi, az masraflı
    • Cross Origin
    • AJAX, Long-Polling, Flash Socket yerine
    • Kalıcı bağlantı
    • HTTP üzerinden el sıkışıp

    View full-size slide

  27. WEBSOCKET
    SUNUCU
    TARAYICI
    HTTP
    HTTP
    WebSocket
    WebSocket
    WebSocket’e geçiş yapalım.
    (Upgrade)
    Tabiki. Artık benimle WebSocket
    üzerinden iletişim kuracaksın.
    Nörüyon?
    (0x00 0xff …)
    Nöriym, sen nörüyon?
    (0x00 0xff …)

    View full-size slide

  28. WEBSOCKET
    • Safari 7+
    • Chrome 16+
    • Opera 12.1+ (ve
    Mobile)
    • Firefox 11+
    • Internet Explorer 10+
    • iOS Safari/Chrome 6.1+
    • Andoid Browser 4.4+
    • BlackBerry Browser 7+
    • Opera Mobile 12.1+
    • Firefox Android 38+
    • IE Mobile 10+
    Kaynak: caniuse.com

    View full-size slide

  29. PHP İLE WEBSOCKET SERVİSİ
    “Haydi socket veya stream eklentisi ile yapalım.”
    “Epik facia…”

    View full-size slide

  30. İŞLERİ KOLAYLAŞTIRALIM
    DİĞERLERİ
    • Ruby: EventMachine
    • Python: Twisted, Tornado
    • JavaScript: Node.js, io.js
    • Java: Apache Mina, Netty
    • C: Libevent, Libev, Libuv
    • C#: Reactive Extensions (Rx)

    View full-size slide

  31. İŞLERİ KOLAYLAŞTIRALIM
    PHP
    • libevent Eklentisi:

    C libevent kütüphanesi uyarlaması
    • event Eklentisi:

    C libevent kütüphanesi uyarlaması, nesneye dayalı,
    asenkron DNS çözümleyici, HTTP servisi/istemcisi
    • ev Eklentisi:

    C libev kütüphanesi uyarlaması, nesneye dayalı

    View full-size slide

  32. İŞLERİ KOLAYLAŞTIRALIM
    PHP
    • libuv Eklentisi:

    C libuv kütüphanesi uyarlaması, deneysel, temel
    ağ servisi/istemcisi
    • swoole Eklentisi:

    Made in China, Tencent, nesneye dayalı, temel ağ
    servisi, HTTP servisi, WebSocket servisi

    View full-size slide

  33. İŞLERİ KOLAYLAŞTIRALIM
    PHP
    • React:

    stream, libevent, event, ev, temel ağ servisi/
    istemcisi, HTTP servisi/istemcisi
    • Ratchet:

    React ile WebSocket servisi
    • Workerman:

    Made in China, stream, libevent, temel ağ servisi,
    HTTP servisi, WebSocket servisi

    View full-size slide

  34. PHP İLE WEBSOCKET SERVİSİ
    “Ratchet ile yapalım…”

    View full-size slide

  35. PHP İLE WEBSOCKET SERVİSİ
    “Ratchet ile yapalım…”

    View full-size slide

  36. PHP İLE WEBSOCKET SERVİSİ
    “Swoole eklentisi ile yapalım…”

    View full-size slide

  37. PHP İLE WEBSOCKET SERVİSİ
    “Workerman ile yapalım…”

    View full-size slide

  38. DEMO
    HTTP://DEMO.HI.DO

    View full-size slide

  39. TEŞEKKÜRLER!
    KAYNAKLAR
    • reactphp.org
    • socketo.me (Ratchet)
    • swoole.com
    • workerman.net
    • hoa-project.net
    HI.DO
    • http://hi.do
    • @hdogan
    • github.com/hdogan
    • speakerdeck.com/hdogan
    • tr.linkedin.com/in/hdogan
    https://github.com/hdogan/phpkonf-2015-demos

    View full-size slide