Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Integracja php z node.js
foxbond
post
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

Ostrzeżenie: (0%)
-----


Tworzę obecnie grę przez przeglądarkę. Zdecydowałem się na php+mysql po stronie serwera (z gotowym miejscem na implementację memcache) i html+css+js po stronie przeglądarki (bez uroków html5). Dodatkowo do gry równolegle powstaje klient w c#.


Nie przewiduję 100k graczy on-line, raczej coś koło tysiąca więc uznałem, że w/w technologie wystarczą, wręcz mają jeszcze zapas.

Przemieszczanie się po mapie jest real-time względem innych graczy, a sama walka jest w zamyśle turowa. (dopiero biorę się za jej tworzenie).

komunikacja klient<->serwer
mapa:
klient odpytuje serwer co 1s lub gdy wykona dowolną akcję (poruszy się, zmieni eq)

walka:
W planie było tak samo.

Komunikacja odbywa się za pomocą API (a nie każde zapytanie ma inną strukturę, każdy POST inny schemat). Dzięki temu możliwe jest tworzenie klienta w C# przez inną osobę.

Uznałem jednak, że jest to dość niewygodne rozwiązanie. Nie chcę skazywać na zapomnienie silnika napisanego w php. Nie jest on ukończony, ale pochłonął wystarczająco dużo godzin, aby go uznać za 'cenny'.


Wydumałem sobie, aby połączyć node.js z php. Czyli komunikacja by wyglądała mniej więcej w ten sposób:

Kod
klient<->node<->php
           |     |
            mysql


klient - widok;node - kontroler;php - część wykonawcza


Prosiłbym o rady w jaki sposób mogę wykonać integrację node z php, w jaki sposób wykonać skrypty php przez node. W tym wypadu klient nie musiałby odpytywac serwera co 1s, tylko node (socket.io) sam wykonywałby skrypt php i wysyłał dane do klienta.


Z góry dziękuję



Jeśli ktoś jest zainteresowany samym projektem mogę wysłać linki na pw, nie chcę, aby temat wyglądał na reklamę.

Ten post edytował foxbond 15.09.2013, 10:18:09
Go to the top of the page
+Quote Post
R4D3K
post
Post #2





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Witam, trochę mało informacji zawarłeś żęby dokładniej Ci odpowiedzieć.
Jak rozumiem kolega tworzy klienta w C# a ty tylko chcesz tak naprawdę postawić serwer REST do synchronizacji danych między graczami ? Jeśli tak to nodejs będzie zdecydowanie lepszy bo zużyje ci mniej pamięci i ogólnie jest lżejszy (bo do phpa musisz postawić serwer www), jak czytam:
Cytat
dopiero biorę się za jej tworzenie

to przeniesienie kodu z php na nodejs nie będzie problemem. Bardziej mnie martwi wasze podejście:
* użycie mysqla do odpytywania serwer co 1s tutaj polecam na dane, ktore mają się często zmieniąc jak pozycja gracza lub mapka gry użyć memcache lub nawet zwykłej zmiennej w nodejs (bo dopóki aplikacja odpalona na serwerze wtedy zmiena jest w pamięci i dostępna co requesty dla klienta)
* odpytywanie co 1s beznadziejny pomysł, w sensie wykonuj requesty wtedy kiedy są potrzebne bo tylko zarżniesz serwer np wykonujesz ruch wtedy klient wykonuje request do serwera, przeciwnik ruszy się po planszy wykonaj request z serwera do klienta któremu pokarzesz że przeciwnik się rusza
* Klient w c# i websockety ? LOL Websockety są stardartem w przeglądrakach do ciągłej komunikacji i powstały jako rozwinięcie koncepcji long polling, użyj zwykłych socketów mniej danych między pakietami będzie leciało => lepsze latency
Go to the top of the page
+Quote Post
foxbond
post
Post #3





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

Ostrzeżenie: (0%)
-----


Już lepiej tłumaczę i wraz z propozycjami zmieniam nieco założenia.

Do gry istnieją (będą) dwa klienty: przeglądarkowy i desktopowy. Z punktu widzenia serwera nie ma różnicy między nimi (między ich zapytaniami).

