Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][NODEJS][WEBSOCKET] Wysłanie wiadmości prosto z php
Forum PHP.pl > Forum > PHP
styryl
Witam,

Serwer postawiony jest przy użyciu node.js, klienci podłączeni są poprzez javascript w przeglądarce, wiadmości też są wysyłane z poziomu javascript.

  1.  
  2. var socket = io.connect('http://localhost:8123');
  3.  
  4. var data = {"action": "stock/product/list", "object_id": "<?php echo $id; ?>" };
  5.  
  6. socket.emit('send_action', data );
  7.  


odbiór danych

  1.  
  2. socket.on('update_action', function ( name, data) {
  3.  
  4. // tutaj jakieś akcje.
  5.  
  6. });


Wszystko postawione na windowsie.

Teraz moje pytanie:

Chciałby mieć możliwość wysyłania wiadmości również z poziomu kodu php a nie tylko z javascript. Czy jest taka możliowść? Szukałem trochę po sieci ale nic ciekawego nie znalazłem. Będę bardzo wdzięczny za jakąkolwiek pomoc w tym temacie.
Niktoś
Tutaj masz implemetacje websockets,abyś mógł korzystać od strony serwera.
http://code.google.com/p/phpws/
Powiem Tobie ,że nie wszystkie przeglądarki mają wsparcie dla websocket'ów tak więc twoja stronka nie będzie wszędzie działać.
cudny
Node.js jest jedną z najnowszych technologii i gwarantuję Ci, że warto tego używać, tym bardziej, że nie musisz korzystać ze standardowych zapytań ajax'a od strony klienta - jeśli nastąpiła jakaś zmiana na serwerze to wysyła request do klienta, nie obciąża serwera i w ogóle jest super !
Poza tym, jeśli nie radzisz sobię z node.js i jego bibliotekami to można wykonywać także request do kodu php.
Istnieje wiele innych bibliotek, które są w stanie zastąpić php całkowicie:
https://github.com/joyent/node/wiki/modules

Acha, biblioteki są tak skonstruowane, że wsparcie jest dla każdej przeglądarki, to nie jest czysty websocket !
styryl
Node jest świetny ja to wiem. Ale w tym wypadku wykorzystać go chce stricte jako serwer websocket. Node wykorzystuje do synchronizowania się aplikacji po zmianach (ktoś coś zmieni i wszystkim się akualizuje np otwarte listy, podglądy itd). Teraz jest to zrobione wszystko w js jednak dużo wygodniej byłoby wysyłać zmiany do serwera websocket z poziomu php

  1.  
  2. if ( formularz wysłany i dane zapisane ) {
  3.  
  4. wyslij_do_serwer_websocket( dane_do_wyslania );
  5.  
  6. }
  7.  


Dlatego szukam czegoś co pozwoli mi wysłać dane do serwera które zostaną przekazane do podłączonych klientów.
cudny
Nie rozumiem w czym jest problem, przecież możesz dać w jQuery po stronie klienta:

  1. $(document).onload(function() {
  2. var isPost = false;
  3. <?php if(isset($_POST['costam'])) echo 'isPost = true;'; ?>
  4. socket.on('connect', function () {
  5. if(isPost) {
  6. socket.emit('update_action', {data:'to co chcesz wyslac'});
  7. isPost = false;
  8. }
  9. });
  10. });


Poza tym możesz zainteresować się też bazami danych nosql, np. couchdb - masz do node.js fajne biblioteki, które nasłuchują czy coś się w bazie zmieniło - jeśli tak to można dać sobie emit smile.gif
Polecam, wszytko na json'ie

Pomogło smile.gif ?
wookieb
To co masz teraz robi się za pomocą ajax-a a nie websocketów.
Używaj właściwego narzędzie do jego przeznaczenia.
Nie napalajcie się tak bardzo na te websockety bo to jeszcze nie działa tak fajnie. http://caniuse.com/#feat=websockets

Poza tym jeżeli chcesz wywoływać socket z poziomu php to słabo zaprojektowałeś system z poziomu node.js skoro musisz działać naokoło. Do komunikacji wewnętrznej stosuje się protokoły binarnej wymiany danych (Thrift, Protocol Buffers)
Niktoś
W pełni zgadzam się z tym co powiedział Wookieb. Fajny wykres ,można wywnioskować ,że urządzenia mobilne na tym w ogóle nie pójdą.
cudny
Cytat
Nie napalajcie się tak bardzo na te websockety bo to jeszcze nie działa tak fajnie. http://caniuse.com/#feat=websockets

Samo node.js tak, ale wspierane przez socket.io to już inna historia:
http://socket.io/#browser-support

Zgadzam się, że jeśli trzeba używać php do wysyłania danych to coś jest nie tak z samą aplikacją i można pomyśleć o czymś innym.

