Php funkcia vykonaná až za určitý čas – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Php funkcia vykonaná až za určitý čas – PHP – Fórum – Programujte.comPhp funkcia vykonaná až za určitý čas – PHP – Fórum – Programujte.com

 

Vesely5
~ Anonymní uživatel
3 příspěvky
22. 3. 2016   #1
-
0
-

Ahojte. 

Pre svoje vlastné potesenie a hlavne preto aby som sa naucil php som si zacal programovat aplikáciu a po par dnoch som narazil na problem s ktorým si neviem rady. Potrebujem spravit to, aby sa mi po kliknutí na nejaký link alebo button vykonala nejaká php funkcia ALE napríklad 5 minút po stlaceni buttona/linku... a aby odpocitanie bezalo aj vtedy ked zavriem aplikaciu. Rozmyslal som ze to spravit tak, ze si do tabulky ulozim aktualny cas pri kliknuti na button/link a pripocitam k nemu cas za kolko sa ma vykonat funkcia. Lenze vobec netusim ako zabezpecit to, co sa bude stale dotazovat na ten cas vykonania a ked ten cas nastane tak funkciu vykoná. Googlil som, ze je na to dobry javascript/ajax ale s tym som v zivote nerobil... Neviete mi nejak pomoct? zozaciatku by mozno stacilo iba nasmerovat, mozno sa chytim :) Dakujem za kazdu radu.

Nahlásit jako SPAM
IP: 62.169.177.–
peter
~ Anonymní uživatel
4016 příspěvků
22. 3. 2016   #2
-
0
-

Otazkou je, co presne chces, aby se stalo. Takhle obecne nelze rici, ktere z reseni je lepsi pro dany ukol.

php sleep?
linux cron / scheduler?
php scheduler?
js scheduler + php?
win scheduler + socket php?

Sleep ti uspi program na nejaky cas. Netusim ted, jestli se dokonci i po zadreni okna.

Cron je linuxovy planovac uloh.  Asi by bylo lepsi nechat opakovane spoustet (ob 5 min, treba) php program, ktery precte tabulku v db a pokud v ni neco bude, tak to provede a smaze s tabulky. - strasne tim vytezujes server!

js + php - totez, nechas si js okno bezet na plose a bude se kazdych 5 min pripojovat a spoustet php.

win + php - totez, ale spoustis stranku pres cizi program pro spousteni web stranek, pres comand-line

php scheduler - vlastne nepotrebujes, aby to bezelo online. Staci, kdyz se to spustit, kdyz nekdo znovu zobrazi stranku a uplyne dany cas. Ulozis do db tabulku a tu prectes. Uplynul cas, provedes, neuplynul, neprovedes.
Potrebujes treba pridat nove suroviny za tyden, tak vypocitas rozdil casu (aktualni - ten v tabulce) a napocitas suroviny.

O jinych moznostech nevim. Naposledy jsem neco podobneho potreboval pri odesilani (spam) mailu kolem pulnoci. Ale ten manik si to rozmyslel a ze to pusti na tlacitko. Skoncilo to tak, ze po 10-20 mailech zbytek skoncil ve spamu. Za coz nadal mne, ikdyz mi predtim poslal seznam podminek, za jakych se tolik mailu da odesilat. A jedna z nich byla vecerni hodina. Mno, proste ztrata casu s tim zakaznikem a jeste mi visi penize, stale.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:fd2c:2e...–
Vesely5
~ Anonymní uživatel
3 příspěvky
22. 3. 2016   #3
-
0
-

#2 peter
to co potrebujem je princip travianu. Spravil som si hru kde sa staras o zvieratko...cvicis ho a tak.....a jeho atributy ktore ma sa mu zdvihnu ked ho posles na nejake cvicenie. cize potrebujem nieco take, ze ked si hrac vyberie nejake cvicenie sa spusti nejaka casomiera pocas ktorej sa pet cvici....a po uplynuti toho casu sa mu pripocitaju atributy ktore obsahuje dane cvicenie. To cvicenie moze trvat aj hodinu takze pochybujem ze by niekto sedel pri pc a cakal hodinu....tym padom potrebujem aby ta casomiera odpocitavala aj pocas vypnutej aplikacie a vykonala dany skript (to pripocitanie atributov)... preto potrebujem radu ktorym spôsobom, ktore si mi tu vypisal by to bolo najjednoduchsie pre pouzivatela ktory o tych veciach co si sem pisal ani nepocul :D dal som to na net ak to chces vidiet ale neni tam co pozerat zatial..... len aby si mi veril ze nieco take ozaj robim :D petian.cekuj.net nemusis sa registrovat meno vesely5 heslo peter :)

