클라이언트 측에서 Sockets.io를 사용하고 서버에서 PHP 기반 응용 프로그램과 통신 할 수 있습니까? PHP는 코드를 작성하는 '장기 연결'방식을 지원합니까?
socket.io에 대해 찾은 모든 샘플 코드는 서버 측의 node.js에 대한 것이므로 도움이되지 않습니다.
클라이언트 측에서 Sockets.io를 사용하고 서버에서 PHP 기반 응용 프로그램과 통신 할 수 있습니까? PHP는 코드를 작성하는 '장기 연결'방식을 지원합니까?
socket.io에 대해 찾은 모든 샘플 코드는 서버 측의 node.js에 대한 것이므로 도움이되지 않습니다.
답변:
이 질문에 대한 답변이 다소 늦을 수 있지만 여기에 내가 찾은 내용이 있습니다.
노드가 PHP보다 낫다는 사실에 대해서는 토론하고 싶지 않습니다. 이점이 아닙니다.
해결책은 : PHP 용 socket.io 구현을 찾지 못했습니다.
그러나 WebSocket 을 구현하는 몇 가지 방법이 있습니다 . 이 jQuery 플러그인 은 지원되지 않는 브라우저에 대해 정상적으로 성능을 저하시키면서 Websocket을 사용할 수 있도록합니다. PHP 측에는 PHP WS 서버에 가장 널리 사용되는 것으로 보이는 이 클래스 가 있습니다.
php와 함께 socket.io를 사용하려면 이것이 당신의 대답 일 수 있습니다!
프로젝트 웹 사이트 :
그들은 또한 github에 있습니다 :
https://github.com/wisembly/elephant.io
Elephant.io는 프로젝트의 어느 곳에서나 사용할 수있는 PHP로 완전히 작성된 socket.io 클라이언트를 제공합니다.
전체 자바 스크립트에서 수행 할 수없는 작업을 위해 socket.io 및 웹 소켓을 통해 PHP 응용 프로그램에 일부 실시간 기능을 제공하는 것을 목표로하는 가볍고 사용하기 쉬운 라이브러리입니다.
프로젝트 웹 사이트의 예 (php를 통해 websocket 서버와 통신)
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);
});
});
업데이트 : 2014 년 8 월 현재 socket.io v1.0 사이트에는 PHP 예가 있습니다 : https://github.com/rase-/socket.io-php-emitter
socket.io의 백엔드로 PHP를 실제로 사용하려면 여기에서 찾은 것이 있습니다. 2 개의 socket.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);
});
});
음, 왜 하시겠습니까? 백엔드와 NodeJS / Socket에 PHP를 남겨두고 비 차단 작업을 수행하십시오.
시작하는 방법은 다음과 같습니다. http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc
개인적으로 PHP와의 상호 작용을 명확하게 듣고있는 엔드 포인트로 달리는 것을 표현했습니다.
예를 들어, 사용자에게 전자 메일을 보낸 경우 socket.io가 사용자에게 실시간 알림을 표시하기를 원합니다.
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는 서버 측 작업에 적합하며 현재이 도메인에없는 연결과 함께 사용할 수 있습니다. 웹 소켓이나 플래시 소켓이있을 때 왜 긴 폴링을합니까?
나는 투쟁 남자를 안다! 그러나 최근에는 Workerman과 거의 일했습니다. 이 PHP 프레임 워크를 우연히 발견하지 않은 경우이를 확인하는 것이 좋습니다!
Workerman은 빠르고 확장 가능한 네트워크 응용 프로그램을 쉽게 구축 할 수있는 비동기 이벤트 중심 PHP 프레임 워크입니다. (방금 웹 사이트 hahahah http://www.workerman.net/en/ 에서 복사하여 붙여 넣었습니다 . )
이것을 설명하는 쉬운 방법은 웹 소켓 프로그래밍과 관련하여 실제로 필요한 것은 서버 또는 로컬 서버 (작업하는 곳마다)에 2 개의 파일을 두는 것입니다.
server.php (모든 클라이언트 요청에 응답 할 소스 코드)
client.php / client.html (요청하는 것들을 수행 할 소스 코드)
따라서 기본적으로 server.php 의 코드를 먼저 작성 하고 서버를 시작하십시오. 일반적으로 더 많은 어려움을 겪는 창을 사용함에 따라이 명령을 통해 서버를 실행합니다-> php server.php start
xampp를 사용한다면 좋습니다. 한 가지 방법이 있습니다. 파일을 넣고 싶은 곳으로 이동하십시오. 우리의 경우, 우리는 파일을 넣을 것입니다
C : /xampp/htdocs/websocket/server.php
C : /xampp/htdocs/websocket/client.php 또는 client.html
로컬 서버에 해당 파일이 있다고 가정합니다. Git Bash, 커맨드 라인 또는 터미널을 열거 나 여기에서 PHP 라이브러리를 사용하여 다운로드하십시오.
https://github.com/walkor/Workerman
https://github.com/walkor/phpsocket.io
나는 보통 작곡가를 통해 다운로드하고 PHP 스크립트에서 해당 파일을 자동로드합니다.
또한 이것도 확인하십시오. 이것은 정말 중요합니다 ! client.php 또는 client.html이 server.php 와 통신 하려면이 자바 스크립트 라이브러리가 필요합니다. 실행할 때 합니다.
https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client
방금 내 server.php 및 client.php와 동일한 수준에서 socket.io-client 폴더를 복사하여 붙여 넣었습니다.
다음은 server.php 소스 코드입니다
<?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 소스 코드가 있습니다
<!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>
다시 한 번, server.php 파일을 넣은 명령 행 또는 git bash 또는 터미널을여십시오. 따라서 우리의 경우 C : / xampp / htdocs / websocket /이며 php server.php start에 입력하고 Enter 키를 누릅니다.
그런 다음 브라우저로 이동하여 http : //localhost/websocket/client.php 를 입력 하여 사이트를 방문하십시오. 그런 다음 해당 텍스트 상자에 아무것도 입력하지 않으면 이동 중에 기본 PHP 웹 소켓이 표시됩니다!
당신은 단지 기억해야합니다. 웹 소켓 프로그래밍에서는 서버와 클라이언트 만 있으면됩니다. 서버 코드를 먼저 실행하고 클라이언트 코드를여십시오. 그리고 당신은 그것을 가지고 있습니다! 도움이 되었기를 바랍니다!
WebSockets의 백엔드로 PHP를 실제로 사용하려면 다음 링크를 사용하십시오.
이건 어때요 ? PHPSocketio ?? socket.io PHP 서버 측 대안입니다. 이벤트 루프는 pecl 이벤트 확장을 기반으로합니다. 지금까지 직접 시도하지는 않았지만.
아직 시도하지는 않았지만 ReactPHP 및 this socket component 로이 작업을 수행 할 수 있어야합니다 . Node와 비슷하지만 PHP에서 보입니다.
이 라이브러리에서 php http://phptrends.com/category/70 을 찾으십시오 . 또는 php http://www.php.net/manual/en/book.sockets.php 에서 native를 사용 하십시오 .
PHP가 socket.io 메시지를 클라이언트에게 보내도록하는 간단한 방법을 찾고있었습니다.
추가 PHP 라이브러리가 필요하지 않으며 소켓 만 사용합니다.
다른 많은 솔루션과 마찬가지로 웹 소켓 인터페이스에 연결하는 대신 node.js 서버에 연결 .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!");
json으로 변환되어 클라이언트로 전달되는 배열을 보낼 수도 있습니다.
sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));
이는 클라이언트가 서버에서 합법적 인 메시지를 받고 있다는 것을 "신뢰"하는 데 유용한 방법입니다.
또한 수백 명의 클라이언트가 데이터베이스를 쿼리하지 않고도 PHP가 데이터베이스 업데이트를 전달하도록 할 수 있습니다.
나는 이것을 빨리 발견했으면 좋겠다-이것이 도움이되기를 바랍니다! 😉
s.remoteAddress;
있습니다. 그러나 나는 그것을 작동시키지 않습니다. 노드에서 연결을 얻고 연결을 감지하고 원격 주소가 정확하지만 s.on('data')
절대 발생하지는 않지만 아무 일도 일어나지 않습니다. 나도 시도 s.on('msg')
했다. 정확한 PHP 코드를 사용하고 있습니다. 노드 서버에 https를 사용하고 있지만 중요하지 않습니까?
8080
입니까? 그렇지 않은 경우 포트를 변경해야합니다. 그렇다면 Remote Address
반환되는 주소를 확인하십시오-루프백 / 로컬 주소인지 확인하십시오-서버 설정과 다를 수 있습니다. 테스트를 위해 라인을 제거 할 수 있습니다if(s.remoteAddress == "::ffff:127.0.0.1")