• 14-07-2014, 17:14:05
    #1
    Konunun ilk halini birilerinini işine yarar diye silmiyorum güncel sorun için son yorumlaraa bakın lütfen ( mutlaka bi sorun oluyo )

    -----------------------
    Merhaba.

    Php ve nodeyle ilk denememi yapayım dedim ve sitede online olanları nasıl gösterebilirim diye düşünmeye başladım ama düşünmeye başlayalı epey olmasına rağmen sonuca ulaşamadım.

    index.php'de ilgili kod şu şekilde;
    <script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
    
    var socket = io.connect("http://localhost:3000"); /* sokete bağlandım */
    socket.on("soketcevap",function(data){ /* soketten gelenler */
    	alert(data);
    });
    
    $(function(){ /* id ve nicki sokete gönder */
    	socket.emit("data1",{id:"<?php echo $_SESSION["uye"]["id"]; ?>",nick:"<?php echo $_SESSION["uye"]["nick"]; ?>"});
    });
    </script>
    server.js de şu şekilde;
    var io = require("socket.io").listen(3000);
    
    io.sockets.on("connection",function(socket){
    	socket.on("data1",function(data){
    		io.sockets.emit("soketcevap", data.nick);
    	});
    });
    Yaptığım şey, yapmak istediğim şeyle alakasız biliyorum ama yukardaki kod sorumu daha anlaşılabilir şekilde sormama da yardımcı olacağı için ekledim yukarı.

    Php sessionda tutulan üye id'si ve nickini server.js'ye gönderdim, ordan da sayfaya son giriş yapan üyenin nickini bağlı olan tüm kullanıcılara gönderdim ve test ettim bağlı olan tüm kullanıcılarda sayfayı son çalıştıran üyenin nickini ekrana basıyor.

    Online üyeleri gösterme konusunda anlamadıklarım ise şöyle:

    io.sockets.on("connection",function(socket){..});
    Burdaki socket değişkeninin işlevi tam olarak nedir?

    Soketteki tüm bilgiler bunda tutulur ve ben istediğim zaman burdaki tüm verilere erişebilir miyim, yoksa sadece veri akışı sağlamak için geçici olarak mı iş görür?

    Eğer socketteki bilgilere ulaşamıyorsam bir dizi oluşturup (online üye örneğinden hareketle) üyelerin idlerini o dizide tutup, php sayfalara bu diziyi mi döndürmem gerekir?

    Eğer son sorunun cevabı evet ise, üye her sayfa değiştirdiğinde sayfadan çıkarken disconnect (ve diziden idsini sil), yeni sayfaya geçişinde de server.js'deki diziye tekrar mı id'sini yazmam gerekir?

    Son sorunun cevabı hayır ise (ki umarım hayırdır çünkü herkes sayfa değiştirdiğinde tüm bağlı sayfalara veri göndermek çok mantıklı gelmedi bana) üyenin disconnect olduğunu nasıl anlarım? (çünkü bir şekilde diziden idsini çıkarmam gerek)

    Yardımlarınız için şimdiden çok teşekkür ederim.

    Edit: Dizide idlerin tutulma sebebi: online üyeleri, online olan üyeler listesi şeklinde değil de konuların listelendiği sayfada, konu başlıklarının bi köşesinde "bu konuyu açan üye şu an online" gibi bi not düşmek istiyorum.
    .
    .
  • 15-07-2014, 05:38:54
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Basit yapıda çevrimiçi olan üye sayısını gösteren kod parçasını aşağıdaki paylaşıyorum. Özellikleri ise üye soketten ayrıldığında "disconnect" üye sayısını yenilemesidir. Kod parçasını denemedim fakat çalışacağını düşünüyorum.

    İstemci;
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8" />
    	</head>
    	<body>
    		<div class="onlineUsers">Online User:&nbsp;<span class="count"></span></div>
    		<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    		<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>
    		<script type="text/javascript">
    			var socket = io.connect("http://localhost:3000");
    
    			socket.on("soketCevap", function (data)
    			{
    				$("div.onlineUsers span.count").html(data.count);
    			});
    
    			$(function ()
    			{
    				var user = {
    					id: "<?php echo $_SESSION['uye']['id']; ?>",
    					nick: "<?php echo $_SESSION['uye']['nick']; ?>"
    				};
    
    				socket.emit("soketGonder", user);
    			});
    		</script>
    	</body>
    </html>
    Sunucu;
    var io = require('socket.io').listen(3000);
    var count = 0;
    var users = [];
    
    io.sockets.on("connection", function (socket)
    {
    	socket.on("soketGonder", function (user)
    	{
    		count++;
    
    		users[socket.id] = user;
    
    		io.sockets.emit("socketCevap", {
    			count: count
    		});
    	});
    
    	socket.on("disconnect", function ()
    	{
    		count--;
    
    		users.splice(socket.id, 1);
    
    		io.sockets.emit("socketCevap", {
    			count: count
    		});
    	});
    });
  • 15-07-2014, 11:10:52
    #3
    İlginiz ve emeğiniz için teşekkürler. Kodları ben de henüz denemedim ama her detayına baktım, çalışçak gibi görünüyor. Gerçi istemci tarafındaki koda bakılırsa online olan üyelerin yanına bu online diye belitmemi sağlamayacak, adece sistemdeki online üye sayısını verecek sanırım ama editlenmesi de zor olmaz.

    Asıl anlamadığım konunun da bir kısmına cevap buldum değerli mesajında. Sanırım bütün bilgilere sunucu tarafı olarak iş gören js dosyasında tuttuğum dizi ve değişkenlerden ulaşabiliyorum yani daha arka planda bilgilerin depolandığı başka bi yer yok. Aslında olsaydı doğrudan php'den de aynı bilgilere erişmek mümkün olabileceği için sanırım daha hoş olurdu.

    Yapıyı üylerin açtığı konu başlıklarının yanında bu üye online (veya offline) gibi not düşmek için kullandığımızı düşünürsek, veya facebooktaki gibi arkadaş listesinde aynı şekilde online olanları gösterdiğimizi farzedersek bu yapıya göre sistem şöyle çalışçak (yanılıyosam lütfen düzeltin):

    Üye sisteme girdi online oldu, herhangi bi linke tıkladı, bulunduğu sayfadan çıkarken offline, yeni sayfaya girince tekrar online oldu, online offline düye sürekli tekrar etçek, bunun önüne nasıl geçebiliriz.

    Bu yapıya göre bir de şöyle bi sorun olcak ki, adam linki yeni sekmede açarsa ve iki sayfadan birini kapatırsa diğeri açık olduğu halde disconnct işlemi gerçekleşçek ve adam offline görüncek.

    Biraz uzattım farkındayım, hemen toparlıyorum. Facebook ta node benzeri, aynı mantıkta çalışan python tabanlı bir yapı kullanıyo diye duymuştum. Python kısmında yanışıyor olabilirim ama en azından node mantığıyla çalışan bi yapı kullandığı da kesin gibi. Arkadaş listendeki biri istediği kadar sayfa değiştirsin online görünmeye devam ediyor.

    Bir şekilde anlık olarak değil de belirlkedikleri zaman sonunda işlemi gerçekleştiriyolar sanırım. Bunu nasıl yapabiliriz?

    Şimdi şöyle bi kabataslak düşününce akla gelen ilk fikir son işlemleri henüz istemci tarafına gönderilmemiş ve asıl online üyeler dizisine henüz eklenmemiş id'leri bir dizide biriktirip setinterval gibi bi zamanlayıcıyla, örneğin 20 saniyede bir dizi boş değilse bu diziyi istemciye göndermek, bu geçici diziyi de asıl online üyeler (users) dizisine gerekli elemeyi yaparak taşımak çözüm olabilir gibi geldi ama çok mantıklı konuşmamış da olabilirim uyanır uyanmaz pc açtım, hala uyukluyorum.

    Bilgi, fikir veren herkese teşekkür ederim.
  • 15-07-2014, 17:10:37
    #4
    Şöyle bir yapı hazırlanabilir.

    Sisteme her giriş yapan üyeye bir ID numarasını atarsınız. Bu numarayı istediğiniz yerde tutun. (Redis, Mongo etc.) Client JS kısmında Auth_ID değişkeninde bu değer olsun. Farz edelim ki redis kullanıyoruz. Redis'te tanımlanan ID numarasının olup olmadığını kontrol edin. Eğer yoksa Redis'e yazın. Üye artık "Online Users"'ta, "disconnect" eventına hiçbir şey yazmayın. PHP tarafında üye sistemden çıkış yaptığında Redis'ten tanımladığınız Auth_ID'yi silin. Buraya kadar her şey tamam fakat şöyle bir sorunumuz var. Eğer kullanıcı çıkış yapmaz direk sayfayı kapatırsa ne olacak? Çözümü çok basit arkaplanda Redis'e ikinci bir değer tanımlayın bu üyenin girişi yaptığı zaman olsun. Her sayfa gezişinde aralıklarla bu zamanı güncelleyin. Üye sayfayı kapattığında farz edelim zaman aşımı 30 saniye olsun. Konsol tarafında 2 tane ekran çalışacağı için (1.si socket server, 2. user disconnect controller) 2. Nodemizde sürekli sorguyla zamanları kontrol edelim. Zaman aşımına girenleri Redis'ten silelim. Bu yazdığım sistem pek stabil çalışmayabilir fakat mantığı anlatmak için yazdım.

    Sormak istediğiniz sorular olursa hiç çekinmeden sorabilirsiniz.
  • 26-07-2014, 19:48:24
    #5
    Şimdiiii!..
    Sıra mongodb bağlantısında bi türlü bağlanamadım nodeden.

    Php tarafında kullandığım mongo bağlantısı şu şekilde:
    $mongo = new Mongo('mongodb://127.0.0.1:27017');
    nodejs serverını sayfaya dahil edişim de şöyle:
    <script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
    var socket = io.connect("http://localhost:3000");
    .......
    3000 portu server.jsde ayarlandı

    nodejs server dosyasın ana dizine göre konumu da şöyle -> /_node/server.js

    Örneklere bakıyorum nodejs ile mongodb'ye bağlanırken genelde şöyle bir kullanım var:
    mongoose.connect( 'mongodb://localhost/uygulama_klasoru', function(err){
    	...............
    });
    Ama tüm örneklerde sadece nodejs ile çalışılmış. Ben php + node çalışırken node tarafında mongo bağlantısını nasıl yapmalıyım.


    Bi türlü bağlantı kuramadığım node kodları da son deneme itibarıyla şu şekilde:
    var mongoose	= require("mongoose");
    mongoose.connect( 'mongodb://localhost', function(err){
    	if( err ){
    		console.log(err);
    	}else{
    		console.log('connected mongo');
    	}
    });
    Verdiği hata şöyle.


    Ekledi: server.js'den yukarda eklediğim mongo bağlantı kodlarını kaldırınca sorun yok.

    İlgilenen arkadaşlara şimdiden çok teşekkürler.
    .
  • 26-07-2014, 21:07:10
    #6
    Üyeliği durduruldu
    codeksper adlı üyeden alıntı: mesajı görüntüle
    Şimdiiii!..
    Sıra mongodb bağlantısında bi türlü bağlanamadım nodeden.

    Php tarafında kullandığım mongo bağlantısı şu şekilde:
    $mongo = new Mongo('mongodb://127.0.0.1:27017');
    nodejs serverını sayfaya dahil edişim de şöyle:
    <script type="text/javascript" src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
    var socket = io.connect("http://localhost:3000");
    .......
    3000 portu server.jsde ayarlandı

    nodejs server dosyasın ana dizine göre konumu da şöyle -> /_node/server.js

    Örneklere bakıyorum nodejs ile mongodb'ye bağlanırken genelde şöyle bir kullanım var:
    mongoose.connect( 'mongodb://localhost/uygulama_klasoru', function(err){
    	...............
    });
    Ama tüm örneklerde sadece nodejs ile çalışılmış. Ben php + node çalışırken node tarafında mongo bağlantısını nasıl yapmalıyım.


    Bi türlü bağlantı kuramadığım node kodları da son deneme itibarıyla şu şekilde:
    var mongoose	= require("mongoose");
    mongoose.connect( 'mongodb://localhost', function(err){
    	if( err ){
    		console.log(err);
    	}else{
    		console.log('connected mongo');
    	}
    });
    Verdiği hata şöyle.


    Ekledi: server.js'den yukarda eklediğim mongo bağlantı kodlarını kaldırınca sorun yok.

    İlgilenen arkadaşlara şimdiden çok teşekkürler.
    .
    npm install mongoose
  • 26-07-2014, 21:25:46
    #7
    require ettiğim tüm modüller yüklü hocam zaten.

    edit:
    Bağlantı sorununu çözdük :27017 ekleyince connected selamı çaktı
    mongoose.connect( 'mongodb://localhost:27017', function(err){
    	if( err ){
    		console.log(err);
    	}else{
    		console.log('connected mongo');
    	}
    });
    Şimdi de veritabanı komutlaruyla uğraşıyorum, sıradaki sorunum bu. Mongoyu phpden kullanmaya alışmışım bi tuhaf geldi.

    Php'deki şu sorgunun nodeda yazılışı nasıldır mesela:
    $query = $db -> uye -> findOne( [ "_id"=>new MongoId($uid) ] );
    if( !$query ){ include "_ortak/hata1.php"; exit;}
    echo $query["isim"];
    $db değişkeniyle aynı işi görecek değişkeni bile oluşturamadım daha ya : S
    Bilgisi olanlar yazarsa büyük bi eziyetten kurtarcak beni
    .
    .

    Ekledi:
    Hata vermeyen, işlem başarılı mesajı aldığım halde veritabanına insert işlemi yapamadığım milyonlarca denemeden sonra farkettim ki üstünde çalışacağım veritabanının adı hiçbi yerde yazmıyor.

    Velhasıl kelam; aynı sorunu yaşayan olursa ve mongoose kullanıyorsanız. bağlantı satırına veritabanı adını da eklemeyi unutmayın.
    mongoose.connect( 'mongodb://localhost:27017/db_adi', function(err){
    	if( err ){
    		console.log(err);
    	}else{
    		console.log('connected mongo');
    	}
    });
    var yapi	= mongoose.model('collection_adi', { name: String });
    var data	= new yapi({ name: 'bir isim' });
    data.save(function (err) {
      if (err) // hata....
      console.log(' nihayet ilk inserti yaptık :S ');
    });
    Bu arada farkettim ki mongoose dışında alternatifler de var ve mongoosedaki bu önceden yapı belirleme işinden hiç hoşlanmadım.. mongolia veya kullandığınız başka bi' modül varsa yazarsanız sevinirim.
    Saygılar.
  • 29-07-2014, 14:51:42
    #8
    Eveeeettt... sıradaki:

    Sıradaki sorun mantık sorunu. Online gösterme olayıyla başladık değişik yerlere uzandı konu. Üyeler arası anlık mesajlajma da kodladım, şu an üyeler yazışabiliyor ama veritabanında sohbetle ilgili tutulan herhangi bir kayıt yok.

    Bu mesajın özeti: En az sorgu, en az cpu için nasıl bir tablo yapısı kurulmalı, sorgular nerde ve nasıl yapılmalı.


    Mevcut yapıdan kısaca bahsedeyim.
    Resimde sağdaki browserda, konuyu açan üye online ise üyeyle konuşmayı başlatacak link oluşturuluyor. Sol browserdaki üye de konuyu açan üye. Konuşmayı başlatan üye herhangi bir şey yazdığı zaman ileti konunun sahibine gidiyor, o da cevap yazabiliyor. Tabi veritabanı işlemi olmayınca sayfa değişince sohbet tekleyecek.

    Olmasını istediğim yapı şu:
    -arkadaşlık mantığı yok, diğer üyeleri herhangi bir listeye ekleme falan yok, bir üye, başka bir üeyeye ancak ulaşmak istediği üyenin açtığı bir konunun sayfasından, ya da ilgili üyenin profil sayfasından ulaşabilecek (sohbet başlatabilecek).
    - İki üye arasındaki konuşmalar tabloda her mesaj ayrı satırda değil de, o iki üye arasındaki konuşmaların tamamı tek satırda json olarak (veritabanı nosql {mongo}) tutulacak. Önceden belirlediğim mesaj sayısı limitiyle, örneğin limit 50 ise, 51. mesaj yazıldığında en eski yani 1. mesaj silinecek. Yani hep son 50 mesaj tutulacak ilgili satırda.
    -Resimde konuşma penceresinin sağındaki alanda üyenin yakın zamanda iletişime geçtiği üyeler listelenecek. Bunun için de önceden belirlediğim limit kadar kayıt tutulacak. Örneğin bu limit 30 ise ve bir üyenin son iletişime geçilen üyele listesinde 30 kayıt varsa, yeni bir kouşma başlatıldığında, listedeki 30 üyeden hangisiyle son etkileşim en eski ise o üye listeden kaldırılacak.

    Daha da özetle: Anlık iletiler tek tabloda tutulacak. A üyesinin B üyesiyle konuşmaları tek satırda tutulacak (son 50 post), ve her bir üye için anlık ileti tablosunda max 30 satır, yani en son etkileşimde bulunulan 30 üye tutulacak. Bu 30 üye de en son ileitşim kurulanlar listesinde yer alacak.

    Hem php tarafında, hem node tarafında veritabanına erişebiliyorum. Veriler veritabanına hangi aşamada yazılmalı || güncellenmeli || listelenmeli?

    Bu konuda çok çok bilgili arkadaşlar var forumda biliyorum, aslında etiketleyecektim bikaç tanesini ama yüzsüzlük etmek istemedim.

    Yardımcı olan arkadaşlara çok çok teşekkürler, saygılar, sevgiler.
  • 29-07-2014, 18:26:53
    #9
    takipteyim.
    Node ile haşır neşir olacağım bu aralar