Autor Zpráva
zetrozet
Profil *
Mám skript pro stahování určitých souborů uvedený níže přestal u jednoho poskytovatele fungovat a u druhého stále funguje. Podpora poskytovatel tvrdí, že při zkoušení skriptu vše funguje, já mám zjištěny tři počítače, u kterých to pravda být přestala.

Kde mám hledat chybu, když skript funguje i nefunguje zároveň

Fungující URL:
www.zetrozet.biz/down.php?url=http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/rok.txt?rok=2011&name=kurz2011.txt
www.zetrozet.biz/down.php?url=http://www.ecb.int/stats/eurofxref/eurofxref-hist.zip&file=eurofxref-hist.csv&name=kurz_eur.csv

Nefungující URL:
www.zetrozet.com/down.php?url=http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/rok.txt?rok=2011&name=kurz2011.txt
www.zetrozet.com/down.php?url=http://www.ecb.int/stats/eurofxref/eurofxref-hist.zip&file=eurofxref-hist.csv&name=kurz_eur.csv

URL stránek, ze kterých je skript na obou webech volán:
1) ?load=u32
2) ?load=kurzcnb&rozbal=o52

Skript down.php umístěný na webech u obou poskytovatelů:
<?php
/*
Utilita slouzici k otevreni URL s ZIP souborem, stazeni a rozbaleni konkretniho souboru v archivu ZIP a predani ke 
stazeni. 

Volani je primo z URL tohoto skriptu s GET parametry:

url - HTTP cesta k ZIP souboru
file - Soubor, ktery se ma z archivu otevrit a nabidnout ke stazeni
name - Volitelny parametr, urcuje nazev souboru ke stazeni - tedy prejmenuje puvodni soubor a nabidne jej pod timto nazvem, 
        kdyz neni zadan, tak se soubor stahne s puvodnim nazvem
        
&copy; Seonet Multimedia s.r.o. 2009, Pavel Ondřej

V 1.0.

Release notes:
        
*/
function VratUrl($url) {
 if (StrPos(StrToLower($url),"tp://")>0) { $urly = $url; }
 else {
  $www=file("./def/kdejsem.txt");
  $jsem1=SubStr($www[0],0,StrPos($www[0],"|"));
  $jsem2=chop($jsem1);
  if ($jsem2!='') $urly='http://'.$jsem2.$url;
 }
 return $urly;
}

function OverPriponu($urly) {
  $casti=explode(".",$urly); 
  $pripona=$casti[(count($casti))-1]; 
  
  return $pripona;
}

function VratNazev($file){
  $casti=explode("/",$file); 
  return $casti[(count($casti))-1]; 
}