Nahlásit jako SPAM
IP: 62.169.178.–
peter
~ Anonymní uživatel
4016 příspěvků
23. 3. 2016   #4
-
0
-

Pekny :)

No, tak to ti bude stacit princip s tou databazi. Zapises si do tabulky
uzivatel (id), typ akce (id), cas start, cas konec
pepa, noseni klacku, 2016-3-23 7:55, 2016-3-23 8:55
A pak jenom sledujes pri obnoveni stranky, zda je v tabulce nejaka akce a vypises, jak dlouho jeste potrva, treba. Pokud tam je a NOW() > cas konec, tak akci ukoncis, pripises body a uzivateli ukazes, ze zviratko zadnou akci nema a zobrazis nove body.
Vubec nepotrebujes mit nekde neco spustene.

Ale, kdyby uzivatel necha stranku otevrenou a sledoval, tak musis pridat jeste javascript, ktery se obcas pripoji k serveru a zkontroluje aktualni cas.

https://jsfiddle.net/57h1Lnfz/

Cas <span id="timer"></span>

<script>

function timerRun()
{
  count -= 1;
  if (count <= 0)
  {
     clearInterval(counter);
     return;
  }
document.getElementById("timer").innerHTML = count + " secs";
}

var count = 30;

var counter = setInterval(timerRun, 1000); 
</script>

+ tam pridas tu ajaxovou cas. V podstate tu ajax cast muzes udelat tak, ze tam das

<script id=xxx></script>
<script>document.getElementById("xxx").src = 'stranka.php';</script>

A stranka.php ti bude vracet spustitelny js kod. Ale nevim, jestli to jeste bude fungovat takto, mozna budes muset pouzit lepsi druh ajaxu.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:11a3:d2...–
Kit+15
Guru
23. 3. 2016   #5
-
0
-

#3 Vesely5
Tohle řeším tak, že při každém dotazu zpětně dopočítám všechny mezistavy. Výhodou je, že nepotřebuji žádný časovač. Nevýhodou je, že u každé hodnoty potřebuji mít uložen i časový údaj, kdy ta hodnota platila.

Prostě využívám toho, co v reálu není možné: Cestování v čase.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
23. 3. 2016   #6
-
0
-

   

