Merhaba. Bu yayınım aslında sadece bir çeviri yayını olacak. Çevirisini yapacağım site: socketo.me adlı site. Bu sitede Ratched adlı bir proje tanıtılıyor. O halde bırakalım, site kendini anlatsın:
"Yeni akış"ı anladığınızda olay tabanlı programlama yapmak, geleneksel HTTP request/response tabanlı programlamadan yapmaktan daha hızlı ve kolaydır.
Ratchet, WebSockets destekleyen tarayıcılarda (Chrome, Safari, Firefox, Opera) tüm testlerden geçti.
Web siteleri kim olduğunuzu çerezler (cookie) aracılığıyla bilir. Cookie'ler sunucuya her istekte "hey benim ben, geçen seferki aynı adam!" derler. Ama bu cookie'ler güvenlik açıklarına neden olurlar (güvenlik önlemleri alınmazsa).
Tüm iletişim istemci bilgisayar tarafından başlatılır ve her bir durumsuz istek/yanıt tektir.
Ancak sunucu teknolojisi, tarayıcı teknolojisi kadar hızlı gelişmemişti. İşte bu noktada Ratchet geldi. Ratchet bileşenleri full stack bir sunucu oluşturabilir. Bir Ratchet I/O Sunucu Bileşeni, Ratchet WebSocket protokol yorumlayıcısı kurabilirsiniz ve sunucu tarafındaki şeylerin WebSocket desteğiyle birlikte yapılmasını sağlayabilirsiniz.
Composer, projenizdeki harici PHP kütüphanelerini yönetebilmeniz için yazılmış bir uygulamadır. Ratchet çalışmak için React, Guzzle ve Symfony2'nin HttpFoundation'ını gerektirir. Ratchet'i indirmek, sonra da onu çalıştırmak için bu üç kütüphaneyi indirmek çok yorucu olurdu. Oh, doğru sürümleri indirdiğinizden de emin olmalısınız. Ama Composer sayesinde bunun için endişelenmenize gerek yok!
Composer'ın 1 kolay adımda nasıl kurulduğunu öğrenin.
Sisteminize bir kez composer.phar'ı kurduktan sonra (bu dokümantasyonda projenizin ana dizininde olduğunuzu varsayıyoruz) bu sayfanın ilk bölümündeki talimatı (komut istemcinizde uygulamanızın ana dizinine gittikten sonra) uygulayın.
Artık Ratchet kullanmaya hazırsınız! Ratchet'i uygulamanıza almak için dosyanızın en üstüne şu kodu ekleyerek Ratchet'i include edebilirsiniz:
Her şeyi MyApp namespace'si altında tutacağız. Composer dosyanız aşağıdaki gibi görünmeldir:
Bu class'ı, kök klasörünüzdeki src klasörünün altına Chat.php adıyla kaydedin. Buraya yakında yine döneceğiz.
Bu script'i de src/bin/ klasörü içine chat-server.php adıyla kaydedin. Şimdi terminalinizde aşağıdaki komutla çalıştırabilirsiniz:
Sohbet sınıfımıza biraz mantık ekleyelim. Yapacağımız şey, mesaj göndermek için tüm connection'ları takip etmektir. Bunun için SplObjectStorage diye bi'şey kullanacağız. Bu saklama container'ı, gelen hangi bağlantının ne olduğunu verisini nesnesini tutmak için oluşturulmuştur.
Yoruldum. Devam ettikçe yayını güncelleyeceğim.
boş
boş'un altıhttp://socketo.me
Ratchet
PHP için WebSockets
Ratchet, geliştiricilere WebSockets üzerinden istemci-sunucu arasında gerçek zamanlı, iki yönlü uygulamalar oluşturmak için araçlar sağlayan bir PHP kütüphanesidir. Artık internet, dedenin zamanındaki internet değil.Hızlı & Kolay
Birkaç dakika içinde kendi chat uygulamanızı (diğer adıyla "Merhaba Dünya") yazın."Yeni akış"ı anladığınızda olay tabanlı programlama yapmak, geleneksel HTTP request/response tabanlı programlamadan yapmaktan daha hızlı ve kolaydır.
Bileşenler
Ratchet işlevsellik ekleyebilmeniz için kolayca bulup seçebileceğiniz bileşenler sağlar.Uyumluluk
Ratchet tamamen PSR-4 (PHP kullanım standartları) uyumludur. Böylece diğer kodlarınızla iyi geçinir. Symfony2 bileşenlerinden yararlanarak birçok kişiyle benzer geliştirme ortamı sağlar.Ratchet, WebSockets destekleyen tarayıcılarda (Chrome, Safari, Firefox, Opera) tüm testlerden geçti.
http://socketo.me/docs
WebSocket'lere Giriş
(Web hakkında) Bildiğiniz Her Şey Yanlış
Durumsuzluk. http://socketo.me/docs/hello-world'e bir istek atsanız ne olur? Tarayıcınız socketo.me üzerinde 80 portuna bağlantı noktası açar, sunucuya (Apache/Nginx) bir HTTP header ile isteği gönderir, sunucu da bu mesajı ara belleğe (tampona) alır ve sunucu uygulamasına gönderir. Sunucu uygulaması bu istekle ne yapacağına karar verir, verileri alır, bir HTML kodu oluşturur ve sunucuya (Apache/Nginx) geri gönderir. O da içeriğe uygun bir HTTP header ekleyip tarayıcıya geri gönderir ve bağlantı kapanır.Web siteleri kim olduğunuzu çerezler (cookie) aracılığıyla bilir. Cookie'ler sunucuya her istekte "hey benim ben, geçen seferki aynı adam!" derler. Ama bu cookie'ler güvenlik açıklarına neden olurlar (güvenlik önlemleri alınmazsa).
Tüm iletişim istemci bilgisayar tarafından başlatılır ve her bir durumsuz istek/yanıt tektir.
WebSockets ile Tanışın
WebSocket'ler tarayıcılala sunucu arasında iki yönlü ve kalıcı bağlantılardır. Bir websocket bağlantısı kurulduğunda istemci ve sunucu arasındaki bağlantı, ikisinden biri bu bağlantıyı kapatmaya kalkana kadar açık kalır. Bu açık bağlantı sayesinde istemci ve sunucu birbirlerine istedikleri zaman mesaj gönderebilirler. Bu da web programlamayı tamamen olay odaklı bir yapıya çevirir, yalnızca istemcinin isteklerine odaklı değildir. Bu durumludur. Ayrıca şu anda çalışan tek bir sunucu uygulaması kendisine bağlı olan tüm istemcileri farkındadır, herhangi bir zamanda herhangi bir açık bağlantıyla iletişim kurabilir.Durum (Status)
İstemci tarafında zaten Chrome, Firefox, Opera ve Safari (mobil Safari de dahil) içinde dahili olarak vardır. Internet Explorer cephesinde de IE10'da eklenti olarak kullanılabilir ama bu yine de prototip olarak kabul edilebilir. Ek olarak, websockets özelliğini desteklemeyen herhangi bir tarayıcı da bir Flash polyfill kullanabilir.Ancak sunucu teknolojisi, tarayıcı teknolojisi kadar hızlı gelişmemişti. İşte bu noktada Ratchet geldi. Ratchet bileşenleri full stack bir sunucu oluşturabilir. Bir Ratchet I/O Sunucu Bileşeni, Ratchet WebSocket protokol yorumlayıcısı kurabilirsiniz ve sunucu tarafındaki şeylerin WebSocket desteğiyle birlikte yapılmasını sağlayabilirsiniz.
http://socketo.me/docs/install
Kurulum
Composer
Ratchet kullanmanın en iyi (ve şu anda tek) yolu Composer kullanmaktır. Şu şekilde Ratchet'i kolayca ekleyin:php ~/composer.phar require cboden/ratchet
Dur, Ne?
Composer'e aşina olmayan var mı? PHP için Composer, ekmeğin dilimlenmesinden sonra en büyük şey.Composer, projenizdeki harici PHP kütüphanelerini yönetebilmeniz için yazılmış bir uygulamadır. Ratchet çalışmak için React, Guzzle ve Symfony2'nin HttpFoundation'ını gerektirir. Ratchet'i indirmek, sonra da onu çalıştırmak için bu üç kütüphaneyi indirmek çok yorucu olurdu. Oh, doğru sürümleri indirdiğinizden de emin olmalısınız. Ama Composer sayesinde bunun için endişelenmenize gerek yok!
Composer'ın 1 kolay adımda nasıl kurulduğunu öğrenin.
Sisteminize bir kez composer.phar'ı kurduktan sonra (bu dokümantasyonda projenizin ana dizininde olduğunuzu varsayıyoruz) bu sayfanın ilk bölümündeki talimatı (komut istemcinizde uygulamanızın ana dizinine gittikten sonra) uygulayın.
Artık Ratchet kullanmaya hazırsınız! Ratchet'i uygulamanıza almak için dosyanızın en üstüne şu kodu ekleyerek Ratchet'i include edebilirsiniz:
<?php require __DIR__ . '/vendor/autoload.php';
http://socketo.me/docs/hello-world
İlk Uygulamanızı Oluşturun
Hedef
Hedef basit bir chat uygulamazı yazmak. Olay tabanlı programlamaya "Merhaba Dünya" demek için genellikle chat uygulaması yapılır. Chat, gelen tüm mesajları alıp diğer kullanıcılara iletecek.Chat Sınıfı
Not: Bu içerik PSR-4 ve Composer hakkında bilgi sahibi olduğunuzu varsayarak hazırlanmıştır. Henüz kurulum yapmadıysanız kurulum sayfasını inceleyin.Her şeyi MyApp namespace'si altında tutacağız. Composer dosyanız aşağıdaki gibi görünmeldir:
{ "autoload": { "psr-4": { "MyApp\\": "src" } }, "require": { "cboden/ratchet": "^0.4" } }İşe bir sınıf oluşturarak başlayacağız. Bu sınıf chat "uygulamamız" olacak. Bu temel uygulama 4 olayı dinleyecektir:
- onOpen: Yeni bir istemci bağlandığında çalışır.
- onMessage: Bir bağlantı (connection) tarafından mesaj alındığında çalışır.
- onClose: Bir bağlantı kapatıldığında çalışır.
- onError: Bağlantıda bir hata oluştuğunda çalışır.
Bu olaylar tetiklendiğinde uygulamamız MessageComponentInterface'i kullanacak.
<?php namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { } public function onMessage(ConnectionInterface $from, $msg) { } public function onClose(ConnectionInterface $conn) { } public function onError(ConnectionInterface $conn, \Exception $e) { } }Fark edeceğiniz gibi MessageComponentInterface'teki fonksiyonları kullanmanın yanı sıra uygulamamıza bir namespace (MyApp) verdik ve ConnectionInterface sınıfını da çağırdık. Bu sınıf, genellikle Connection örneği sağlar. Connection, soketin diğer tarafındaki başka bir istemciyi temsil eder. Yukarıda bahsettiğimiz, olayları gerçekleşince tetiklenen 4 fonksiyonun her biri bu Connection verisini ($conn) almaktadır.
Bu class'ı, kök klasörünüzdeki src klasörünün altına Chat.php adıyla kaydedin. Buraya yakında yine döneceğiz.
Destekleme
Chat class'ımız, uygulama mantığımız olacaktır. Sonra shell script'imizle birleştireceğiz. Uygulamamızı başlatmak için komut satırında arayacağımız dosya/script budur.<?php use Ratchet\Server\IoServer; use MyApp\Chat; require dirname(__DIR__) . '/vendor/autoload.php'; $server = IoServer::factory( new Chat(), 8080 ); $server->run();Burada, bir I/O(Input/Output) sınıfı çağırıp kullandığımızı görüyorsunuz. Bu sınıf, kurulan tüm connection'ları saklar, her connection'la aramızda gönderilen verilere aracılık eder ve hataları yakalar. Bunları, new Chat() ile oluşturulan Chat sınıfı nesnesine gönderir. Son olarak da sunucuya bir olay döngüsüne girmesini ve 8080 numaralı bağlantı port'undan gelen istekleri dinlemesini söylüyoruz.
Bu script'i de src/bin/ klasörü içine chat-server.php adıyla kaydedin. Şimdi terminalinizde aşağıdaki komutla çalıştırabilirsiniz:
$ php bin/chat-server.phpScript şimdi terminalinizde çalışmaya başlamış olmalı. Henüz işimiz bitmediği için terminalinizde işlemi iptal edebilirsiniz.
Mantık
Şu ana kadar sadece hem shell script'imizdeki hem de Chat class'ımızdaki yapıyı kurduk. Şimdi, uygulamamızı tamamlamak için Chat'imize kod ekleyebiliriz.Sohbet sınıfımıza biraz mantık ekleyelim. Yapacağımız şey, mesaj göndermek için tüm connection'ları takip etmektir. Bunun için SplObjectStorage diye bi'şey kullanacağız. Bu saklama container'ı, gelen hangi bağlantının ne olduğunu verisini nesnesini tutmak için oluşturulmuştur.
<?php namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { // yeni connection'ı, daha sonra mesaj göndermek üzere sakla $this->clients->attach($conn); echo "Yeni bağlantı! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { $numRecv = count($this->clients) - 1; echo sprintf( '%d bağlantısı diğer %s adet bağlantıya "%m" mesajını gönderiyor.\n', $from->resourceId, $numRecv, $msg ); foreach ($this->clients as $client) { if($from !== $client) { // Mesajı gönderen istemci hariç, mesajı tüm connection'lara ilet $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { // Connection kapandı. Artık ona mesaj gönderemeyeceğimiz için onu sil. $this->clients->detach($conn); echo "{$conn->resourceId} bağlantısı ayrıldı.\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "Bir hata oluştu: {$e->getMessage()}.\n"; $conn->close(); } }
Çalışıyor
Tamamlandı. Hadi çalıştıralım ve test edelim:$ php bin/chat-server.php
$ telnet localhost 8080
$ telnet localhost 8080Telnet pencerelerinin her birine bir mesaj yazın ("merhaba dünya") ve mesajınızın diğerlerinde göründüğünü görün!
Sonraki Adımlar
Artık çalışan bir chat uygulamasına temel olarak sahip olduğumuza göre bunu bir web tarayıcısında (Chrome, Firefox veya Safari [şimdilik]) çalıştıralım. Öncelikle, chat-server.php script'imize geri dönelim. Şimdi Ratchet'in başka bir bileşenini kullanacağız: WsServer sınıfı:<?php use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use MyApp\Chat; require dirname(__DIR__) . '/vendor/autoload.php'; $server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080 ); $server->run();Shell script'i tekrar çalıştırın, birkaç web tarayıcı penceresi açın ve aşağıdaki Javascript kodunu çalıştırmak üzere console ekranını açın:
var conn = new WebSocket('ws://localhost:8080'); conn.onopen = function(e) { console.log("Bağlantı kuruldu!"); }; conn.onmessage = function(e) { console.log(e.data); };"Bağlantı kuruldu!" konsol mesajını gördüğünüzde sayfaya bağlı diğer tarayıcılara mesaj göndermeye başlayabilirsiniz. Konsol ekranına şunu yazın:
conn.send('Hello World!');
Yorumlar
Yorum Gönder