PHP'yi Socket.io ile kullanma


128

İstemci tarafında Sockets.io kullanmak ve sunucu üzerindeki PHP tabanlı bir uygulama ile iletişim kurmak mümkün müdür? PHP, kod yazmanın böylesine 'uzun ömürlü bir bağlantı' yolunu destekliyor mu?

Socket.io için bulduğum tüm örnek kodlar sunucu tarafında node.js için görünüyor, bu yüzden yardım yok.


3
Olası kopya: php kaynağından
Socket.io

Sadece iticiyi düşünmek isteyebilirsiniz. Kullanacağım güzel bir PHP kitaplığı var.
Devin G Rhode

Yanıtlar:


98

Bu sorunun yanıtlanması için biraz geç olabilir, ama işte bulduğum şey.

Düğümlerin bunu php'den daha iyi yapıp yapmadığı konusunda tartışmak istemiyorum, mesele bu değil.

Çözüm şudur: PHP için socket.io uygulamasının herhangi bir uygulamasını bulamadım.

Ancak WebSockets'i uygulamanın bazı yolları vardır . Orada eklenti bu jQuery incelikle olmayan destekleyici tarayıcılar için alçaltıcı yaparken WebSockets kullanmasına izin verecektir. PHP tarafında, PHP WS sunucuları için en yaygın kullanılan gibi görünen bu sınıf var .


1
phpwebsocket sınıfı, bir php websocket sunucu uygulaması istiyorsanız, gerçekten gidilecek yoldur. Ancak bunun soruyla ilgisi yok. OP zaten bir WS sunucusuna (socket.io) sahiptir ve bir php uygulamasıyla iletişim kurmanın yollarını sormuştur.
kasper Taeymans

72

Socket.io'yu php ile birlikte kullanmak istiyorsanız bu sizin cevabınız olabilir!

proje web sitesi:

elephant.io

onlar da github'da:

https://github.com/wisembly/elephant.io

Elephant.io, projenizin her yerinde kullanılabilecek, tamamen PHP ile yazılmış bir socket.io istemcisi sağlar.

Tam javascript ile yapılamayan eylemler için socket.io ve websockets aracılığıyla bir PHP uygulamasına bazı gerçek zamanlı işlevler getirmeyi amaçlayan hafif ve kullanımı kolay bir kitaplıktır.

proje web sitesinden örnek (websocket sunucusu ile php aracılığıyla iletişim kurun)

php sunucusu

use ElephantIO\Client as Elephant;

$elephant = new Elephant('http://localhost:8000', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->send(
    ElephantIOClient::TYPE_EVENT,
    null,
    null,
    json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();

echo 'tryin to send `bar` to the event `foo`';

soket io sunucusu

var io = require('socket.io').listen(8000);

io.sockets.on('connection', function (socket) {
  console.log('user connected!');

  socket.on('foo', function (data) {
    console.log('here we are in action event and data is: ' + data);
  });
});

2
Size burada bir +1 vereceğim, ancak görünüşe göre bu hala bir üretim ortamında kullanılabilir olmanın küçük bir yolu.
Beachhouse

17
Bunu gördüm ama bir şey kafamı karıştırdı. Buradaki amaç, PHP'nin bir sockets.io sunucusu uygulaması değil mi? ve bunun yerine Elepant.io, başka bir sockets.io sunucusuna bağlanabileceğiniz bir sockets.io istemcisinin PHP uygulaması gibi görünüyor (yani, elephant.io, sockets.io istemcilerinizden gelen bağlantıları dinlemiyor, bağlanıyor onlara ve hizmetlerine)?
Pimp Trizkit

Tam da aradığım şey, kalıcı bağlantının gelişimin erken aşamasında olması üzücü.
slezadav

8
Herkese selam. Elephant.io'nun amacı sadece PHP'den bir socket.io sunucusuna olayları ateşlemektir. Kalıcı bir bağlantı açmamak. Ancak hızlı bir şekilde bağlanıp olayları / mesajları gönderebilmek için. Üretimde kullanıyoruz ve bir cazibe gibi çalışıyor.
guillaumepotier

3
bu kitaplık artık
korunmuyor


15

Eğer gerçekten socket.io için arka uç olarak PHP kullanmak istiyorsanız, bulduklarım burada. İki socket.io php sunucu tarafı alternatifi.

https://github.com/walkor/phpsocket.io

https://github.com/RickySu/phpsocket.io

Bunun gibi ilk depo için örnek kodlar.

use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
  $socket->on('chat message', function($msg)use($io){
    $io->emit('chat message', $msg);
  });
});