<style>
div .text {width:100px;display:inline-block;}
div .bar {width:0; height:10px; background:#080; display:inline-block;}
</style>

<div id="timer_div0"><div class="text"></div><div class="bar"></div></div>
<div id="timer_div1"></div>
<div id="timer_div2"></div>

<script>
function classTimer(data)
{
var root = this;
this.timer = null;
this.timer_step  = 300;	//ms
this.num  = 0;
this.num_min  = 0;
this.num_max  = 100;
this.num_step  = 10;
this.data = null
this.init = function(data)
	{
	this.data = data;
	this.num_step = (data.time_end - data.time_start) / (this.timer_step * this.num_max);
	this.num = this.num_max;
	}
this.stopTimer = function()
	{
	if (this.timer!=null)
		{
		clearInterval(this.timer);
		}
	}
this.func = {};
this.func.start = null;
this.func.stop  = null;
this.func.run   = null;
this.start = function()
	{
	root.stopTimer();
	if (root.func.start) {root.func.start(root);}
	root.timer = setInterval(root.run, root.timer_step);
	}
this.stop = function()
	{
	root.stopTimer();
	this.num = this.num_min;
	if (root.func.stop) {root.func.stop(root);}
	}
this.run = function()
	{
	root.num -= root.num_step;
	if (root.func.run) {root.func.run(root);}
	if (root.num<=0)
		{
		root.stop();
		}
	};
this.init(data);
}

function write(timer)
{
var patt, bar, now;
patt = '\
<span class="text">{0}<\/span> \
<span class="bar" style="width:{1}px;"><\/span> \
<span class="num">{2}<\/span>\
';
bar  = Math.floor(1 * timer.num);
bar  = bar<0 ? 0 : bar;
now = getNow();
document.getElementById(timer.data.id).innerHTML = 
  patt
    .replace('{0}', timer.data.action)
    .replace('{1}', bar)
    .replace('{2}', (Math.round((100 - timer.num)*10)/10)+'%')
	;
}

function addNow(now,min) {return Math.floor(now + min * 60 * 1000);}
function getNow() {return new Date().getTime();}

var  tab,i,timers, now,n, str;
now = getNow();
tab = [
	{name:'pepa', action:'noseni klacku', time_start:addNow(now,1), time_end:addNow(now,1.2)},
	{name:'pepa', action:'privolani'    , time_start:addNow(now,0), time_end:addNow(now,0.7)},
	{name:'pepa', action:'plavani'      , time_start:addNow(now,0), time_end:addNow(now,5)}
	];

timers = [];
str = '';
for (i=0; i<tab.length; i++)
{
tab[i].id = 'timer_div'+i;
timers[i] = new classTimer(tab[i]);
timers[i].func.start = write;
timers[i].func.stop  = write;
timers[i].func.run   = write;
now = getNow();
if (now<tab[i].time_end)
	{
	if (now>tab[i].time_start)
		{
		timers[i].start();
		}
	else
		{
		n = Math.floor(tab[i].time_start - now); //ms
		timers[i].func.start(timers[i]);
		timers[i].timer = setTimeout(timers[i].start, n);
		}
	}
}

</script>
Nahlásit jako SPAM
IP: 2001:718:2601:26c:bc5c:a2...–
Kit+15
Guru
23. 3. 2016   #7
-
0
-

#6 peter
Bude to fungovat i při vypnutém prohlížeči?

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
24. 3. 2016   #8
-
0
-

No, to je ta javascriptova cast, bez ajaxu (predpokladam, ze si to umi poresit sam a kdyz ne, tak smula, mam taky jinou praci a lip placenou). To uz jsme rikali, preci, ze to hlavne musi poresit v php/mysql.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:507:88e...–
peter
~ Anonymní uživatel
4016 příspěvků
24. 3. 2016   #9
-
0
-

Takhle, pro spoustu lidi je dost problem pracovat s casovaci v js. On na te strance nema zadny js. Tak jsem si rikal, ze smu dam priklad, ktery v podstate simuluje, co by chtel. Staci ho jen upravit o ajax, kterym na zacatku nacte, treba pres JSON pole 'tab'. Coz muze byt primy vystup z db
 

--- nacti.php?id=123 ---
... SELECT * FROM akce WHERE id=123 time_end>NOW() ...
//$dada = array( array('name'=>'pepa', 'action'=>'noseni klacku', 'time_start'=>14123456, 'time_end'=>14789012) );
echo json_encode($data);

--- index.htm ---
var tab;
... msg = ajax ...
tab = JSON.parse(msg);
...

timers[i].func.start
timers[i].func.stop
 

Nahlásit jako SPAM
IP: 2001:718:2601:26c:507:88e...–
Vesely5
~ Anonymní uživatel
3 příspěvky
24. 3. 2016   #10
-
0
-

chlapy nepotrebujem aby ste mi to tu teraz namieru spravili. Ja sa to ucim a nepoznam vsetky praktiky co sa pouzivaju v tejto problematike, preto som sa spytal na nejaky spôsob akym by sa to dalo. Teraz uz mam dost informacii aby som zacal googlit vsetky veci okolo toho a hadam to dam dohromady nejak... i ked s javascriptom a ajaxom som do styku este neprisiel ale zas nemoze to byt az take zlozite :D Dakujem za kazdu radu ktora sa tu objavila :)

Nahlásit jako SPAM
IP: 62.169.178.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý