Avaleht
uus teema   vasta Tarkvara »  WWW »  massteate saatmine kasutajatele saidil? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 07.03.2008 12:46:17 massteate saatmine kasutajatele saidil? vasta tsitaadiga

Tekkis selline küsimus, et kui ma saadan mingi administraatori teate kõigile veebilehe liikmetele, siis peaks ju tegema sadu (või tuhandeid) päringuid järjest üksteise otsa?
Mul hetkel on süsteem selline, et MySQL-andmebaasis on tabel nimega näiteks "teated", kuhu sisestatakse info ja tekst. Iga kasutaja jaoks, kellele teade läheb, sisestatakse ka selle kasutaja ID, et just tema selle teate saaks. Aga kui saadan sellise teate, mis läheb kõigile, siis pidin panema teate saatmise (insert into teated...) while(){} vahele, aga see vist on serverile paras koormuse hetk? Kui sedasi teen, siis äkki hakatakse õiendama ja jään kontost ilma? icon_rolleyes.gif Äkki on mingi muu võimalus? Kuna ma ei tea seda, esimest korda hakkasin teadete peale mõtlema, siis ei tea ka seda, kas äkki nii tehaksegi ja ma ilmaasjata põen?
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 07.03.2008 12:55:10 vasta tsitaadiga

hull koormusehetk on siis, kui see päring on keerukas ja võtab aega

testi järgi ja vaata palju aega võtab (mõõda php's)
kui hakkavad juba selle peale kobisema, siis ütle et sa tegeled optimiseerimisega
ja kui hakkavad ka siis plõksima, siis on aeg teenusepakkujat vahetada
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
nn3_
HV kasutaja
nn3_

liitunud: 13.09.2003




sõnum 07.03.2008 13:14:18 vasta tsitaadiga

Ei pea iga kasutaja jaoks eraldi INSERT lauset tegema tsükliga, vaid uuri INSERT ... VALUES () või kui sisestamine sõltub näiteks teisest tabelist siis INSERT ... SELECT lauseid, nendega saad palju ridu ühe päringuga sisestada ja see on juba väga kiire (sadu tuhandeid ridu hetkega).

tsitaat:

INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas. Example:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

http://dev.mysql.com/doc/refman/5.0/en/insert.html
http://dev.mysql.com/doc/refman/5.0/en/insert-select.html
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 07.03.2008 18:08:41 vasta tsitaadiga

Hetkel on mul nii:
$sql = "SELECT ID FROM kasutajad";

$alusta = microtime();

$res = mysql_query($sql);
while($row = mysql_fetch_row($res)){

   $id = $row[0];

   $res2=mysql_query("INSERT INTO teated (`1`, `2`) VALUES ('$1', '$2')");
   echo mysql_error();


}//while

$lopeta = microtime();
$aega = round($lopeta - $alusta, 4);

ja see annab pärast pikka ootamist teate:
Fatal error: Maximum execution time of 60 seconds exceeded ...
Vaatasin myadminist, et oli sisestanud küll palju ridu, aga siis mitte piisavalt kähku. icon_sad.gif

Siis vaatasin seda nn3_ toodud õpetust, aga hetkel jälle on see liiga hiinakeelne. Kuidas ma saan nii teha, et teade saadetakse kõigile kasutajatele, lisaks mingi where sinna juurde, et nt kõigile saadaks, kes on aktiveeritud?

Esialgu siis proovisin natuke lihtsamalt seda, vaatasin seal dev.mysql-i lehelt, tegin nii:
INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`) VALUES ('$date', '$kasutaja', '$to_id', '$from_id', '$teade') SELECT kasutajad.id FROM kasutajad

Aga tulemuseks oli täpselt sama , fatal error. icon_sad.gif
Kuigi lisas küll mingi arvu, paarsada vist...
Ma oma localhostis katsetan, mul on siin XAMPP, installitud novembris uus versioon; CPU on core2duo E4500, seega nõrk ei ole. Indikaator ka eriti ei kõssa selle ajal, kui see script seal vaikselt kuni fatal errorisse jookseb.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 07.03.2008 18:21:22 vasta tsitaadiga

pane iga while peale count'i echoma, saad teada täpse aja millal kinni läheb
teine küsimus: miks see sisestus sul nii aeglane on ? (vaid paarsada sisestust minutis)
update käsuga lendas mul paari tuhandikuga paarsada rida ümber (eraldi querydena ja enne iga query esitamist veel if'iga väärtuse kontroll ja uue väärtuse määramine vastavalt olemasolevale väärtusele, üks tabel eelnevalt siis array'sse sikutatuna et mida panna uueks väärtuseks)
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Brom
HV kasutaja
Brom

liitunud: 18.07.2005




sõnum 07.03.2008 18:44:32 vasta tsitaadiga

Sa võid kasutajad ära grupeerida.

Kuvades pealehte teeb skript kasutajanimega päringu ja, kui ta on grupis, kelle teade on määratud, siis see kuvatakse.
Kommentaarid: 13 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum
julmu
HV kasutaja
julmu

liitunud: 20.12.2004




sõnum 07.03.2008 18:55:44 vasta tsitaadiga

link :: INSERT ... SELECT Syntax

sql:
  1. INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`)
  2.     SELECT '$date', '$kasutaja', id, '$from_id', '$teade' FROM kasutajad WHERE aktiivne
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 07.03.2008 19:32:20 vasta tsitaadiga

