Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

MERHABA! • 1996 C ile soket servis
 Bulletin Board System (BBS), Multi User Dungeon (MUD)
 
 https://github.com/hdogan/HuskyBBS

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

SOKET? Ağ iletişimini temin eden uyarlama

Slide 8

Slide 8 text

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)

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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.


Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

İŞ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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

PHP İLE SOKET PROGRAMLAMA • Socket Eklentisi
 Düşük seviye, C tarzı • Streams Eklentisi
 Basit, PHP 5 ile dahili

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

PHP İLE SOKET PROGRAMLAMA SOCKET EKLENTİSİ

Slide 17

Slide 17 text

PHP İLE SOKET PROGRAMLAMA SOCKET EKLENTİSİ

Slide 18

Slide 18 text

PHP İLE SOKET PROGRAMLAMA SOCKET EKLENTİSİ

Slide 19

Slide 19 text

PHP İLE SOKET PROGRAMLAMA SOCKET EKLENTİSİ

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

PHP İLE SOKET PROGRAMLAMA STREAM EKLENTİSİ

Slide 22

Slide 22 text

PHP İLE SOKET PROGRAMLAMA STREAM EKLENTİSİ

Slide 23

Slide 23 text

PHP İLE SOKET PROGRAMLAMA STREAM EKLENTİSİ

Slide 24

Slide 24 text

PHP İLE SOKET PROGRAMLAMA STREAM EKLENTİSİ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

İŞ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)

Slide 31

Slide 31 text

İŞ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ı

Slide 32

Slide 32 text

İŞ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

Slide 33

Slide 33 text

İŞ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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

DEMO HTTP://DEMO.HI.DO

Slide 39

Slide 39 text

SORULAR?

Slide 40

Slide 40 text

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