Php ve Socket.io kullanarak Real Time haberleşme

Php ve socketio kullanarak realtime haberleşme veri alma ve gönderme işlemini uygulamalı olarak sizler için tüm detaylarıyla anlattım. Konunun önemini kısaca bahsedeyim php senkron bir programlama dili(thread basic) ve sayfa yenilenmeden veri gönderme alma işlemlerini yapamaz. Burada javascript yani asenkron programlama dili ile birlikte kullanarak arka taraftan sayfa yenilenmeden işlemleri yapacağız.

Buda bize zaman vede tekrar sayfa yeniden yüklenmesi olmadığı için server(sunucu)da ek maliyet çıkartmamayı sağlayacak.

Php ile sayfa yenilenmeden veri gönderme ve alma işlemlerini jquery, ajax kullanarakta yapabiliriz.

Jquery & Ajax ile sayfa yenilenmeden veri göndeme konusunu inceleyebilirsiniz Jquery & Ajax incele

Asenkron Nedir?

Javascipt her istek kendi içerisinde asenkron programlama non bloking Event based olarak çalışır. Aynı anda 2 istek geldiğinde sıraya koymaz ikisinide işleme alır hangisi daha önce biterse onu geri döner bekleme yapmaz.

Php thread basic sistemde istekler sıraya konarak senkron programlama olarak çalışır. Listelenmiş istekler sıraya konur ve biri bitmeden diğerine geçmez.

Neden Socket.io kullanılmalı

Canlı yada anlık kullanıcı sayısı ve hiti yüksek site platformlarında bu işlemler her biri istek attığı için sunucuyu yorar ve kapanmasına, yanmasına yada korumaya alarak tekrar başlamasına neden olur. İnternet kullanıcısı hıza önem verir işlemini yapamadığında sitenizden çıkar ve sitenize bir daha gelmeyedebilirde. Örnek: ösym gibi :)

Bu yüzden javascript nodejs freamworkünü ve socket.io npm paketini kullanacağız. Hazırsanız başlayalım :)

Nodejs nasıl kurulur?

Ubuntu Sunucuya veya mac,linux işletim sistemlerine Terminalden Nodejs Kurulumunu yapalım

    //Nodejs curl ile indirelim
    curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -

    //Kurulumu tamamlama komutu
    sudo apt-get install -y nodejs

    //Nodejs Versiyon soralım:
    node -v

    //Npm Versiyonunu Soralım
    npm -v

    //Versiyon numaralarını alabiliyorsak nodejs ve npm yüklenmiştir.

    //Not: killall node // komutu bütün node procesleri oldürür.
  

Ubuntu Sunucuya Socket.io’yu kurmak

Socket.io tcp dinleme işlemlerinde (on,emit) metodları ile mesaj alma ve gönderme işlemi yapar. Yani Wepsockets bir tcp bağlantısı ile çift yönlü mesaj gönderme yapabilen bir protokoldür. Bu protoköl ile tarayıcı ile sunucu arasında sürekli açık olan bir tcp bağlantısı oluşturulur. İsteyen taraf diğer tarafa mesaj gönderebilir.

        //socket.io’yu, nodejs’in paket yöneticisi olan npm ile kuracağız.
        npm init -y

        //Artık socket.io’yu kurabiliriz.
        npm install --save socket.io

        //local
        localhost:5000

        //Sunucu
        IP_ADRESI:5000

        //Sunucu socket.io.js
        ipadresiniz:5000/socket.io/socket.io.js
      

Eğer sizde "bu siteye ulaşılamıyor" localden 5000 portu üzerinden yani urlde localhost:5000 yazdığınızda sayfa açılmıyorsa socket hatalı olmuş. Hata olarak sizden kaynaklı değil socket.io ve npm sürümlerinin uyuşmazlığından kaynaklanıyor.

socket.io npm uyuşmazlığı hatası

nodejs npm paketlerinin uyumlu hale getirilmesi gayet basittir. Ilk olarak versiyon kontrollerini yapalım nodejs, npm ve socket.io olarak sonra bunların uyumlu olduğu paket yapısını bulup var olan socket.io paketini silip uyumlu olan halini tekrar yükleyelim. Sırasıyla işlemleri uygulamalı sizde yapın

        //package.json da socketio versiyonu bende ("socket.io": "^4.1.3")
        //node sürümü bilgisayarımda node -v komutu ile (v10.13.0)
        //npm paket sürümü bilgisayarımda npm -v (6.9.0)

        //Var olan paketi silelim
        npm uninstall socket.io

        //Uyumlu paketi yükleyelim
        npm install --save [email protected]
      

Ubuntu Sunucu üzerinde Socket.io Nodejs Server ayarları

Sunucumuz üzerinde nodejs http serverını ayağa kaldıralım ve daha sonra belirlediğimiz bir port üzerinden socket.io çalıştırarak php ile socket bağlantısı kurarak realtime veri gönderelim.

ilk olarak nodejs http server ve bir port üzerinden socket ayarlarımızı yapalım. Kök dizinimize appsp.js adında bir dosya oluşturalım ve içine kodlarımızı yazalım.

        //
        const http     = require('http');//http sunucusu
        const server   = http.createServer((req, res) => {
            res.end('Server Kuruldu!');
        });

        server.listen(5000);//5000 portuna http server oluşturuyorup dinliyoruz
      

Nodejs Http Server ayarlarını yaptıktan sonra socket ayarlarını yapalım

        const socketio = require('socket.io');//socket oluşturma
        const io = socketio.listen(server);//server socket ile bağlantı oluşturacağımız yeri portu belirtiyoruz.
      