julmu kirjutas:
sql:
  1. INSERT INTO teated (`date` , `from` , `to_id` , `from_id` , `text`)
  2.     SELECT '$date', '$kasutaja', id, '$from_id', '$teade' FROM kasutajad WHERE aktiivne

Täpselt sama ootamine ja sama error. icon_sad.gif

Kasutajaid grupeerida ei ole vaja, kuna teade läheb kõigile.
Ja seekord ei pidanud enam while() ju kasutama, kui see sama päring ise peaks kõik ära tegema.
Äkki teen ikka miskit valesti? Või on mul XAMPP kuidagi katkine? Päris serveris ei julge veel proovida.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 07.03.2008 19:43:47 vasta tsitaadiga

SGM, echo see query välja ja ära andmebaasile esita php kaudu
proovi seejärel ise käsitsi näiteks phpmyadmini, navicati või muu adminliidese kaudu see päring esitada ja vaata mis juhtub
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 07.03.2008 20:17:11 vasta tsitaadiga

Võib täiesti mööda olla, kuid saan aru, et sul on vaja uuendada ainult üht välja kasutaja taga, kas siis mitte ei peaks kirjutama sedasi.
$paring="UPDATE teated SET text = '".$sisu."' ";

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 07.03.2008 21:51:19 vasta tsitaadiga

andrusny kirjutas:
Võib täiesti mööda olla, kuid saan aru, et sul on vaja uuendada ainult üht välja kasutaja taga, kas siis mitte ei peaks kirjutama sedasi.
$paring="UPDATE teated SET text = '".$sisu."' ";

Ei, seal on mul eraldi tabel kasutajad ja eraldi tabel teated.
Kasutajad on vaja saada kasutajate tabelist, nende ID-d sealt siis, mis olemas on kõik. Nendele siis iga ID kohta läheb teadete tabelisse uus rida, koos teatega ja ajaga.

Aga mismoodi ma seda query-t echon? See annab vaid mingi paar sõna vms. icon_rolleyes.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
AMD
HV veteran
AMD

liitunud: 29.07.2003




sõnum 07.03.2008 22:44:42 vasta tsitaadiga

$query = 'select ... ';
echo $query;
Sedasi äkki?

_________________
From now on, the forum is owned by AMD.That means that you are NO LONGER allowed to talk about, or even mention *ntel.
Kommentaarid: 335 loe/lisa Kasutajad arvavad:  :: 145 :: 3 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 07.03.2008 23:43:51 vasta tsitaadiga

Hakkasin asja huvi pärast proovima. Kas sa selle tabeli oled üldse saanud teha? Minul keeldub PhpMyAdmin tekitamast lahtrit from. Asendasin selle kellelt ja lahtri text asendasin teade siis alles oli nõus tabeli tegema. Sellest võib tuleneda ka sinu päringute venimine ja mittetoimimine.

