Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czy musze poling owac bazę aby mieć atualne dane?
Forum PHP.pl > Forum > Bazy danych > MySQL
mrowka72
mam clip flash dzięki któremu odpytuję bazę co 1 s
tzn odpytuję plik.php
on wykonuje zapytanie na bazie
SELECT kolor from kolory where id =1;
Czy można zrobić tak , że wyslę zapytanie a odpowiedź uzyskam jak zmieni się wartość w bazie?
aki poling przecierz żdżera zasoby
we flaschu jest zdarzenie onData zatem zaczekałby za odpowiedzią
myslę że pomocnym mógłby być jakiś triger lub wyzwalacz.
proszę o pomoc!
elessar
Nie mozesz czegos takiego zrobic.
ps. Trigger a wyzwalacz to to samo.
Vogel
tiggery to jedyne rozwiazanie.

hmm... czyzbys robil phpowo-flashowy czat?

jesli tak to garsc rad:
1) zrezygnuj z "zapytywania co 1s" bo to bezsensu
2) zainteresuj sie php CLI (command-line)
3) zainteresuj sie socketami w php
4) flash MOŻE nawiązywać stałe połaczenia (xmlsocket)

mozesz wiec napisac prosta aplikacje dla php CLI, ktora bedzie nasluchiwala na okreslonym porcie. flashyk przy pomocy laczy sie z twoim serwerem. pakiety slesz gdy MASZ co wysylac, oszczedzasz czas, zapytania i wydajnosc.

jak dotre do domu to moze nawet odgrzebie zrodla ;] testowalem na 2 kompach (via internet) i spokojnie obslugiwalo 100 polaczen (serwerek 128kpbs). a wymagania php CLI sa malutkie ;D
elessar
@Vogel a moglbys napisac jak chcesz sprawdzic czy cos sie w bazie nie zmienilo?

Jedyne co mi przyszlo do glowy to napisac wlasnego UDF ktory bylby w triggerze odpalany i on by nadawal do serwera ktory by sobie zapamietywal czas ostatniej zmiany. Ale to jest dobre tylko jak ma sie wlasny serwer. No a pozatym to trzeba miec troche wiedzy smile.gif
Vogel
a od czego Sesje? zapamietujesz w niej date ostatnieog wywolania skryptu i tej daty uzywasz przy jego kolejnym wykonaniu.
elessar
@vogel, Ale biega o to zeby te kolejne wywolanie bylo w momencie zmiany/dodania nowych danych do bazy. Wiec nie rozumie co ma do tego sesja? Co z tego ze uzyjesz daty ostatniego wywolania jak i tak musisz przepytac baze.

@mrowka72, Chodzi mi po glowie pare pomyslow jak to inaczej zrobic, ale musisz napisac dokladnie do czego to ma sluzyc :-)
Vogel
eee... moment. nie rozumiemy sie.

przedstawilem prosty sposob na obejscie tego problemu - polaczenia stale. i nie, nie musze przepytywac bazy - generalnie nie potrzebuje do tego ŻADNEJ bazy (chyba ze ktos chce to zapisywac). po prostu jesli klient wysyla zapytanie do serwera to serwer rozsyla to do pozostalych userow z ktorymi ma polaczenie. i wuala. polaczenia stale.
mrowka72
dzięki ci @Vogel twoje pomycły są ekstra!
jusz śpieszę z wyjasnieniem przeznaczenia aplikacji

mam termometr i parę innych czujników podpiętych pod port kompa zrobiłem programik w VB aby ich wartości zapisywał w bazie MySQL będącej na tym samym kompie (jest tam i Apache) i...
teraz chciąłbym podglądać je przez internet na PDA
zrobiłem fajny interfeis we flahu tyle że te zmiany w termometrze czasami są szybkie (5 razy na s) a czasami przez godinę się ic nie zmienia .
w VB do bazy wysyłam tylko jak się zmiena ale od strony flasha musiałem pingować bazę .

PS. bardzo podoba mi się pomysł z "polaczeniem stałym" tylko by musiął mnie ktoś oświecić lub naprowadzić na jakiś tutroial
LBO
wykorzystaj pomysl ~VOGEL, a programik VB niech nie zapisuje do bazy wynikow tylko wyrzuca na socketa (prosto do flashyka biggrin.gif)