7

Bahsettiğiniz 'uzun ömürlü bağlantı' için, Ratchet for PHP kullanabilirsiniz. PHP'nin PHP 5'ten beri desteklediği Stream Socket işlevlerine dayalı olarak oluşturulmuş bir kitaplıktır.

İstemci tarafı için, Socket.io yerine HTML5'in desteklediği WebSocket'i kullanmanız gerekir (bildiğiniz için socket.io yalnızca node.js ile çalışır).

Hala Socket.io kullanmak istiyorsanız, şu yolu deneyebilirsiniz: - istemcinin kullanması için socket.io.js'yi bulun ve alın - socket.io'nun sunucuda yaptığı gibi simüle etmek için Ratchet ile çalışın

Bu yardımcı olur umarım!


6

Eee, neden istesin? PHP'yi arka uçta ve engellemeyen işini yapmak için NodeJS / Sockets'da bırakın.

İşte başlamanıza yardımcı olacak bir şey: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

Kişisel olarak, PHP'den gelen etkileşimi açıkça dinleyen bir uç nokta ile ekspres çalıştırıyorum.

Örneğin, bir kullanıcıya bir e-posta gönderdiysem, socket.io'nun kullanıcıya gerçek zamanlı bir bildirim göstermesini istiyorum.

Socket.io'dan php'ye etkileşim istiyorsanız, bunun gibi bir şey yapabilirsiniz:

var http = require('http'),
            host = WWW_HOST,
            clen = 'userid=' + userid,
            site = http.createClient(80, host),
            request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",  
                {'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});                     

request.write('userid=' + userid);      
request.end();  

Cidden, PHP sunucu tarafı işleri için harikadır ve bağlantılarla birlikte olmasına izin verin, şimdi bu etki alanında yeri yoktur. Web yuvalarınız veya flash yuvalarınız varken neden uzun bir yoklama yaparsınız?


32
Çünkü bazılarımız yalnızca php ve mysql kullanmanıza izin verecek ucuz bir ana bilgisayar alabiliyoruz.
Lanbo

31
Çünkü bazılarımız PHP'ye bağlı mevcut çerçevelerle çalışmak zorundayız. Örneğin, bir PHP betiği geliştirip satıyoruz, ancak IM'yi websockets kullanarak geliştirmek istiyoruz, socket.io'nun zaten uyguladığı tüm geri dönüşleri yazmak istemiyoruz, ancak müşterilerimizden NodeJS isteyemiyoruz.
Purefan

3
@PaulM: Birkaç <10 $ VPS sağlayıcısını denedim ve bunların hepsi gerçekten berbat. Her biri çok yavaştı, bir şeyler bozulduğunda, destek korkunçtu vb. Öte yandan, Finlandiya'da adsl aboneliği ile iyi kalitede web barındırma (yalnızca php / mysql / statik dosyalar ile) ve fazladan ödeme yapmadan elde etmek nadir değildir. . Yani hayır, 5 dolara berbat VPS satın alabilmek kesinlikle bir çözüm değil.
Olli

4
<10 $ VPS sağlayıcıları için, şu ana kadar bulduğum tek makul olanı digitalocean.com. Ama bu oldukça iyi.
Aeolun

3
Ben katılmıyorum Bunun gibi bir yanıtın çok alakalı olduğunu düşünüyorum. Birinin size "yanlış kullanıyorsunuz" demesi, yanlış kullanmanıza yardım etmekten çok daha değerli olabilir.
Rijk

6

Mücadele adamı tanıyorum! Ama son zamanlarda Workerman ile çalışıyordum. Bu php çerçevesine rastlamadıysanız, bunu kontrol etseniz iyi olur!

Workerman, hızlı, ölçeklenebilir ağ uygulamalarını kolayca oluşturmak için zaman uyumsuz, olay odaklı bir PHP çerçevesidir. (Bunu kendi web sitelerinden kopyalayıp yapıştırdım hahahah http://www.workerman.net/en/ )

Bunu açıklamanın kolay yolu, web soket programlaması söz konusu olduğunda, gerçekten sahip olmanız gereken tek şeyin sunucunuzda veya yerel sunucunuzda (nerede çalışıyor olursanız olun) 2 dosyaya sahip olmanızdır.

  1. server.php (tüm istemcinin isteğine cevap verecek kaynak kodu)

  2. client.php / client.html (talep maddelerini yapacak kaynak kodu)

Yani temel olarak, önce server.php üzerinde kodu doğrularsınız ve sunucuyu başlatırsınız. Normalde, daha fazla mücadele ekleyen pencereler kullandığım için sunucuyu bu komutla çalıştırıyorum -> php server.php start

Peki xampp kullanıyorsanız. İşte bunu yapmanın bir yolu. Dosyalarınızı koymak istediğiniz yere gidin. Bizim durumumuzda, dosyaları içine koyacağız

C: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php veya client.html

Bu dosyaların yerel sunucunuzda zaten bulunduğunu varsayarsak. Git Bash'inizi veya Komut Satırınızı veya Terminal'inizi veya hangisini kullanıyorsanız onu açın ve php kitaplıklarını buradan indirin.

https://github.com/walkor/Workerman

https://github.com/walkor/phpsocket.io

Genellikle composer aracılığıyla indiririm ve bu dosyaları php betiklerime otomatik olarak yüklerim.

Ve bunu da kontrol edin. Bu gerçekten önemli ! İçin sırayla bu javascript kitaplığındaki ihtiyaç client.php veya client.html ile iletişim kurmak için server.php bunu çalıştırdığınızda.

https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

Sadece socket.io-client klasörünü server.php ve client.php ile aynı seviyeye kopyalayıp yapıştırdım.

İşte server.php kaynak kodu

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

use Workerman\Worker;
use PHPSocketIO\SocketIO;

// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
    $socket->on('send message', function($msg)use($io){
        $io->emit('new message', $msg);
    });
});

Worker::runAll();

Ve işte client.php veya client.html kaynak kodu

<!DOCTYPE html>
<html>
    <head>
        <title>Chat</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">        
    </head>
    <body>
        <div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>        
        <input type="text" class="message">
    </body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>    
    <script src="socket.io-client/socket.io.js"></script>  
    <script>
            var socket = io.connect("ws://127.0.0.1:2021");

            $('.message').on('change', function(){
                socket.emit('send message', $(this).val());
                $(this).val('');
            });

            socket.on('new message', function(data){
                $('#chat-messages').append('<p>' + data +'</p>');
            });
    </script>
</html>

Bir kez daha, server.php dosyanızı koyduğunuz komut satırınızı veya git bashınızı veya terminalinizi açın. Yani bizim durumumuzda bu C: / xampp / htdocs / websocket / ve php server.php içinde yazılmıştır start enter tuşuna basın.

Ardından tarayıcınıza gidin ve http: //localhost/websocket/client.php yazın. sitenizi ziyaret etmek için yazın. Sonra o metin kutusuna herhangi bir şey yazın ve hareket halindeyken basit bir php websocket göreceksiniz!

Sadece hatırlaman gerekiyor. Web soket programlamasında, sadece bir sunucuya ve bir istemciye ihtiyaç duyar. Önce sunucu kodunu çalıştırın ve ardından istemci kodunu açın. İşte buyur! Bu yardımcı olur umarım!


4

1
Bunlar socket.io'yu kullanmanıza izin veriyor mu (desteklenen tüm aktarımlar ve tarayıcılarla). Veya php-websocket ile gelen istemciyi kullanmak zorunda mısınız?
Darren Cook

3

Buna ne dersin ? PHPSocketio ?? Bir socket.io php sunucu tarafı alternatifidir. Olay döngüsü, pecl olay uzantısına dayanmaktadır. Şimdiye kadar kendim denemedim.





0

PHP'nin istemcilere bir socket.io iletisi göndermesini sağlamak için gerçekten basit bir yol arıyordum.

Bu, herhangi bir ek PHP kitaplığı gerektirmez - sadece soketleri kullanır.

Diğer pek çok çözüm gibi websocket arayüzüne bağlanmaya çalışmak yerine, node.js sunucusuna bağlanın ve .on('data')mesajı almak için kullanın .

Ardından socket.iomüşterilere iletebilirsiniz.

PHP sunucunuzdan Node.js'de aşağıdaki gibi bir bağlantı algılayın:

//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.on("connection", function(s) {
    //If connection is from our server (localhost)
    if(s.remoteAddress == "::ffff:127.0.0.1") {
        s.on('data', function(buf) {
            var js = JSON.parse(buf);
            io.emit(js.msg,js.data); //Send the msg to socket.io clients
        });
    }
});

İşte inanılmaz derecede basit php kodu - onu bir fonksiyonun içine sardım - daha iyi bir şey bulabilirsin.

Bunun 8080Node.js sunucumun portu olduğunu unutmayın - değiştirmek isteyebilirsiniz.

function sio_message($message, $data) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $result = socket_connect($socket, '127.0.0.1', 8080);
    if(!$result) {
        die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    socket_close($socket);
}

Bunu şu şekilde kullanabilirsiniz:

sio_message("chat message","Hello from PHP!");

Ayrıca json'a dönüştürülen ve istemcilere iletilen diziler de gönderebilirsiniz.

sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));

Bu, istemcilerinizin sunucudan meşru mesajlar aldığına "güvenmenin" yararlı bir yoludur.

Ayrıca, yüzlerce istemcinin veritabanını sorgulamasına gerek kalmadan PHP'nin veritabanı güncellemelerini de iletmesini sağlayabilirsiniz.

Keşke bunu daha erken bulsaydım - umarım bu yardımcı olur! 😉


1
Güzel fikir, redis'i atlamanın bir yolunu arıyordum (eğer bu iyi bir fikirse)! İlk kodda bir yazım hatası var, ardından noktalı virgül var s.remoteAddress;. Ancak, işe yaramıyorum. Bağlantıyı düğümde alıyorum, bağlantıyı algılıyor, uzak adres doğru ama s.on('data')hiçbir zaman olmuyor, ancak hiçbir şey olmuyor. Ben de denedim s.on('msg'). Tam PHP kodunuzu kullanıyorum. Düğüm sunucusu için https kullanıyorum ama bu önemli değil mi?
Niclas

@Niclas, yazım hatası için üzgünüm - bunun hep orada olduğuna inanamıyorum. Düğüm sunucunuz bağlantı noktasında 8080mı çalışıyor ? Değilse, bağlantı noktasını değiştirmeniz gerekir. Öyleyse, Remote Addressiade edileni kontrol edin - bunun geri döngü / yerel adres olduğundan emin olun - sunucu kurulumunuzdan farklı olabilir. Test için, satırı kaldırabilirsinizif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

Hızlı cevap için teşekkürler! Tamamen console.log'u başarıyla yaptım, uzak adres doğru olsa bile, s.on ('data') bölümüne girmiyor. Hangi mesajın gönderildiğini test etmenin bir yolu var mı? Bir şeyi gözden kaçırıp kaçırmadığımı görmek için lütfen yorumumu tekrar okuyun. Buna kodu göndermek için yeni bir soru olarak başlayabilirim ama neredeyse tamamen sizinki gibi.
Niclas

Bunu ayrıntılı olarak tartışmayı kolaylaştırmak için yeni bir soru olarak başlattım: stackoverflow.com/questions/53689391/…
Niclas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.