Belirlediğimiz 5000 portu üzerinden socket dinleme yapacağımızı belirttik. Sıra geldi socket üzerinde bağlantı kuranları yakalamaya ve gelen verileri dinlerek işlem yapmaya.

        //connection ile kullanıcının(client) girdiğini yakalıyoruz.
        io.sockets.on('connection', (socket) => {
          console.log('sockete birileri bağlandı.');

          //data send-message eventına veri geldiğinde messages eventına datayı emit ile göndersin
          socket.on('send-message', function(data){
              console.log("Server Dinliyor: ");
              console.log(data);

              //emit ile client gelen datayı gonderiyoruz
              io.emit('messages', data);
          });

          //Ayrılan kullanıcının socket bağlantısı sonlandığında burası çalışır
          socket.on('disconnect', function(){
              console.log('birileri geldi ve gitti.');
          });
        });
      

Socket.io Clien(Kullanıcı) tarafının ayarlarını yapalım

Socket.io http server kurulumunu ve 5000 portu üzerinden dinleme işlemlerini yukarıda yaptık. Şimdi kullanıcı(Client) tarafı ile veri 5000 portu üzerinden socket.io veri gönderip nodejs http serverdan gelen verileri ekrana yazdıralım.

client.html dosyası oluşturup içine kodlarımızı yazalım:

        -- localdeki socket.io.js dosyamız
        

        -- Sunucuda ki socket.io.js dosyamız
        

        -- Cdn üzerinde ki socket.io.js dosyamız
        
      

Socket.io js dosyamızı client.html dosyamıza çektikten sonra Socket.on ile gelen verileri dinleyelim. Socket.emit ile gönderelim.

Dinleme(on), gönderme(emit) işlemlerini event(bir ad) belirterek yapıyoruz. Yani mantık şu http server üzerinde 5000 portu üzerinden eventlar ile haberleşeceğiz. Kodlarımızı yazarak deneyelim:

      //Local bilgisayarımızdan
       var socket = io('http://localhost:5000/');
      //Sunucu ip üzerinden
       var socket = io.connect("http://104.248.196.221:5000");
      //Sunucu ssl ip üzerinden ise secure eklemeyi unutmayın
       var socket = io('https://104.248.196.221:5000', {   secure: true });
    

Socket.on ve Socket.emit kullanımları

        //Socket on ile (messages) eventını dinleyeceğiz
        socket.on('messages', function(data){
          console.log("client dinleniyor");
          console.log(data);
          //alert(data.name);
          $('.snc').html('Ad: '+ data.name+" Soyadı: "+data.surname)
        });

        //emit ile (send-message) veri gonderiyoruz
        socket.emit('send-message', {"name":"ismail","surname":"gültekin"});
      

client.html dosyamızda snc clası ile ekrana sonuclarımızı yazdıralım:

        <h3 style="color:orange;margin-top:50px;">Dinlenen Sonuçlar:</h3>
        <p class="snc" ></p>
      

Nodejs http server 5000 portu üzerinden socket.io ile bağlantı kurarak belirlediğimiz eventlara client tarafında on ve emit metotlarını kullanarak veri göndermeyi ve almayı başardık.

Nodejs Projemizin sunucuda sürekli çalışması nasıl yapılır?

Projemizin sunucuda portserver ve içinde dosyalarımız ile server.js dosyamızın sürekli çalışması hatta ana makinanın tekrar başladığında bile devreye girmesi için pm2 npm paketini kullanacağız.

        //pm2 npm paketini global olarak yükleyelim
        npm install pm2 -g

        //Start verip çalıştıralım
        pm2 start app.js

        //Restart çekme komutu
        pm2 restart app

        //Durdurma komutu
        pm2 stop app

        //Logları takip edebilme komutumuz
        pm2 logs

        //Ana makina kapanıp tekrar başlasa bile kaldığı yerden çalıştırma komutlarımız: startup ve save komutları
        pm2 startup //ana makina yeniden çalışsa bile
        pm2 save
      

Php ile socket.io kullanımını yapalım

Bunun için elephant.io adında bir paket kullanacağız. Paketi projemize Composer ile kurmak için;

        composer require wisembly/elephant.io
      

Daha sonra php'den socket’e bir veri göndereceğimiz de şu şekilde kullanıyoruz; index.php adında bir dosya oluşturalım ve kodlarımızı yazalım.

        require __DIR__ . '/vendor/autoload.php';

        use ElephantIO\Client;
        use ElephantIO\Engine\SocketIO\Version2X;

        $client = new Client(new Version2X('http://IP_ADRES:5000'));
        $client->initialize();
        $client->emit('dinlenenevent', [
            'title' => 'başlık',
            'content' => 'içerik',
            'date' => date('Y-m-d'),
            'id' => 2
        ]);
        $client->close();
      

Php ve Socket.io kullanarak Real Time haberleşme örneği

İşlemler bu kadar sizde client.html dosyanızı tarayıcıda açtığınızda verilerin geldiğini gorebiliyorsanız sorun yok demektir. Umarım faydalı bir anlatım olmuştur.

Composer kurulumu ve Composer ile php paketlerin yüklenmesini şuradan detaylı inceleyebilirsiniz. Composer Kurulum ve Kullanımı
Client Tarafı Canlı Demo
Projeyi indir Githup İndir

Görüş Hata Bildir

Güvenlik Kodunuz:

Yorum Yap

Yorum kodunuz:

0.0538