Socket.io के साथ PHP का उपयोग करना


128

क्या क्लाइंट की ओर से सॉकेट्स का उपयोग करना संभव है और सर्वर पर PHP आधारित एप्लिकेशन के साथ संवाद करना है? क्या PHP भी इस तरह के 'लंबे समय तक रहने वाले कनेक्शन' को कोड लिखने का समर्थन करता है?

सभी सॉकेट कोड जो मैं सॉकेट के लिए खोजता हूं। वह सर्वर साइड पर नोड.जेएस के लिए लगता है, इसलिए वहां कोई मदद नहीं करता है।


3
संभावित डुप्लीकेट: php स्रोत से सॉकेट.आईओ
हैकर

आप बस धक्का देने वाले पर विचार करना चाह सकते हैं। यह एक निफ्टी PHP लाइब्रेरी है जिसका मैं उपयोग करूंगा।
डेविन जी रोड

नमस्ते, यह एक कोशिश करो - github.com/walkor/phpsocket.io
जेन्या हिस्टेरोवा

जवाबों:


98

इस प्रश्न का उत्तर देने में थोड़ी देर हो सकती है, लेकिन यहां मुझे वही मिला है।

मैं इस तथ्य पर बहस नहीं करना चाहता कि नोड्स php से बेहतर है या नहीं, यह बात नहीं है।

समाधान यह है: मुझे PHP के लिए सॉकेट.आईओ का कोई कार्यान्वयन नहीं मिला है।

लेकिन वेबस्केट को लागू करने के कुछ तरीके हैं । नहीं है प्लग इन को इस jQuery आप WebSocket उपयोग करने का है, जबकि शान से गैर समर्थन ब्राउज़रों के लिए अपमानजनक अनुमति देता है। PHP की तरफ, यह वर्ग है जो PHP WS सर्वर के लिए सबसे अधिक व्यापक रूप से उपयोग किया जाता है।


1
phpwebsocket वर्ग वास्तव में जाने का तरीका है यदि आप php websocket सर्वर कार्यान्वयन चाहते हैं। हालांकि यह सवाल से संबंधित नहीं है। ओपी के पास पहले से ही एक डब्ल्यूएस सर्वर (सॉकेट.आईओ) लागू है और उसने php एप्लिकेशन के साथ संवाद करने के तरीके पूछे हैं।
कैस्पर तायमान

72

यदि आप php के साथ socket.io का उपयोग करना चाहते हैं तो यह आपका उत्तर हो सकता है!

प्रोजेक्ट वेबसाइट:

elephant.io

वे भी गितुब पर हैं:

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

Elephant.io PHP में पूरी तरह से लिखा एक सॉकेट.आईओ क्लाइंट प्रदान करता है जो आपकी परियोजना में हर जगह उपयोग करने योग्य होना चाहिए।

यह लाइब्रेरी का उपयोग करने के लिए एक हल्का और आसान है जिसका उद्देश्य कुछ अनुप्रयोगों के लिए वास्तविक समय की कार्यक्षमता को सॉकेट.आईओ और वेबसोकेट के माध्यम से एक PHP एप्लिकेशन में लाना है जो कि पूरी जावास्क्रिप्ट में नहीं किया जा सकता है।

प्रोजेक्ट वेबसाइट से उदाहरण (php के माध्यम से वेबसोकेट सर्वर के साथ संचार)