paring="INSERT INTO teated ( id , date , kellelt , to_id , from_id , teade ) VALUES ( NULL , NULL ,'".$kellelt."' , '".$to_id."' , '".$from_id."' , '".$teade."')" ;


Edit: Proovisin siis andmeid sisestada. Tegin lihtsa for tsükli ja laksin sama sisuga 30000 ridakirjutada sinna tabelisse. Aega võtsin visuaalselt - lugesin sekundeid. Päring kestis umbes 4 sek
Lahtri date tüübiks panin timestamp ja seljuhul Kirjutatakse selle sisestamise kohale NULL

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
linnumees
HV kasutaja

liitunud: 15.06.2005




sõnum 07.03.2008 23:54:36 vasta tsitaadiga

http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

Mina mõtleks muidugi massteadete jaoks mingi muu viisi. Juhul kui enamik kasutajatest teated ära loeb ei ole muidugi suurt vahet.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nn3_
HV kasutaja
nn3_

liitunud: 13.09.2003




sõnum 08.03.2008 13:14:18 vasta tsitaadiga

SGM kirjutas:
Täpselt sama ootamine ja sama error. :(

Anna see kood mis Sul praegu veani jõuab (nii php kui SQL pool).
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
raxz
HV Guru

liitunud: 27.07.2003




sõnum 09.03.2008 20:06:34 vasta tsitaadiga

No kui sa tahad kõikidele kasutajatele teadet jätta, siis kirjuta HTMLi see sisse. icon_lol.gif
IMO lihtsaim variant. Võid ka kontrollida, et kui kasutaja sisse logitud, siis näeb seda teadet.
Kommentaarid: 46 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 45
tagasi üles
vaata kasutaja infot saada privaatsõnum
tomps01
HV vaatleja

liitunud: 09.06.2004




sõnum 10.03.2008 11:40:26 vasta tsitaadiga

Nagu Kevades öeldi - kui sa kõike ei jõua, siis tee pool. Äkki oleks kasulik miski limit parameeter päringu sisse panna ja sisestada jupikaupa oma asjad. Siis saad vajadusel ka erinevate vahemike käimalaskmise aegu venitada (a'la pool tundi jätad vahet) ning serverite koormust jagada.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 23.03.2008 13:18:13 vasta tsitaadiga

nn3_ kirjutas:
SGM kirjutas:
Täpselt sama ootamine ja sama error. icon_sad.gif

Anna see kood mis Sul praegu veani jõuab (nii php kui SQL pool).


Viimati katsetasin midagi sellist:
INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
      SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0'

Aga ka see ajas minuti jooksul paarsada sisestus db-sse ja siis tuli fatal error. :/
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 23.03.2008 17:37:26 vasta tsitaadiga

SGM, sa annad ju ainult php poole
anna kood, mida reaalselt mysql kätte saab
ehk siis näiteks:
echo "INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0'";
pane selle päringu esitamise asemel
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
SGM
HV kasutaja

liitunud: 04.12.2005




sõnum 26.03.2008 16:25:19 vasta tsitaadiga

mikk36 kirjutas:
anna kood, mida reaalselt mysql kätte saab
ehk siis näiteks:
echo "INSERT INTO teated (`date` , `toid` , `fromid` , `text`)
SELECT '$date', id, '$id', '$teade' FROM kasutajad WHERE active = '1' AND block = '0'";
pane selle päringu esitamise asemel


Sel juhul, kui query asemele panin echo, sain nii:
INSERT INTO teated (`date` , `toid` , `fromid` , `text`) SELECT '26.03.2008 - 10:39', ID, '3', 'Teadeee testin teadet!
' FROM kasutajad WHERE active = '1' AND block = ''


EDIT:
Ma sain vist asja äkki tööle isegi! Üks sõber vaatas tervet koodi ja midagi pisiasja muutis seal... icon_biggrin.gif
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 0
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 26.03.2008 17:03:23 vasta tsitaadiga

no sa olid juba muutnud vahepeal antud queryt, algselt andsid block = '0', tulemus aga block = ''
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  massteate saatmine kasutajatele saidil?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.