Autor Zpráva
Sedlista
Profil *
Ahoj,
právě řeším zacyklenost jednoduchého skriptu na přesun dat z XML souborů, umístěných na mém hostingu. Koukám na to asi půl dne, dodal jsem s pomocí googleu několik IFů, o kterých sem si myslel, že by to měly vyřešit - omyl.

Chování: Přesun všech dat proběhne v pořádku. Problém je v tom, že i když už se do DB evidentně nic nenahrává(ani nemá co), skript pořád běží a přešlapuje na místě, nemůže vyplivnout finální echo o úspěšném přesunu. Takže problém pravděpodobně někde u dvou WHILE cyklů, jako by skript pořád hledal nové složky/soubory. Takto se to chová v 95% případů.

Nicméně jednou celý skript propadl, a opravdu nakonec vypsal finální echo -> při spuštění stejného skriptu o pár sekund později byl však opět zacyklený. Myslel jsem si, že si to ze mě už dělá srandu.

<?php



include "config.php";
$deletace_tabulky=mysql_query ("DROP TABLE firo_katalog ;");

$new_table = mysql_query ("CREATE TABLE IF NOT EXISTS `firo_katalog` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `tour_id` varchar(10) COLLATE utf8_czech_ci DEFAULT NULL,
  `country` varchar(30) COLLATE utf8_czech_ci DEFAULT NULL,
  `location` varchar(50) COLLATE utf8_czech_ci DEFAULT NULL,
  `hotel` varchar(100) COLLATE utf8_czech_ci DEFAULT NULL,
  `accommodation_type` varchar(100) COLLATE utf8_czech_ci DEFAULT NULL,
  `class` varchar(5) COLLATE utf8_czech_ci DEFAULT NULL,
  `location2` varchar(50) COLLATE utf8_czech_ci DEFAULT NULL,
  `category` varchar(1000) COLLATE utf8_czech_ci DEFAULT NULL,
  `obrazek` varchar(50) COLLATE utf8_czech_ci DEFAULT NULL,
  `cena` varchar(10) COLLATE utf8_czech_ci DEFAULT NULL,
  `url` varchar(50) COLLATE utf8_czech_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ;");          //Pocuď je to jasný, zahazuju, a vytvářim novou tabulku

$kopanec = 0;
$adresar = opendir("XML");           // Otevři soubor XML (typická cesta k XML dokumentu je XML/Maledivy/neco.xml)
   while ($soubor = readdir($adresar)){ 
   if  ($kopanec<85){
          $kopanec++;
        if ($soubor!=".." && $soubor!="." ) {                                          //Dokud budeš nacházet adresáře, čti XML adresář
                                       
                                                              $adresar2 = opendir("XML/".$soubor);   //Otevři f.e XML/Maledivy
   while ($xmlka = readdir($adresar2))  {  
   if ($xmlka!=".." && $xmlka!=".") {                      //Dokud budeš nacházet soubory v XML/Maledivy tak je čti
   if (!is_dir($xmlka)) {        //pokud se nejedná o directory(adresář) ....
                                         $xml = simplexml_load_file("XML/".$soubor."/".$xmlka."");   ///tak ho otevři
   if ($xml){                                                                     //čti pokud máš nějaký xmlko
              foreach ($xml->DocumentElement->hotel as $item){        //Vypisuj z XML tyto údaje,  tento cyklus se opakuje pouze jednou
                                                             $tour_id=$item->tour_id;   //atd..načítání do proměnných
                                                             $country=$item->country;
                                                             $location=$item->location; 
                                                             $hotel=$item->hotel;       
                                                             $accommodation_type=$item->accommodation_type;
                                                             $class=$item->class;
                                                             $location2=$item->location2;
                                                             $category=$item->category;
                                                              $i=0;
       
       
  foreach ($xml->DocumentElement as $res)  {                        //Vypisuj z XML tyto údaje,  tento cyklus se opakuje pouze jednou
                                            $foto=$res->termin->picture_description;     //atd..načítání do proměnných
                                            $cena=$res->termin->unit_price_adult_from;
                                            $url=$res->termin->url_booking;
                    if ($foto!="")   {                               // Pokud to zrovna nebude záznam bez obrázku tak ho zapiš do DB
                     $add = mysql_query ("INSERT INTO `d19680_cabay`.`firo_katalog` (`id`, `tour_id`, `country`, `location`, `hotel`, `accommodation_type`, `class`, `location2`, `category`, `obrazek`, `cena`, `url`) VALUES (NULL, '".$tour_id."', '".$country."', '".$location."', '".$hotel."', '".$accommodation_type."', '".$class."', '".$location2."', '".$category."', '".$foto."', '".$cena."', '".$url."');");  
                    
                                }
                     
                    }                 
               }  
              
      }                                             
   }
   }
   } 
 }
  }
  else {echo("Vykopnutí z cyklu!");}
}
echo "hotovo!";



?>

Kdyby měl někdo čas, a podíval se na to, byl bych vděčný. Díky moc. Jirka
peta
Profil
readdir - nacte vse, co je v adresari. tento seznam je konecny. Pokud je v adresari vice polozek, nez 85 (soubory, adresare, .., .), tak to skonci kopancem.

//Dokud budeš nacházet adresáře, čti XML adresář
To neni pravda, tam podminka is_dir neni. pouze !=.. a !=.

Co se stane, kdyz soubor nebo adresar pojmenujes 0? pak ti while vrati false a cyklus se prerusi drive. Viz example 1 http://cz2.php.net/function.readdir, correct way / WRONG way.

jinak to vypada, ze by to snad melo fungovat. Otazkou je, kolik mas k dispozici pameti, jestli soubor neni zamknuty a pod. Ale to mozna s tim nesouvisi
Sedlista
Profil *
peta:
Máš pravdu. S tim komentářem u podmínky jsem se sekl, jak sem přidával kód tak my komentář spadl o pár řádků níž.

No právě, že kopanec to nevyhodí. Ten tam je z vyšetřovacíh důvodů, abych věděl kolikát ten cyklus probíhá. Je tam cca 70 adresářů. Cyklus by měl proběhnout 70x, na 85 se tedy nedostane, takže se ani nedá říct, že je to zacyklený.

S tim souborem "0" máš pravdu, skutečně mě to vykopne. Toho by se dalo využít ke stopení cyklu, díky moc za info:) Už si poradím.

BTW Pro budoucí generace: Momentálně to řeším nastaveným set_time_limit(), což je takové řešení, neřešení. Nicméně určitou službu to udělá.

Jirka

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0