Wszelkie dane gry będą znajdywać w memcache, które jest dostępne dla php i node.js
Co 1min będzie zapis z memcache do mysql (backup #1)
Co 4h będzie robiony dump mysql. (backup #2)

Cytat
biorę się za jej tworzenie

Tu miałem na myśli stricte walki. Reszta jest na dość zaawansowanym poziomie. Oczywiście wraz z upływem czasu postaram się wszystko przepisać na node.js, aby nie mieszać silnika pomiędzy dwie technologie.


'websockety' do zły wybór nazwy przeze mnie, nie wiedziałem o różnicy. Zastosuję 'sockety'


'odpytywanie co 1s beznadziejny pomysł'
Właśnie dla tego chcę przejść na node i komunikację dwustronną.



Tą integrację node z php może jakoś przez fastcgi wykonać? Widziałem arty w necie, ale proszę o 'dość' stabilne rozwiązanie, najlepiej z przykładami. (najlepiej pojmuję na przykładach)


Dzięki za zainteresowanie
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Nie będę się wypowiadał na temat samej gry i rozwiązań jako takich = bo szczerze dawno takich rzeczy nie robiłem a nieco się pozmieniało jeśli chodzi o techniki i technologie od czasu gdy ostatni raz coś działałem w takim temacie.

Znam nieco (no może nieco bardziej) natomiast node.js - z tego co ogólnie wiadomo jest on wręcz stworzony do takich zastosowań - mam jednak obawy co do połączenia PHP z NJS... Czemu chcesz to łączyć? NJS sam w sobie do obsługi warstwy API/komunikacji jest w pełni wystarczający - potrafi przetwarzać dane i wykorzystywać MC i MySQL - po co tu pchasz PHP, który wprowadzi IMO opóźnienia (bo będzie wywoływany pośrednio).

Mogę być w błędzie bo nigdy tego nie porównywałem ale moim zdaniem struktura:

API -> NodeJS / strona statyczna -> PHP

będzie lepsza/szybsza/wydajniejsza od:

API -> NodeJS -> PHP / strona statyczna -> PHP

(przez stronę statyczną rozumiem generowanie HTML)

A może źle to zrozumiałem?
Go to the top of the page
+Quote Post
foxbond
post
Post #5





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

Ostrzeżenie: (0%)
-----


Będę dążył do przepisania tego co mam w php, ale ważniejsze jest napisanie tego, co jeszcze nie jest gotowe.

Pokażę na pseudokodzie o co mi mniej więcej chodzi. (Jeśli chodzi o javascript to znam bdb, ale w node funkcjonuje on troszkę inaczej)

Kod
var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

var php = require('phpHandler');

app.listen(80);

function handler (req, res) {
//gra ma tylko jeden plik index, reszta wszystko już dynamicznie
  php.execute("index.php");
}

io.sockets.on('connection', function (socket) {
  socket.emit('init', { initData: '<initData>' });
  socket.on('walk', function (data, fn) {
     //w jakiś sposób trzeba przekazać te parametry do php
    var result = php.execute("extAPI.php", "a=walk&d="+data);
    fn(result)
  });
  socket.on('innaFunc', function(data, fn){
    //inna funkcja już napisana w js
    /**





    **/
    fn(result);
  });
});


Oczywiście jest to schemat bardzo uproszczony. Zgłębiam się w tę technologię dla tego projektu, wcześniej nie miałem z nią do czynienia.

Może polecicie też wygodne IDE dla node? (win/linux)


Jeśli nie jest to możliwe będę musiał od razu napisać wszystko od nowa. Nic tak nie zdenerwuje ludzi jak oczekiwanie na nową wersję.
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Architektura, gdzie przy każdej, najmniejszej akcji będziesz wywoływał skrypt PHP, który musi sobie wczytać cały silnik gry to jakieś nieporozumienie. Będzie to bardzo wolne i zasobożerne.
2. Jeżeli już musisz ten silnik mieć w PHP (bardzo słaby dobór platformy) powinieneś rozważyć utworzenie daemonu i komunikację z nim przez sockety.
Go to the top of the page
+Quote Post
-arrtxp-
post
Post #7





Goście







Ehe, musisz przemyśleć to jeszcze raz... (IMG:style_emoticons/default/smile.gif)
Node.js... nie zrobisz tutaj tyle co w php, ale zrobisz to co niedasz rady w php. Rzecz ujmując to tylko odciebie zależy jak to wykorzystasz (IMG:style_emoticons/default/smile.gif)

" Ponoć " margonem opiera się na serwerze w c++ i javascript, no idaję radę (IMG:style_emoticons/default/smile.gif)
Mfo3 leci na nginx, php, memecache, javascript i daję radę. To poprostu tylko od Ciebie zależy ile serwer pociągnie.

I smierdzi mi tu " danarroth " ;p

Ten post edytował arrtxp 16.09.2013, 15:09:00
Go to the top of the page
+Quote Post
foxbond
post
Post #8





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

Ostrzeżenie: (0%)
-----


Jakie Danarroth, jakie Danarroth (IMG:style_emoticons/default/wink.gif)

Zobaczymy co z tego wyjdzie. Postanowiłem, że zacznę wszystko od nowa. Jestem na etapie konfigurowania linux-a i pierwszych hello-world-ów. W sumie jeśli raz już się coś napisało, to wykonanie tego samego w innym języku (gdy mamy już rozpisaną całą strukturę plików/db i sposób działania) jest dość proste (jedynie monotonne).


Ponowię tylko pytanie o IDE na linux-a. Do tej pory pisałem tylko w Win, a planuję w miarę możliwości przenosić się na Linuxa. W końcu po co na przemian wczytywać systemy, lepiej wszystko zrobić na jednym.
Go to the top of the page
+Quote Post
-arrtxp-
post
Post #9





Goście







Serwerujesz na własnym kompię ?

Wiesz, niema problemu nad przechodzeniem z windowsa na linuxa, gorzej z linuxa na windowsa (IMG:style_emoticons/default/haha.gif)
Go to the top of the page
+Quote Post
R4D3K
post
Post #10





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


Nie ma dedykowanego IDE dla nodejs, polecam poszukać w pluginach do netbeansa lub eclipsa. Jeśli chodzi o łączenie php z nodejs to ja polecam schemat taki:
* php będzie głównie odpalane przez CLI (z wiersza poleceń), w cronie, stwórz demona która raz na jakiś czas będzie odpalał się i sprawdzał memcached. I będzie zapisywał dane w mysqlu
* nodejs będzie reagował eventami na zdarzenia websocketów => jeśli chcesz klienta przeglądarkowego to tutaj websockety, żeby nie dublować funkcjonalności możesz już i klienta c# też zostwić websockety.
* nodejs będzie zapisywał dane współdzielone w memcached php jakiś tam częsciowy backup będzie wykonywał
Jedna rada co do phpowej sesji to ustwa sobie handler na memcached oraz serializuj w jsonie dzięki temu będziesz miał do niej dostęp z poziomu nodejs w łatwy sposób. Nie korzystaj natomiast z FastCGI to nie do tego służy i tylko spowolni Ci serwa. Tak z ciekawości co to za projekt ?

Ten post edytował R4D3K 16.09.2013, 18:45:18
Go to the top of the page
+Quote Post
foxbond
post
Post #11





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

Ostrzeżenie: (0%)
-----


Projekt zwie się Borderless Engine, a gra na nim powstająca to Danarroth


Zostaję przy konfiguracji:

shared . . . . . . . . . . . . . . . . . . . . . . . . VPS

main_page->game - - - sockets - - - siltaz+node.js

(troszkę źle to obrazuję, ale przecież nie muszę zdradzać wszystkich schematów działania)


Na VPS nie będzie nic prócz samego serwera w node, nie muszę uruchamiać webserva - prostsza konfiguracja.



Znalazłem już wtyczkę do eclipse (nodeclipse), jak przebrnę przez errory to ocenię (IMG:style_emoticons/default/wink.gif)




Dziękuję za odpowiedzi, można zamknąć lub zostawić dla potomnych.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 08:39