function unzip_url_file($url,$file,$name=false){
/*
*
* Otevre spojeni s $url a pokusi se stahnout soubor ZIP.
*
*/

if(!isset($url) or $url == ''){
  echo "Neni zadana cesta k souboru!";
  return false;
}
$urly = VratUrl($url);
$pripona = OverPriponu($urly);

if($pripona == "zip"){
  if(!isset($file) or $file == ''){
  echo "Soubor je ZIP, ale neni zadan parametr FILE!!!";
  return false;
  }
}

$ch = curl_init();


curl_setopt($ch, CURLOPT_URL, $urly);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);
$info = curl_getinfo($ch);
// Pokud dojde k chybe na spojeni vrati chybu
if ($data === false || $info['http_code'] != 200) {
  echo "Nelze otevrit soubor $urly [". $info['http_code']. "]";
  if (curl_error($ch)){
    echo "\n". curl_error($ch);
  }
  curl_close($ch);
  return false;
  
// Pokud se sobor podari stahnout, pokracujeme dal :-)
}else {
  curl_close($ch);
  
  // Vytvorime docasny soubor a do nej nahrajeme data z ZIP, ktery jsme stahli
  $tmp_soubor = tempnam("tmp", "down");
  
  $prace_s_tmp = fopen($tmp_soubor, "w+");
  fwrite($prace_s_tmp, $data);
  fseek($prace_s_tmp, 0);  
  $velikost = filesize($tmp_soubor);
  
  // Pokud se velikost = 0 neco je spatne
  if($velikost != 0){    
    // Pokud je zip, tak rozbalime a predame ke stazeni
   if($pripona == "zip"){ 
    fclose($prace_s_tmp);
     $zip = new ZipArchive;
      if ($zip->open($tmp_soubor) === TRUE) {
          $soubor_ke_stazeni = $zip->getFromName($file);
          if($soubor_ke_stazeni){
          Header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename='.($name!=false?$name:VratNazev($file)));
          echo $soubor_ke_stazeni;  
          unlink($tmp_soubor);         
           return true;
          }else{
            unlink($tmp_soubor);
            echo 'Soubor nelze rozbalit';
            return false;  
          }
          $zip->close();
      } else {
          echo 'Nelze otevrit ZIP soubor!';
          unlink($tmp_soubor);
          return false;
      }
    }else{
      //Pokud neni ZIP predame ke stazeni
      Header('Content-Type: application/octet-stream');
      header('Content-Disposition: attachment; filename='.($name!=false?$name:VratNazev($urly)));
      echo fread($prace_s_tmp, $velikost);    
      unlink($tmp_soubor);
    }
    // Zrus docasny soubor
    unlink($tmp_soubor);
  }else{
    echo 'Není co k rozbalení ci otevreni!';
    unlink($tmp_soubor);
    return false;
  }
  
  
}

}
if(!unzip_url_file($_GET['url'],$_GET['file'],$_GET['name'])){
//adresa pro odeslání hlášení o chybě
$adresa="chybawww@trunecek.cz";
$fold=$_GET["fold"];
if(isset($_SERVER["HTTP_REFERER"])) $back="<a href=\"".htmlspecialchars($_SERVER["HTTP_REFERER"])."\">Návrat zpět</a> &nbsp; &nbsp;" ; else $back="";
$foo="<br><br>$back<a href=\"index.php\">Úvodní stránka</a>\n</body></html>";
$kontakt="<br><br>Kontakujte prosím administrátora na <a href=\"mailto:$adresa?subject=".rawurlencode("Hlášení o chybě")."\">$adresa</a>, aby byla chyba rychle napravena.";
$top="<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=windows-1250\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"engine/simple.css\">\n</head><body>";
$chyba1="<h3>Upozornění</h3>Chystáte se stáhnout soubor <strong>".$_GET['file']."</strong>.<br>
Omlouváme se za vzniklé potíže, ale víše uvedený soubor doporučujeme nestahovat.<br>
<strong>Požadovaný soubor je zřejmě poškozen, nebo byl napaden virem.</strong><br>
Pokud jej přesto chcete stáhnout, můžete tak učinit <a href=\"".$_GET["fold"]."/".$_GET["file"]."\">zde</a> na vlastní nebezpečí.<br>
Můžete také zkusit stáhnout soubor z alternativního serveru, adresy jsou uvedeny na úvodní stránce $kontakt";

$chyba2="<h3>Soubor je nedostupný</h3>\nPožadovaný soubor <strong>".$_GET['file']."</strong> neexistuje, nebo nemáte oprávnění jej stáhnout.<br>Můžete zkusit stáhnout soubor z alternativního serveru, adresy jsou uvedeny na úvodní stránce<br>Omlouváme se za vzniklé potíže.";

die($top.$chyba2.$kontakt.$foo);
}
?>
okolojdouci
Profil *
Nechce se mně zkoumat 150 řádků, ale zeptám se: Co přístupová práva k souborům?
zetrozet
Profil *
Na obou serverech 777, tmp adresář pro rozbalení zipu rovněž na obou serverech nastaven stejně. Skript přestal fungovat na servrech Seonet Multimedia, kteří mi ten skript předloni psali. Přitom doména www.zetrozet .biz přežila bez ztráty funkčnosti i migraci k jinému providerovi.
okolojdouci
Profil *
Potom bych doporučil trasovat, až se dopracuješ konkrétního řádku s konkrétní funkcí, která se šprajcuje.
zetrozet
Profil *
Na technické podpoře byl včera autor skriptu, na níže přijaté chybové hlášení reagoval tím, že od něho vše funguje Ok.

Warning: fopen() [function.fopen]: open_basedir restriction in effect. File(/tmp/downJwrVAR) is not within the allowed path(s): (/var/www/web5/zetrozet.com) in /var/www/web5/zetrozet.com/test.zetrozet.com/down.php on line 79

