Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Integracja php z node.js
foxbond
post 15.09.2013, 10:14:48
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 15.09.2013, 22:33:00
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 16.09.2013, 07:34:06
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 16.09.2013, 09:00:49
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?


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
foxbond
post 16.09.2013, 14:10:00
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 16.09.2013, 14:28:54
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 16.09.2013, 15:00:47
Post #7





Goście







Ehe, musisz przemyśleć to jeszcze raz... 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 smile.gif

" Ponoć " margonem opiera się na serwerze w c++ i javascript, no idaję radę 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 16.09.2013, 15:31:41
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 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 16.09.2013, 15:36:35
Post #9





Goście







Serwerujesz na własnym kompię ?

Wiesz, niema problemu nad przechodzeniem z windowsa na linuxa, gorzej z linuxa na windowsa haha.gif
Go to the top of the page
+Quote Post
R4D3K
post 16.09.2013, 18:44:07
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 16.09.2013, 19:14:03
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ę 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2025 - 23:37