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);
}
Problém je, že se dá velmi snadno přešvihnout max_execution_time. Dá se to upravit buď změnou intervalu nebo zvýšením max_execution_time. Dalším, co je třeba si uvedomit, je, že se do toho času započítává i čas strávený v script-co-se-ma-spoustet.php.
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('http://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
Keeehi:
Zdravím na začiatku skriptu som dal príkaz
<?php
    header("refresh: 1;");
?>
a dotaz som upravil takto,som zvedavý či to cron zoberie,lebo ináč samotný kód funguje ok,keď je online stránka
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
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
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
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
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
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
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" ;


?>
už som z toho hotový,prečo mi cron nespúšťa script,kde robím chybu
Keeehi
Profil
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
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
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
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]).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0