Warning: fopen(/tmp/downJwrVAR) [function.fopen]: failed to open stream: Operation not permitted in /var/www/web5/zetrozet.com/test.zetrozet.com/down.php on line 79

Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/web5/zetrozet.com/test.zetrozet.com/down.php on line 80

Warning: fseek(): supplied argument is not a valid stream resource in /var/www/web5/zetrozet.com/test.zetrozet.com/down.php on line 81


Pak samozřejmě nahlásí chybu, že není co rozbalovat a chybu unlinku.
okolojdouci
Profil *
Evidentně máš problém na ř. 79 (zde nejspíš 89). Ptám se ještě jednou: máš v té složce, kde je tento php soubor, složku tmp? A má ta složka 777?
zetrozet
Profil *
Z www.zetrozet.com se nyní skript pokouší o kurzy ČNB už 10 minut a během té doby mi je přes www.zetrozet.biz už dvakrát zobrazil - vždy do 10 sec.
zetrozet
Profil *
Složka "zetrozet.com" měla doteď 755, přitom po dlouhé době stáhla a rozzipovala kurzy Eura z ECB, ale nezazipované kurzy koruny z ČNB není ochotna stáhnout ani po opravě na 777. Pro předkládání "kurz2011.txt" uživateli není složka tmp používaná, ČNB nedává kurzy do zipu.
Davex
Profil
Domnívám se, že problém je na řádku
$tmp_soubor = tempnam("tmp", "down");

Vytváří se tam dočasný soubor, který je mimo povolený adresář (open_basedir) a nelze s ním proto pracovat. Jinde se vytvoří pravděpodobně proto, protože se nepodaří vytvořit v adresáři /var/www/web5/zetrozet.com/test.zetrozet.com/tmp/, který možná neexistuje, může mít špatně nastavená práva (viz [#6]) nebo vlastníka (např. pokud tam byl adresář tmp/ vytvořen PHP skriptem).
zetrozet
Profil *
Možná už mám jakési tušení = složka "zetrozet.com", která by měla být http-viditelná i jako "www.zetrozet.com" je ve skutečnosti na stejné adresářové úrovni jako složka "test.zetrozet.com", kdežto ta chybová hlášení ji očekávají o úroveň níž. Jstli by to mohla být příčina, uvidím zítra, jestli se se mnou podpora Seonetu bude chtít bavit.
zetrozet
Profil *
Omlouvám se, než jsem začal psát, měl jsem si dát refresh, ale díky za potvrzení. Z mé strany to byly jen ničímnepodložené doměnky.
Davex
Profil
zetrozet:
V tomto konkrétním případě je důležité, aby byl podadresář tmp/ s nastavenými právy 0777 ve stejném adresáři jako skript down.php. (Na což se už ptal [#6] okolojdouci.)
zetrozet
Profil *
Pro "www.zetrozet.com" je adresář tmp/ i down.php v adresáři zetrozet.com, pro "test.zetrozet.com" je tmp/ i down.php v adresáři test.zetrozet.com. U obou tmp/ jsou nastavena práva 777 a adresáře zetrozet.com a test.zetrozet.com jsou na stejné úrovni.
Davex
Profil
Jen bych chtěl upozornit, že práva 0777 (neboli rwxrwxrwx) v osmičkové soustavě nejsou to samé jako číslo 777 v soustavě desítkové.

Ještě mě napadlo, zda se z nějakého důvodu nehledá adresář tmp/ jinde než v /var/www/web5/zetrozet.com/zetrozet.com. Možná pomůže předat funkci tempnam() celou cestu k adresáři:

$tmp_soubor = tempnam(dirname(__FILE__) . "/tmp", "down");
zetrozet
Profil *
Vyzkoušeno - po 10 minutách se dopracoval k chybě na funkci "fopen()", která je volaná hned na následujícím řádku (řádky 87 až 89 skriptu nahoře).
  
.....
$tmp_soubor = tempnam(dirname(__FILE__)."tmp", "down");
$prace_s_tmp = fopen($tmp_soubor, "w+");
.....
Davex
Profil
zetrozet:
Chybí ti tam lomítko v řetězci "/tmp".
zetrozet
Profil *
Dík, na "test.zetrozet.com" to už funguje korektně, teď ještě vyzkoušet "zetrozet.com" jestli se neobjeví potíž při volání jako "www.zetrozet.com".

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