Autor | Zpráva | ||
---|---|---|---|
juraj Profil |
Chcem sa spýtať ako upraviť script pre cron, časový údaj do db vkladám pomocou funkcie mktime,ktorý porovnávam s aktuálnym datumom time(). Cron je nastavený na webhostingu, aby sa spúšťal každú hodinu. Ide mi o to , či v skripte správne porovnávam dátumy
ďakujem za rady,a či v scripte môže byť príkaz refresh <meta http-equiv='refresh' content='1;' /> <? //$dnes= date("YmdHi") ; $dnes=time(); $subject="NOVINKY"; $headers="From:jurko@centrum.sk"; $headers.=$bcc."Content-type: text/plain; charset=windows-1250\r\n" ; ?> <? //$dnes= date("YmdHi") ; // $dnes2= date("Y-m-d H:i:s"); $dotaz = "SELECT komu,sprava,passkey,pokuss FROM odoslane "; $vysledky = mysql_query ( $dotaz); /*vybere z DB všechny údaje a načte je*/ WHILE($data = mysql_fetch_array($vysledky)) { $pokuss= $data['pokuss']; //vyberie casovy udaj ktory zvoli uzivatel $komu= $data['komu']; if($dnes==$pokuss){ $bccx[]=$data['komu']; $komu= $data['komu']; $sprava= $data['sprava']; $passkey= $data['passkey']; $pokuss= $data['pokuss']; $text .= " Mate Spravu http://localhost/confirmation.php?passkey=$passkey&komu=$komu "; mail($komu, $subject,$text,$headers); } $bccx[].=""; $bcc.="Bcc: ".Implode($bccx, ",")."\r\n"; ?> |
||
Keeehi Profil |
1. Proč nepoužíváš
<?php
2. Porovnání může být správně. Problém je, že script musí na vteřinu přesně běžet v době, jaká je nastavená v databázi pro čas odeslání. Lepší by bylo $dnes>=$pokuss && $odeslano==0 . Odesláno je další sloupec v databázi který určuje, zda byla zpráva už odeslána nebo ne. Proto bude po odeslání ještě potřeba updatovat záznamy a nastavit odesláno na 1 aby se už příště neposilaly.
3. Je zbytečné, aby PHP muselo iterovat pres nepotřebné záznamy. Proto by bylo lepší tu podmínku přesunout už do SQL dotazu do části WHERE. 4. Refresh není žádný příkaz. Pro prohlížeč to speciální význam mít může ale pro php je to jen výstupní text jako každý jiný. Vůbec se jim nezabývá. Pravděpodobně bys chtěl, aby se ten script po dobu jedné hodiny ve vteřinových intervalech spouštěl. To by šlo takto: <?php $end = time() + 3600; $interval = 1; while(time() < $end) { include 'script-co-se-ma-spoustet.php'; sleep($interval); } Další věc je, že se to spouští po vteřině a něco. To něco je doba běhu script-co-se-ma-spoustet.php. Dalo by se to řešit asynchronním spuštěním. Buď pomocí více vláken, pres shell, nebo simulací přes http požadavek. To poslední by vypadalo tak, ze místo include by tam bylo get_headers('ht>tp://example.com/script-co-se-ma-spoustet.php'); a na začátek toho volaného scriptu přidat ob_end_flush();
5. bcc nastavuje moc pozdě. |
||
juraj Profil |
#3 · Zasláno: 6. 4. 2015, 22:39:53
Keeehi:
Zdravím na začiatku skriptu som dal príkaz <?php header("refresh: 1;"); ?> Má to nejaký vplyv či používam s alebo bez <?php $dotaz = "SELECT komu,sprava,passkey,fotkyid,pokuss FROM odoslane where pokuss='$dnes'"; |
||
Joker Profil |
#4 · Zasláno: 6. 4. 2015, 22:50:57
juraj:
Neřekl bych, že existuje header refresh. V tom DB dotazu se zase vybírají jen záznamy, kde čas přesně odpovídá. „Má to nejaký vplyv či používam s alebo bez <?php“ Značka <? funguje jen pokud je v nastavení PHP zapnuto short_open_tags .
|
||
Keeehi Profil |
#5 · Zasláno: 6. 4. 2015, 22:52:52
Toto už sice funkce PHP je, ovšem dělá něco jiného než si myslíte. Přidává do odpovědi hlavičku, kterou si tam napíšete. Na tyto hlavičky pak ale zase reagují prohlížeče a ne váš server. Takže vám to zase fungovat nebude. Jak by se to dalo dělat jsem už popsal.
juraj: „Má to nejaký vplyv či používam s alebo bez <?php“ Je bezpečnější pouívat <?php než <? z hlediska podpory servru. První varianta by měla fungovat vždy, druhá funguje jen při určité konfiguraci.
V tom sql dotazu by neměly být ty apostrofy, protože (doufám) pracujete s čísly a ne řetězci. Navíc to má pořád ten problém, že script může nějaké zprávy přeskočit když se netrefí zrovna přesně na vteřinu. Takže nepoužívejte = ale <. |
||
juraj Profil |
#6 · Zasláno: 6. 4. 2015, 23:15:34
Keeehi:
Ano pracujem s číslami, ale v webhostingu pre cron som si nastavil cestu priamo k súboru, čo sa má spúšťať napr. www.nieco.sk/odoslane.php tam si nastavím, aby sa spúšťal každý deň po hodine A ten kód $interval = 1; mám dat do ľubovolného súboru? A vo webhostingu potom nastaviť cestu na ten nový súbor s vaším kódom? Joker: Header refresh existuje a pekne to obnovuje,vyskúšal som to dakujem |
||
Keeehi Profil |
#7 · Zasláno: 6. 4. 2015, 23:25:03
juraj:
„A ten kód $interval = 1; mám dat do ľubovolného súboru? A vo webhostingu potom nastaviť cestu na ten nový súbor s vaším kódom?“ Ano. „Header refresh existuje a pekne to obnovuje,vyskúšal som to“ Funguje v prohlížeči, ne na servru. |
||
Kubo2 Profil |
#8 · Zasláno: 6. 4. 2015, 23:55:41
Joker:
HTTP Refresh je rozšírenie implantované do Netscapu počas raných dní internetu. V súčasnosti je táto hlavička podporovaná vo väčšine prehliadačov, pričom ju W3C označilo za zastaranú. http://stackoverflow.com/questions/283752/refresh-http-header |
||
juraj Profil |
#9 · Zasláno: 7. 4. 2015, 13:26:24
Keeehi:
Kód som dal do súboru odoslane2.php <?php $end = time() + 3600; $interval = 1; while(time() < $end) { include 'odoslane.php'; sleep($interval); } ?> a odoslane.php je taký kód <?php $host="...."; $username="...."; $password="...."; $db="...."; mysql_connect("$host","$username","$password","$db") or die ("Nepodarilo sa spojiť s batabázou"); mysql_select_db("$db") or die("Nemôžem vybrať databázu."); //$dnes= date("YmdHi") ; $dnes=time(); $subject="NOVINKY"; $headers="From:info"; ?> <?php $dotaz = "SELECT komu,sprava,passkey,fotkyid,pokuss FROM odoslane where pokuss=$dnes"; $vysledky = mysql_query ($dotaz); /*vybere z DB všechny údaje a načte je*/ WHILE($data = mysql_fetch_array($vysledky)) { $pokuss= $data['pokuss']; $komu= $data['komu']; $bccx[]=$data['komu']; $komu= $data['komu']; $sprava= $data['sprava']; $passkey= $data['passkey']; $fotkyid= $data['fotkyid']; $pokuss= $data['pokuss']; $text .= " Mate info spravu "; mail($komu, $subject,$text,$headers); $bccx[].=""; $bcc.="Bcc: ".Implode($bccx, ",")."\r\n"; $headers.=$bcc."Content-type: text/plain; charset=windows-1250\r\n" ; ?> |
||
Keeehi Profil |
#10 · Zasláno: 7. 4. 2015, 14:00:45
Nejdříve oprav všechny mnou popsané problémy a pak se můžeme bavit dál. Tohle co tu je je příšernost. Už jen z principu se tím nechci zabývat.
|
||
juraj Profil |
#11 · Zasláno: 7. 4. 2015, 14:14:31
Keeehi:
Čo je príšerné,už som opravil kód ako si odporúčal už som v koncoch.Ak je stránka stále online tak to funguje,len cez cron mi to nejako nechce spúšťať. Ja už sa s tým kódom ďalej nepohnem...Vyskúšal som všetko možné a nič cron. |
||
Keeehi Profil |
#12 · Zasláno: 7. 4. 2015, 14:38:15
juraj:
Příšerné je to formátování. Taky jsi neopravil to, bcc kopie nastavuješ až po odeslání emailu, dále pořád tvrdošíjně porovnáváš čas na přesnou shodu což prostě správně fungovat nemůže. I když ti možná PHP žere ty funkce pojmenované pokaždé jinak velkými písmeny, tak mě to vytáčí. Taky sem nakopírovaný kód není syntakticky správný - chybí mu ukončovací závorka pro while blok čehož by sis všiml, pokud by bylo formátování v pořádku. Další drobnost jsou zbytečné uozovky kolem proměnných na řádcích 7 a 9. Řádek 41 je taky špatně. Poprvé se to nemá s čím řetězit ale hlavně v druhém emailu bude ten text 2x, v třetím bude 3x atd. Evidentně tam těch chyb máš mraky. Nejdříve to oprav tak, aby když to spustíš jednou v prohlížeči (žádné refreshe!) tak aby to odeslalo všechny emaily, které ještě odeslány nebyly a zároveň se měly odeslat dříve než je aktuální čas. |
||
Joker Profil |
#13 · Zasláno: 7. 4. 2015, 15:35:47
juraj:
„už som z toho hotový,prečo mi cron nespúšťa script,kde robím chybu“ A opravdu se ten skript nespustí? Nebo se spustí, ale nenajde žádné záznamy? Tomu druhému bych se nedivil, vzhledem k tomu, že ta podmínka porovnává rovnost proti přesnému času. I kdyby záznamy v databázi měly čas nastavený na čas spuštění CRONu (např. cron se spouští ve 12.00 a odpovídající záznamy měly čas 12.00:00), pořád nějaký čas zabere spuštění a zpracování toho skriptu, takže se nelze spolehnout, že skutečně bude 12.00:00 i ve chvíli zpracování té podmínky. Na tohle jsme už několikrát upozorňovali ([#2], [#4]). |
||
Časová prodleva: 10 let
|
0