Ogólnie node.js + socket.io są fajnymi narzędziami dla urządzeń mobilnych w połączeniu z bazami nosql.
styryl
Z tym że, system jest przeznaczony do używania tylko i wyłącznie na FF, do tego działa na wielu oknach przeglądarki. I co bardzo ważne jeżeli któryś z użytkowników zaktualizuje dane to u innych użytkoniwków ma się też zaktualizować w "czasie rzeczywistym" bez przeładowania całej strony(okna) czyli np jeden wiersz na liście. Zastosowanie w tym aspekcie ajaxa polegało by na long poolingu co oznacza spore obciążenie, dlatego zastosowanie websocketów jest tutaj najlepszym rozwiązaniem. Node pracuje tylko i wyłącznie jako serwer websocket.
Niktoś
Cytat

Ale ja tam nie widzę implementacji dla PHP.
cudny
Cytat
Z tym że, system jest przeznaczony do używania tylko i wyłącznie na FF, do tego działa na wielu oknach przeglądarki.


Już Ci napisałem, że razem z socket.io będzie działało wszędzie.

Cytat
Ale ja tam nie widzę implementacji dla PHP.


A o co Ci chodzi, bo nie rozumiem ?
Tam jest tylko pokazana kompatybilność socket.io z przeglądarkami
styryl
Cytat(cudny @ 20.03.2012, 13:35:44 ) *
"Z tym że, system jest przeznaczony do używania tylko i wyłącznie na FF, do tego działa na wielu oknach przeglądarki."

Już Ci napisałem, że razem z socket.io będzie działało wszędzie.


Tak wiem, mam to tak zrobione i działa, z tym że jak chce przekazać jakiekolwiek dane to musze wszystko wypluwać do widoku, i puszczać przez js. Chciałem to zrobić tak aby zamiast używać js do wysyłania danych do serwera websocket wysyłać w php.


Niktoś
Cudny popatrz może na przykłady.
przecież to socket.io jest to przestrzeń nazw przeznaczona dla języka java lub c#.
Gdzie w PHP masz typ zmiennej var po stronie serwera?
cudny
Cytat(styryl @ 20.03.2012, 13:38:36 ) *
Tak wiem, mam to tak zrobione i działa, z tym że jak chce przekazać jakiekolwiek dane to musze wszystko wypluwać do widoku, i puszczać przez js. Chciałem to zrobić tak aby zamiast używać js do wysyłania danych do serwera websocket wysyłać w php.



A skąd niby te dane pobierasz do php ?
Z resztą, co takiego wysyłasz, że nie możesz tego przekazać do widoku.

Cytat(Niktoś @ 20.03.2012, 13:39:31 ) *
Cudny popatrz może na przykłady.
przecież to socket.io jest to przestrzeń nazw przeznaczona dla języka java lub c#.
Gdzie w PHP masz typ zmiennej var po stronie serwera?



Ale jakie PHP ?
Przecież to javascript
Niktoś
Cytat
Ale jakie PHP ?
Przecież to javascript


No to żeś pojechał.
Node.js owszem to java script.
socket.io to nazwa przestrzeni przeznaczona dla języka java lub może c#.

Faktycznie to javascript sorki ,ale po stronie serwera??Już nie czaje,przecież to język kliencki
cudny
Cytat(Niktoś @ 20.03.2012, 13:45:04 ) *
No to żeś pojechał.


Bardzo proszę o przetłumaczenie mi Niktosia.
Pisałeś już Niktoś cokolwiek w node.js ? pozatym, czy końcówka .js mówi Ci coś ? Czy widziałeś socket.io ? a czy pisałeś w nim cokolwiek ?
Jeśli spytasz mnie o to samo to odpowiem: TAK !
styryl
Jest załóżmy lista produktów którą ma otwartą x osób te x otwartych okien z listą produktów jest połączone z serwerem na node.js poprzez socket.io. Teraz jedna z nich rozpoczyna edycję jedengo produktu z listy. Otwiera się nowe okno. Gdy skończy edycję klika zapisz dane są zapisywane do bazy. Teraz aby zaktualizować ten jeden wiersz na liscie u wszsytkich osób muszę wsysłać dane poprzez socket.io czyli w js a co za tym idzie musze wszystko pobrać ( powiązania z innymi tabelami w bazie itd bo w liście są prezentowane w każdym wierszu dane z kilku powiązanych tabel ) i wysłać do widoku aby przesłać dalej do serwera na node.js.
Niktoś
Zmyliło minie ,że autor rozdzielił to na serwer/client.Gdzie logicznie można takiego podziału użyć w javascript?
cudny
Cytat(styryl @ 20.03.2012, 13:49:40 ) *
Jest załóżmy lista produktów którą ma otwartą x osób te x otwartych okien z listą produktów jest połączone z serwerem na node.js poprzez socket.io. Teraz jedna z nich rozpoczyna edycję jedengo produktu z listy. Otwiera się nowe okno. Gdy skończy edycję klika zapisz dane są zapisywane do bazy. Teraz aby zaktualizować ten jeden wiersz na liscie u wszsytkich osób muszę wsysłać dane poprzez socket.io czyli w js a co za tym idzie musze wszystko pobrać ( powiązania z innymi tabelami w bazie itd bo w liście są prezentowane w każdym wierszu dane z kilku powiązanych tabel ) i wysłać do widoku aby przesłać dalej do serwera na node.js.


A dane tych produktów gdzie są zapisywane ?
Bo po zatwierdzeniu edycji możesz przesłać poprzez emit do serwera co się zmieniło, a pos tronie serwera przesłać co trzeba do zalogowanych użytkowników.
Ale jak już wyżej pisałem, zainteresuj się couchdb:
  1. var cradle = require('cradle');
  2.  
  3. // COUCHDB CONFIG
  4. var db = new(cradle.Connection)().database('baza');
  5.  
  6. var feed = db.changes({ since: 1,include_docs: true });
  7. feed.on('change', function (change) {
  8. if(change && change.doc && users[change.doc.user_id]) {
  9. for(var i in users[change.doc.user_id]) {
  10. if(i != 'length') {
  11. clients[i].socket.emit('data',change.doc.name);
  12. }
  13. }
  14. }
  15. });

Powyższy przykład załatwia Ci wysyłanie danych jeśli coś się zmieniło w couchdb.
Napisz mi w jakiej bazie zapisujesz dane


Cytat(Niktoś @ 20.03.2012, 13:59:26 ) *
Zmyliło minie ,że autor rozdzielił to na serwer/client.Gdzie logicznie można takiego podziału użyć w javascript?


Na serwerze node.js używa się javascript'u
wookieb
@Niktoś błagam milcz bo Twój poziom wiedzy na takie tematy jest naprawdę żałosny. "Nie znam się to się wypowiem" nie powinno być Twoim mottem życiowym.

Fallbacki w Socket.io to nie jest taka fajna sprawa. long polling to bardzo słabe rozwiązanie. Na szczęście jest flash fallback.
Flash od dawna miał i nadal ma sockety gdzie wszystko było płynne, działało. A teraz ery HTML5 się zachciało.

Styryl - powtarzam. Komunikacja pomiędzy php <-> ssjs = protokoły binarne.

styryl
Jestem zmuszony do mysql. Tak więc dane są w mysql. Do tego jest powiązanych wiele tebel tak więc aby wiersz na liście się zgadzał to i tak muszę wykonać select na bazie i wysłać dalej. Chciałem poprostu uniknąć stosowania dodatkowego kodu js w widoku i zbędnego przekazywania danych.
cudny
W takim wypadku możesz po stronie node.js wykonywac
Kod
setInterval(function() { //zapytanie do bazy dancyh}, 10000}
i sprawdzać czy zostały jakieś zmiany dokonane, ale to bezsens !

Kod
var mysql    = require('mysql');

// MYSQL CONFIG
var client    = mysql.createClient({ user:'root',password:'XXX });
client.query('USE nazwa_bazy);
client.query('SELECTzmiany FROM table WHERE ... ', function selectCb(err, results) {
console.log(rsults)
});


Wyślij normalnie request do node.js i roześlij to tak jak powinno być zrobione.
Niktoś
Próbuje to zrozumieć ,ale jakoś nie umiem ,jak następuje nawiązanie połączenia z bazą danych.Jak ta technika jest interpretowania tego ,przez javascript?Jak tak to czy nawiązanie połączenia z bazą danych po stronie klienta jest bezpieczne ,ktoś mógłby wytłumaczyć.Ja takich klocków nie widziałem jeszcze,więc Wookieb nie bulwersuj się,bo jeśli ktoś rozdziela funkcjonalnośc na serwer/klient w klienckim języku skryptowym,to dla mnie javascript jest już językiem serwer-side.W c# spotkałem się z interpretacją websocketów ,ale użycie jej było całkowicie odizolowane od javascript.Próbuje zrozumieć jak to działa.
wookieb
Javascript to język programowania. To co widzisz po stronie klienta w JS to obudówka o DOM-a i masę innych ficzerów.
Websockets to też obudówka na sockety.
Niktoś
No dobra ,ale czy podawanie w tej obudówce websocket, connection stringa do bazy jest bezpieczene?Przecież kod js jest jawny.
Cytat
var client = mysql.createClient({ user:'root',password:'XXX });
cudny
ten javascript wykonuje się po stronie serwera a nie klienta. używają tego duże serwisy, ba nie chce mi się szukać Linka, ale zostało to okrzykniete technologia 2011 roku. ogólnie zainstaluj sobie node.js u siebie i poczytaj jak to uruchomić i jak s tego korzystać. dowiesz się wszystkiego
a wyglądało jakbyś wiedział o czym piszesz wink.gif
Niktoś
Jestem ciekaw jak to zrealizowali, w wolnej chwili poczytam.Czyżby javascript nie był już technologią klient-side teraz już jest również serwer-side?
Muszę to koniecznie poczytać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.