php सर्वर

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`';

सॉकेट io सर्वर

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
मैं आपको यहाँ एक +1 दूंगा, लेकिन ऐसा लग रहा है कि यह अभी भी उत्पादन के माहौल में प्रयोग करने लायक नहीं है।
हाउस

17
मैंने इसे देखा है, लेकिन एक चीज ने मुझे भ्रमित किया है। क्या यहाँ PHP एक sockets.io सर्वर को लागू करने की बात नहीं है? और, इसके बजाय, Elepant.io एक sockets.io क्लाइंट का PHP कार्यान्वयन प्रतीत होता है, जिसके लिए आप कुछ अन्य सॉकेट्स से कनेक्ट कर सकते हैं ।io सर्वर (मतलब, एलिफेंट.आईओ आपके सॉकेट्स से कनेक्शन के लिए नहीं सुन रहा है। उन्हें और उन्हें सर्विसिंग)?
पिंप ट्राइज़किट

बस मैं जो ढूंढ रहा था, उस पर दया आती है कि लगातार संबंध विकास के प्रारंभिक चरण में है।
स्लीवजड

8
नमस्ते। Elephant.io का उद्देश्य PHP से socket.io सर्वर पर ईवेंट को फायर करना है। एक स्थिर संबंध खोलने के लिए नहीं। लेकिन घटनाओं / संदेशों को जल्दी से कनेक्ट करने और भेजने में सक्षम होने के लिए। हम इसका उत्पादन में उपयोग करते हैं और यह एक आकर्षण की तरह काम करता है।
गुरिल्लापॉटियर

3
इस लाइब्रेरी का रखरखाव अभी नहीं किया गया है और हमारे लिए कुछ मुद्दे हैं
फ़्लायन


14

यदि आप वास्तव में socket.io के लिए अपने बैकएंड के रूप में PHP का उपयोग करना चाहते हैं, तो यहां मुझे वही मिला है। दो सॉकेट .io php सर्वर साइड विकल्प।

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

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

इस तरह के पहले रिपॉजिटरी के लिए एक्सैम्पल कोड।

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

आपके द्वारा उल्लिखित 'लंबे समय तक रहने वाले कनेक्शन' के लिए, आप PHP के लिए शाफ़्ट का उपयोग कर सकते हैं। यह स्ट्रीम सॉकेट फ़ंक्शंस पर आधारित लाइब्रेरी है जिसे PHP ने PHP 5 के बाद से सपोर्ट किया है।

क्लाइंट की ओर के लिए, आपको Socket.io के बजाय HTML5 समर्थित WebSocket का उपयोग करने की आवश्यकता है (क्योंकि आप जानते हैं, socket.io केवल नोड के साथ काम करता है। js)।

यदि आप अभी भी Socket.io का उपयोग करना चाहते हैं, तो आप इस तरह से कोशिश कर सकते हैं: - ग्राहक के उपयोग के लिए socket.io.js ढूंढें और प्राप्त करें - जिस तरह से socket.io सर्वर पर काम करता है उसका अनुकरण करने के लिए शाफ़्ट के साथ काम करें

उम्मीद है की यह मदद करेगा!


6

एर्म, आप क्यों करना चाहेंगे? अपनी नॉन-ब्लॉकिंग चीज़ को करने के लिए बैकएंड और NodeJS / सॉकेट पर PHP छोड़ दें।

यहां आपको आरंभ करने के लिए कुछ है: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

व्यक्तिगत रूप से मेरे पास एक समापन बिंदु के साथ चलने वाला एक्सप्रेस है जो PHP से बातचीत के लिए स्पष्ट रूप से सुन रहा है।

उदाहरण के लिए, यदि मैंने एक उपयोगकर्ता को एक ईमेल भेजा है, तो मैं चाहता हूं कि सॉकेट.आईओ उपयोगकर्ता को एक वास्तविक समय सूचना प्रदर्शित करे।

Socket.io से php पर इंटरैक्शन चाहते हैं, अच्छी तरह से आप बस कुछ ऐसा कर सकते हैं:

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

गंभीरता से, PHP सर्वर साइड सामान करने के लिए बहुत अच्छा है और इसे उन कनेक्शनों के साथ रहने दें, जिनका अब इस डोमेन में कोई स्थान नहीं है। जब आपके पास वेबसोकेट या फ्लैशस्कैट हों तो कुछ भी लंबे समय तक क्यों न करें।


32
क्योंकि हम में से कुछ केवल एक सस्ता मेजबान प्राप्त करने में सक्षम हैं जो केवल आपको php और mysql का उपयोग करने देगा।
लैंबो

31
क्योंकि हममें से कुछ को मौजूदा चौखटे के साथ काम करना पड़ता है जो PHP पर निर्भर करता है। उदाहरण के लिए हम एक PHP स्क्रिप्ट को विकसित करते हैं और बेचते हैं, लेकिन वेबस्कैट का उपयोग करके आईएम को बेहतर बनाना चाहते हैं, हम उन सभी कमियों को लिखना नहीं चाहते हैं जो सॉकेट.आईओ पहले से ही लागू हैं लेकिन हमें अपने ग्राहकों से एनओडीजेएस की आवश्यकता नहीं हो सकती है।
प्योरफैन

3
@PaMM: मैंने कुछ <$ 10 VPS प्रदाताओं की कोशिश की, और उन सभी को वास्तव में चूसना। प्रत्येक बहुत धीमी गति से था, जब कुछ टूट जाता है, समर्थन भयानक होता है आदि। दूसरी ओर, फिनलैंड में विज्ञापन गुणवत्ता के साथ सभ्य गुणवत्ता वेब होस्टिंग (लेकिन केवल php / mysql / स्थिर फ़ाइलों के साथ) दुर्लभ है, बिना किसी अतिरिक्त भुगतान के। । तो नहीं, $ 5 के लिए भद्दा वीपीएस खरीदने में सक्षम होने के नाते निश्चित रूप से एक समाधान नहीं है।
ओली

4
<$ 10 VPS प्रदाताओं के लिए, अभी तक मैंने जो एकमात्र सभ्य पाया है वह digitalocean.com है। लेकिन वह बहुत अच्छा है।
ऐयोलुन

3
मैं सहमत नहीं हूँ। मुझे लगता है कि इस तरह का जवाब बहुत प्रासंगिक है। कोई आपको बता रहा है कि "आप इसे गलत उपयोग कर रहे हैं" किसी और की तुलना में आपके लायक होने में मदद मिल सकती है।
रिज्क

6

मैं संघर्ष करने वाला आदमी जानता हूँ! लेकिन मैं हाल ही में यह बहुत कामगार के साथ काम कर रहा था। यदि आपने इस php ढांचे पर ठोकर नहीं खाई है, तो आप बेहतर तरीके से इसकी जाँच करेंगे!

खैर, वर्कमैन एक अतुल्यकालिक घटना संचालित PHP फ्रेमवर्क है जो आसानी से तेजी से, स्केलेबल नेटवर्क अनुप्रयोगों के निर्माण के लिए है। (मैं सिर्फ उनकी वेबसाइट hahahah http://www.workerman.net/en/ से कॉपी और पेस्ट किया गया )

इसे समझाने का आसान तरीका यह है कि जब यह वेब सॉकेट प्रोग्रामिंग की बात आती है, तो आपको अपने सर्वर या लोकल सर्वर (जहाँ भी आप काम कर रहे हैं) में 2 फाइलें रखनी होंगी।

  1. server.php (स्रोत कोड जो ग्राहक के सभी अनुरोधों का जवाब देगा)

  2. client.php / client.html (स्रोत कोड जो अनुरोधित सामान करेगा)

तो बुनियादी तौर पर, आप सही कोड पहले आप पर server.php और सर्वर शुरू करते हैं। आम तौर पर, जैसा कि मैं विंडोज़ का उपयोग कर रहा हूं जो अधिक संघर्ष जोड़ता है, मैं इस कमांड के माध्यम से सर्वर चलाता हूं -> php server.php start

वैसे अगर आप xampp का उपयोग कर रहे हैं। यहाँ यह करने का एक तरीका है। आप जहां भी अपनी फाइलें रखना चाहते हैं, वहां जाएं। हमारे मामले में, हम फ़ाइलों को डालने जा रहे हैं

सी: /xampp/htdocs/websocket/server.php

C: /xampp/htdocs/websocket/client.php या client.html

यह मानते हुए कि आपके पास पहले से ही वे फाइलें आपके स्थानीय सर्वर में हैं। अपना गिट बैश या कमांड लाइन या टर्मिनल खोलें या जो भी आप उपयोग कर रहे हैं और यहां php पुस्तकालयों को डाउनलोड करें।

https://github.com/walkor/Workerman

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

मैं आमतौर पर संगीतकार के माध्यम से इसे डाउनलोड करता हूं और बस उन फाइलों को अपनी php स्क्रिप्ट में देखता हूं।

और यह भी एक की जाँच करें। यह वास्तव में महत्वपूर्ण है ! जब आप इसे चलाते हैं तो आपको server.php के साथ संवाद करने के लिए क्लाइंट.php या client.html के लिए इस जावास्क्रिप्ट लिबरी की आवश्यकता होती है।

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

मैं सिर्फ उस सॉकेट को कॉपी और पेस्ट करता हूं। मेरे क्लाइंट के रूप में उसी स्तर पर क्लाइंट-फ़ोल्डर और मेरा क्लाइंट। एफपी।

यहाँ server.php sourcecode है

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

और यहाँ client.php या client.html sourcecode है

<!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>

एक बार फिर, अपनी कमांड लाइन या गेट बैश या टर्मिनल खोलें जहाँ आप अपना सर्वर डालते हैं। फाइल। तो हमारे मामले में, वह है C: / xampp / htdocs / websocket / और php server.php में टाइप करें और एन्टर प्रेस करें।

फिर आप ब्राउजर पर जाएं और अपनी साइट पर जाने के लिए http: //localhost/websocket/client.php टाइप करें। फिर बस उस टेक्स्टबॉक्स में कुछ भी टाइप करें और आपको चलते-फिरते एक बेसिक php websocket दिखाई देगा!

बस आपको याद रखने की जरूरत है। वेब सॉकेट प्रोग्रामिंग में, इसे बस एक सर्वर और एक क्लाइंट की आवश्यकता होती है। पहले सर्वर कोड चलाएं और क्लाइंट कोड खोलें। आखिर तुमने इसे हासिल कर ही लिया है! उम्मीद है की यह मदद करेगा!


4

यदि आप वास्तव में WebSockets के लिए अपने बैकएंड के रूप में PHP का उपयोग करना चाहते हैं, तो ये लिंक आपको अपने रास्ते पर मिल सकते हैं:

https://github.com/lemmingzshadow/php-websocket

http://www.htmlgoodies.com/html5/other/create-a-bi-directional-connection-to-a-php-server-using-html5-websockets.html#fbid=QqpDVi8FqD9


1
क्या ये आपको सॉकेट.आईओ (इसके सभी समर्थित ट्रांसपोर्ट और ब्राउज़र के साथ) का उपयोग करने की अनुमति देते हैं। या क्या आपको php-websocket के साथ आने वाले क्लाइंट का उपयोग करना है?
डैरेन कुक

3

इस बारे में कैसा है ? PHPSocketio ?? यह एक सॉकेट है। php सर्वर साइड विकल्प। इवेंट लूप pecl इवेंट एक्सटेंशन पर आधारित है। हालांकि अब तक खुद इसे आजमाया नहीं है।


3

हम अब 2018 में हैं और हुला, php पर WS और WAMPServer को लागू करने का एक तरीका है। इसे शाफ़्ट कहा जाता है ।


2

मैंने इसे अभी तक आज़माया नहीं है, लेकिन आपको इसे ReactPHP और इस सॉकेट घटक के साथ करने में सक्षम होना चाहिए । देखने में बिल्कुल नोड की तरह लगता है, लेकिन PHP में।



0

मैं एक बहुत आसान तरीका के लिए देख रहा था PHP ग्राहकों को एक socket.io संदेश भेजने के लिए।

इसके लिए किसी अतिरिक्त PHP लाइब्रेरी की आवश्यकता नहीं है - यह बस सॉकेट्स का उपयोग करता है।

कई अन्य समाधानों की तरह वेबसोकेट इंटरफ़ेस से कनेक्ट करने का प्रयास करने के बजाय, केवल नोड.जेएस सर्वर से कनेक्ट करें और .on('data')संदेश प्राप्त करने के लिए उपयोग करें।

फिर, socket.ioइसे ग्राहकों के साथ अग्रेषित कर सकते हैं।

इस तरह से Node.js में अपने PHP सर्वर से एक कनेक्शन का पता लगाएं:

//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
        });
    }
});

यहां अविश्वसनीय रूप से सरल php कोड है - मैंने इसे एक फ़ंक्शन में लपेटा - आप कुछ बेहतर के साथ आ सकते हैं।

ध्यान दें कि 8080मेरे Node.js सर्वर का पोर्ट है - आप बदलना चाह सकते हैं।

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);
}

आप इसे इस तरह से उपयोग कर सकते हैं:

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

आप एरेज़ भी भेज सकते हैं जो कि जोंस में परिवर्तित हो जाते हैं और क्लाइंट के पास जाते हैं।

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

यह "विश्वास" करने का एक उपयोगी तरीका है कि आपके क्लाइंट को सर्वर से वैध संदेश मिल रहे हैं।

आप डेटाबेस अपडेट के साथ PHP पास भी कर सकते हैं, सैकड़ों क्लाइंट डेटाबेस को क्वेरी किए बिना।

काश मुझे यह जल्दी मिल जाता - आशा है कि यह मदद करता है! 😉


1
अच्छा विचार है, मैं रेडिस को छोड़ने का एक तरीका ढूंढ रहा था (यदि यह एक अच्छा विचार है)! पहले कोड में एक टाइपो है, एक अर्धविराम के बाद s.remoteAddress;। हालाँकि, मुझे यह काम करने के लिए नहीं मिल रहा है। मुझे नोड में कनेक्शन मिलता है, यह कनेक्शन का पता लगाता है, रीमोटीड्रेस सही है, लेकिन s.on('data')कभी नहीं होता है, लेकिन कुछ भी नहीं होता है। मैंने s.on('msg')भी कोशिश की । मैं आपके सटीक PHP कोड का उपयोग कर रहा हूं। मैं नोड सर्वर के लिए https, का उपयोग कर रहा हूँ, लेकिन यह बात नहीं होनी चाहिए?
निकोलस

@Niclas अरे टाइपो के बारे में खेद है - विश्वास नहीं कर सकता कि वहाँ सब साथ था। क्या आपका नोड सर्वर पोर्ट पर चल रहा है 8080? यदि नहीं, तो आपको पोर्ट बदलने की आवश्यकता है। यदि ऐसा है, तो Remote Addressवापस लौटाए जाने की जाँच करें - सुनिश्चित करें कि यह लूपबैक / स्थानीय पता है - यह आपके सर्वर सेटअप के साथ भिन्न हो सकता है। परीक्षण के लिए, आप लाइन को हटा सकते हैंif(s.remoteAddress == "::ffff:127.0.0.1")
user1274820

जल्दी जवाब देने का शुक्रिया! मैंने सफलतापूर्वक सभी तरह से सांत्वना दी। यहां तक ​​कि रीमोटीड्रेस भी सही था, यह सिर्फ s.on ('डेटा') अनुभाग में प्रवेश नहीं करता है। क्या संदेश भेजने के लिए परीक्षण करने का कोई तरीका है? कृपया मेरी टिप्पणी को पढ़ने के लिए देखें कि क्या मैं कुछ याद कर रहा हूं। मैं इसे कोड को पोस्ट करने के लिए एक नए प्रश्न के रूप में शुरू कर सकता हूं लेकिन यह लगभग आपकी तरह है।
निकल्स

मैंने इसे विस्तार से चर्चा करना आसान बनाने के लिए एक नए प्रश्न के रूप में शुरू किया: stackoverflow.com/questions/53689391/…
निकलैस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.