edit: w sumie mozna sie obejsc bez MySQL i bez php...
mrowka72
ok więc proszę o jakies namiary na temat socket w flash i php
Clip flasha musi być na stronie

znalazlem coś takiego dla flasha: a co ma być po stronie vb?
To to jestem zielony jak wiosna

x = [];
for( var i =0; i<50; i++)
{
x[i] = new XMLSocket();
x[i].n = i;
x[i].onConnect = function(s)
{
if( s )
{
this.connected = true;
this.onData = function( m )
{
if( m == '' ) return;
var dt = getTimer() - m;
trace( '['+this.n+'] <- '+m+'( LAG:'+dt+' )' );
}
}
}
x[i].connect( "192.168.2.15", 1819 );
}
this.i = 0;

this.onEnterFrame = function()
{
if( x[this.i].connected )
{
var m = getTimer();
trace( '['+this.i+'] -> '+m );
x[this.i].send( m+'\0' );
}
this.i = this.i == 49 ? 0 : this.i+1;
}
LBO
pogooglowac troche...


moze to sie przyda?

edit: powyzszy link, moze nie rozwiazac twojego problemu... reason? nie znam VB
Vogel
  1. <?php
  2.  
  3.  
  4.  
  5. $address = '127.0.0.1';
  6. $port = 23456;
  7.  
  8. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  9. socket_set_nonblock($sock);
  10. socket_bind($sock, $address, $port);
  11. socket_listen($sock, 5);
  12.  
  13. function wyslijDoReszty($resources,$buf,$msgsock = NULL) {
  14. $buf .= chr(0);
  15. foreach($resources as $soc) {
  16.  if ($soc && ($msgsock == $soc || !$msgsock)) {
  17.  if (@socket_write($soc,$buf,strlen($buf)) == false) {
  18. getError($soc);
  19.  }
  20.  }
  21. }
  22. }
  23.  
  24. function getError($socketID) {
  25. $key = array_search($socketID, $GLOBALS['resources']);
  26. unset($GLOBALS['resources'][$key]);
  27. print $socketID." rozlaczono\n";
  28. }
  29.  
  30. print "serwer uruchomiono ".$address.":".$port."\n";
  31.  
  32. $resources = array();
  33. do {
  34. if ($c = @socket_accept($sock)) {
  35.  print "NEW CONNECTION...".$c."\n";
  36.  $msg = "Witaj... ".$c."\n".chr(0);
  37.  socket_write($c, $msg, strlen($msg));
  38.  $resources[] = $c;
  39.  unset($c);
  40. }
  41. $buf = array();
  42. reset($resources);
  43. foreach($resources as $msgsock) {
  44. if ($buf = trim(@socket_read($msgsock, 2048))) {
  45. if ($buf == 'info') {
  46. $buf = "-------------- POLACZENIA:\n".print_r($resources,true)."Ilosc polaczen: ".count($resources)."\n";
  47.  wyslijDoReszty($resources,$buf,$msgsock);
  48. print "-------------- wywolano INFO przez ".$msgsock."\n";
  49. print_r($resources);
  50. print_r("Ilosc polaczen: ".count($resources));
  51. }
  52. elseif ($buf == 'shutdown') {
  53. $buf = "-------------- SERWER WYLACZONO!\n";
  54. wyslijDoReszty($resources,$buf);
  55. reset($resources);
  56. foreach($resources as $msgsock) {
  57. @socket_close($msgsock);
  58. }
  59. print "-------------- serwer zamkniety przez ".$msgsock;
  60. }
  61. else {
  62. $buf = $msgsock.": ".$buf;
  63. wyslijDoReszty($resources,$buf);
  64. }
  65. }
  66. unset($buf);
  67. }
  68. //usleep(2000);
  69.  
  70. } while (true);
  71.  
  72. socket_close($sock);
  73.  
  74. ?>


+ flashowy klient (.exe)
+ źródło klient (flash 8.0)

1. odpalamy serwer ("php nazwaskryptu.php")
2. odpalamy klienta flash i sie laczymy
3. odpalamy drugiego klienta flash i sie laczymy
4. piszemy do siebie ;] lol
mrowka72
Wielkie dzięki coś z tego wystrugam

do zobaczenia jutro
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.