Autor Zpráva
Pavel Straka
Profil
Dobrý večer, rád bych se zeptal, jestli někdo nemá zkušenosti s chybou, která je v Google Chrome interpretována jako Error 324 (net::ERR_EMPTY_RESPONSE), v ostatních prohlížečích zobrazením bílé stránky, a dokázal by mi případně poradit v obecné rovině, bez bližších informací.

V mém případě se tak tu a tam (bez zjevné příčiny - výpis chybových hlášení zapnutý) děje v PHP souboru, který ukládá uživatelem zadaná data do databáze, po obnovení stránky je vše v pořádku.

Předem děkuji za pomoc.
Davex
Profil
Skript se asi ukončí před odesláním dat prohlížeči nebo zhavaruje. Více by mohl napovědět záznam chyb webového serveru (error.log) nebo PHP (konfigurační direktivy log_errors a error_log). Nebo si ve funkčních celcích kódu ukládej klasické ladící výpisy do souboru, abys mohl, s pomocí metody půlení intervalu, lépe určit problémové místo.
Pavel Straka
Profil
Moderátor Davex: Přesunuto z duplicity Špatně fungující header().

Dobrý večer, rád bych požádal o radu. Na webu uživatelé zadávají data do formuláře a ta se po jeho odeslání uloží do databáze. Uživatel je pak pomocí funkce header přesměrován na stránku, kde je mu oznámeno, že vložení dat proběhlo v pořádku a nějaké další informace.

Problém:čas od času se nějakému uživateli zobrazí jen bílá stránka (nebyl přesměrován) a data se neuloží. Výpis chyb je zapnutý, žádná data se před voláním funkce nevypisují. Zajímalo by mě, jestli je nějak možné zjistit příčinu, proč se stránka nepřesměrovala, vypsat nějakou hlášku, která by mi pomohla apod. Mohou s funkcí header obecně nastat podobné problémy? Nebo problém nemusí být ve funkci header? Vycházím z toho, že by se v tomto případě zobrazila nějaká chybová hláška. Děkuji za rady.
Pavel Straka
Profil
A mohl bys mi prosím poradit, kde najdu ten záznam error.log? Jedná se o hosting forpsi. Jestliže není viditelný přes FTP, je třeba o nějak nějak zvlášť žádat?


Co se týče těch PHP direktiv log_errors a error_log zkoušel jsem přidat do .htaccess kód:
php_flag  log_errors on
php_value error_log cesta k logu

ale vrací to chybu 500. Nevíš prosím, kde by mohl být problém?
panther
Profil
Moderátor Davex: Přesunuto z duplicity Špatně fungující header().

Pavel Straka:
bez kodu těžko soudit... To, že by header přesměrovával jen někdy, jak se mu zrovna zachce, možné není. Chybu hledej jinde.
Tori
Profil
Moderátor Davex: Přesunuto z duplicity Špatně fungující header().

Pavel Straka:
Nechybí exit; za tím přesměrováním? Ale jen tipuju.
Pavel Straka
Profil
Moderátor Davex: Přesunuto z duplicity Špatně fungující header().

Upřesním: Jedná se o chybu 324 (net::ERR_EMPTY_RESPONSE). Šlo mi o to, jak nějak vyřešit příčinu a přemýšlel jsem nad nějakou možností, jak v případě, že se zobrazí bílá stránka, zobrazit alespoň nějakou chybovou hlášku, která by mě nasměrovala. To jsem ale později vyhodnotil jako nesmysl, neboť chybové hlášky mám tak jako tak zapnuté. Prozatím jsem si soubor rozdělil na 6 částí a po každé z nich ukládám do souboru text, jako potvrzení, že až sem program proběhl. Zajímal by mě ale nějaký způsob výpisu chybových hlášek do souboru, rada, jak zobrazit soubor error.log (jedná se o hosting forpsi, jestliže není tento soubor viditelný přes FTP, je potřeba o něj žádat?) nebo obecně, jak vyřešit tento problém.
Děkuji za ochotu.

Tori: exit za přesměrováním mám.
Pavel Straka
Profil
Včera mi od uživatele přišel takovýto popis chyby: "Po kliknutí na uložení inzerátu se objeví prázdná plocha a nahoře jen jeden řádek,že v záhlaví smí být jen jedna destinace (nevím přesně slovosled)."

Nenapadá někoho, čím by to mohlo být způsobeno?
Skript v závislosti na tom jestli jsou vložena všechna data korektně, přesměruje uživatele na jednu stránku, nebo vrátí uživatele na původní.

// v pořádku
if ($chyba == 0) {
  Header("Location: adresa 1");
  exit;
}
else Header("Location: adresa 2");
exit;

Budu vděčný za každou radu
Davex
Profil
Neběží to náhodou šifrovaně přes SSL? Používají se sessions nebo cookies? Bez ukázky kompletního problematického kódu je každá rada drahá, protože to může být závislé na okolnostech, které neznáme.

Přesměrování odesílej i s nějakým vhodným stavovým kódem třeba takhle:

header('Location: http://www.example.com/ulozeno-dobre');
header('Connection: close', false, 303);
Pavel Straka
Profil
Šifrofané přes SSL to není. Sessions se používají pro přihlášení uživatelů, ale myslím, že se ta chyba objevuje i když přihlášen nikdo není. Rozumím, že bez kódu to není snadné určit, ale ten problém se objevuje asi ve 3 různých stránkách naprosto nahodile, myslel jsem, jestli někdo nemá zkušenosti přímo s touto chybou.
Kcko
Profil
http://stackoverflow.com/questions/6509128/error-324-neterr-empty-response-in-google-chrome
Pavel Straka
Profil
Kcko: Děkuju, ale to je jen návod pro řešení na straně uživatele v prohlížeči Google Chrome. Ta chyba se ale objevuje i v jiných prohlížečích (jen tam není interpretována jako chyba 324, ale jako bílá stránka).
Kcko
Profil
Tak googluj, protože já sem se s tím nikdy nesetkal, kód sem nedáš, konfiguraci serveru taky ne, tak Ti asi těžko pomůžeme.
Davex
Profil
PHP pravděpodobně zhavaruje a prohlížeči neodešle žádná data. Obecně to může být závislé na konkrétní verzi PHP nebo na přítomnosti některého rozšíření jako třeba eAccelerator nebo Suhosin.
Pavel Straka
Profil
Kcko: Opravdu chápu, že je obtížné takto odpověď. Přikládám tedy kód souboru, který zlobí asi nejčastěji. Ohledně konfigurace serveru vlastně nic nevím, jinak bych to sem také napsal. Jedná se o hosting Forpsi, NORMALhosting. S technickou podporou Forpsi je ale kříž, odeslal jsem jim už několik mailů, jediná odpověď byla tato:
Dobry den,

 v urcitych verzich distribuce debian a distribuci nad debianem postavenych jsme zaregistrovali obcasne problemy v komunikaci se serverem, pokud byla zapla kontrola timestamps. Vase nastaveni zjistite pomoci "cat /proc/sys/net/ipv4/tcp_timestamps". Pokud vam system vypise jednicku, mate kontrolu zaplou. V tom pripade ji zkuste vypnout prikazem "echo 0 > /proc/sys/net/ipv4/tcp_timestamps".

Což nepomohlo, další reakce z jejich strany už není.


Davex: Rozumím, o žádném takovém rozšíření ale nevím.

Zmiňovaný kód:
<?php
   error_reporting(E_ERROR | E_WARNING | E_PARSE);
   
   include "include.php";

   $hodnoty = Array(
      "typ",
      "podkategorie",
      "nadpis",
      "text",
      "lokalita",
      "obec",
      "cena",
      "mail",
      "jmeno",
      "platnost",
      "telefon",
      "skype",
      "icq",
      "odkaz",
      "poznamka",
      "cena_typ",
      "cena_typ2");

   for ($a=0; $a<count($hodnoty); $a++) {
      if ($a <= 8) {
         if (strlen(trim($_POST[$hodnoty[$a]])) == 0) $chyba[$a] = 1;
         if (isset($_SESSION[login]) && strlen(trim($_POST[$hodnoty[$a]])) == 0 && $a == 8) unset($chyba[$a]);
         if (strlen(trim($_POST[$hodnoty[$a]])) == 0 && $a == 5 && $_POST[lokalita] == "17") unset($chyba[$a]);
         if (strlen(trim($_POST[$hodnoty[$a]])) == 0 && $a == 6 && ($_POST[cena_typ2] == "dohodou" || $_POST[cena_typ2] == "k jednání" || $_POST[cena_typ2] == "na dotaz" || $_POST[cena_typ2] == "zdarma")) unset($chyba[$a]);
      }
   }
                                    
   if (count($chyba) == 0) {
      for ($a=0;$a<count($hodnoty);$a++) {
         $sloupce .= "$hodnoty[$a]";
         if ($a != (count($hodnoty) - 1)) $sloupce .= ",";

         $hodnota = $hodnoty[$a];
         if ($hodnota == 'jmeno' && isset($_SESSION[login])) $data .= "'".uzivatel($_SESSION[login],jmeno)."'";
         elseif ($hodnota == 'cena') $data .= "'".str_replace(" ","",$_POST[cena])."'";
         else {
            $data .= "\"".htmlspecialchars($_POST[$hodnota])."\"";
         }

         if ($a != (count($hodnoty) - 1)) $data .= ",";
      }

      $nejvyssi = MySQL_Query("SELECT id FROM inzeraty ORDER BY id DESC LIMIT 0,1");
         $id = MySQL_Result($nejvyssi,0,"id")+1;
         
      if (!empty($_POST[mail])) {
         $sirka = strlen($_POST[mail]) * 10;
         $obr = imagecreatetruecolor($sirka, 20);
          
         $bila = imagecolorallocate($obr, 255, 255, 255);
         imagefill($obr, 0, 0, $bila);  
                                             
         $cerna = imagecolorallocate($obr,0,0,0);
         imagestring($obr, 3, 0, 0, "$_POST[mail]", $cerna);  
                  
         imagejpeg($obr,"maily/$id.jpg");  
         imagedestroy($obr);  
      }
      

      for ($a=1;$a<=5;$a++) {
         if ($_FILES["foto$a"][name] != "") {
            if ($_FILES["foto$a"][type] == "image/jpeg" || $_FILES["foto$a"][type] == "image/pjpeg" ) {
               if ($a == 1) @mkdir("fotky/$id",0777);

               $nahraj = move_uploaded_file($_FILES["foto$a"][tmp_name],"fotky/$id/docasny$a.jpg");

               if ($nahraj == 'true') {
                  $docasny = imagecreatefromjpeg("fotky/$id/docasny$a.jpg");
                  $vodoznak = imagecreatefrompng("obrazky/vodoznak.png");

                  if (imagesx($docasny) < (imagesx($vodoznak)+20) || imagesy($docasny) < (imagesy($vodoznak)+20)) $chyba_rozmery = 1;
               }
               else $chyba_obrazek = 1;
            }
            else $chyba_obrazek = 1;
         }
      }
      

      if ($chyba_rozmery != 1 && $chyba_obrazek != 1) {
      for ($a=1;$a<=5;$a++) {
         if ($_FILES["foto$a"][name] != "") {
            if ($_FILES["foto$a"][type] == "image/jpeg" || $_FILES["foto$a"][type] == "image/pjpeg" ) {
                  $docasny = imagecreatefromjpeg("fotky/$id/docasny$a.jpg");
                  $vodoznak = imagecreatefrompng("obrazky/vodoznak.png");

                  if (imagesx($docasny) > SIRKA_FOTKY) {
                     $velky_sirka = SIRKA_FOTKY;
                     $velky_vyska = SIRKA_FOTKY / (imagesx($docasny) / imagesy($docasny));
                  }
                  else {
                     $velky_sirka = imagesx($docasny);
                     $velky_vyska = imagesy($docasny);
                  }

                  $nazev = Time().Rand(1000,9999).".jpg";

                  $platno = imagecreatetruecolor($velky_sirka,$velky_vyska);
                  imagecopyresampled($platno,$docasny,0,0,0,0,$velky_sirka,$velky_vyska,imagesx($docasny),imagesy($docasny));
                  imagejpeg($platno,"fotky/$id/$nazev");
                  $obrazek = imagecreatefromjpeg("fotky/$id/$nazev");

                  $pozice_odleva = $velky_sirka - imagesx($vodoznak) - 20;
                  $pozice_shora = $velky_vyska - imagesy($vodoznak) - 20;
                  imagecopymerge($obrazek,$vodoznak,$pozice_odleva,$pozice_shora,0,0,imagesx($vodoznak),imagesy($vodoznak),100);
                  imagejpeg($obrazek,"fotky/$id/$nazev",100);


                  $sirka = 140;
                  $vyska = $sirka / (imagesx($docasny) / imagesy($docasny));

                  if ($vyska > 100) {
                     $vyska = 100;
                     $sirka = 100  / (imagesy($docasny) / imagesx($docasny));
                  }

                  $platno = imagecreatetruecolor($sirka,$vyska);
                  imagecopyresampled($platno,$docasny,0,0,0,0,$sirka,$vyska,imagesx($docasny),imagesy($docasny));
                  imagejpeg($platno,"fotky/$id/_$nazev");

                  
                  $nejvyssi = MySQL_Query("SELECT id FROM inzeraty ORDER BY id DESC LIMIT 0,1");
                     $id = MySQL_Result($nejvyssi,0,"id")+1;

                  MySQL_Query("INSERT INTO fotky(inzerat,foto) VALUES('$id','$nazev')");
                  
                  for ($a=1;$a<=5;$a++) {
                     unlink("fotky/$id/docasny$a.jpg");
                     }
            }
         }
      }
      
         
         $sloupce .= ",kategorie,dohodou,url,kod,ip,prohlizec";
         if (isset($_SESSION[login])) $sloupce .= ",autor"; 
         
         $kod = kod(20);

         $data .= ",'$_POST[kate]','$_POST[dohodou]','".url_bez($_POST[nadpis])."-".Time()."','".$kod."','$_SERVER[REMOTE_ADDR]','$_SERVER[HTTP_USER_AGENT]'";
         if (isset($_SESSION[login])) $data .= ",'$_SESSION[login]'";

         MySQL_Query("INSERT INTO inzeraty($sloupce) VALUES($data)");
         $inz = MySQL_Query("SELECT id FROM inzeraty ORDER BY id DESC");
            $id = MySQL_Result($inz,0,"id");

         $text = "...";

         posli_mail(E_MAIL_INZERCE,E_MAIL,"Novy inzerat",$text,1);
         
         if (!isset($_SESSION[login])) {
            $text = "...";
            
            $predmet = StrTr($_POST[nadpis], "ÁÄČÇĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽáäčçďéěëíňóöřšťúůüýž", "AACCDEEEINOORSTUUUYZaaccdeeeinoorstuuuyz");
            posli_mail(E_MAIL_INZERCE,"$_POST[mail]","$predmet",$text,1,"",1);                   
         } 
         
         $cena = trim($_POST[cena]);
         Header("Location:index.php?status=ok&id=$id&cena=$cena");
         exit;
      }
   }
   

   if (count($chyba) != 0 || $chyba_rozmery == 1 || $chyba_obrazek == 1)  {
      $adresa = "podat_inzerat.php?status=";
      if ($chyba_podminky == 1) $adresa .= "podminky";
      elseif ($chyba_rozmery == 1) $adresa .= "rozmery";
      elseif ($chyba_obrazek == 1) $adresa .= "obrazek";
      elseif (count($chyba) != 0) $adresa .= "nevyplneno";

      for ($a=0; $a<count($hodnoty); $a++) {
         $hodnota = $hodnoty[$a];
         $adresa .= "&$hodnoty[$a]=$_POST[$hodnota]";
      }
      $adresa .= "&podminky=$_POST[podminky]&cena_typ=$_POST[cena_typ]&cena_typ2=$_POST[cena_typ2]";
      Header("Location:$adresa");
      exit;
   }
?>
Davex
Profil
Žádná zdejší rada nepomohla nebo jsi je nezkoušel?

Včera mi od uživatele přišel takovýto popis chyby: "Po kliknutí na uložení inzerátu se objeví prázdná plocha a nahoře jen jeden řádek,že v záhlaví smí být jen jedna destinace (nevím přesně slovosled)."
Bylo by dobré znát přesně znění té chyby.
Pavel Straka
Profil
Davex: Žádná rada nepomohla, samozřejmě jsem je zkoušel. Vím, že by bylo dobré znát přesné znění té chyby, již jsem uživatele požádal o upřesnění, hned, jak budu vědět více, podělím se s Vámi.
Davex
Profil
Pavel Straka:
Žádná rada nepomohla
To znamená, že když jsi zkoušel zaznamenávat ladící informace o průběhu skriptu do logu, tak z něj lze vyčíst, že při výskytu chyby proběhnou všechny části skriptu naprosto bezchybně a pouze se na konci z neznámého důvodu nepřesměruje?
Pavel Straka
Profil
Ano, dá se to tak říct. Pro upřesnění, uživatel zadá jednu z nutných položek špatně / nevyplní, tudíž se část kódu, která zapisuje data do DB přeskočí až k části, která přesměrovává na stránku s výpisem chyby. Skript se tedy provede až potud, problém by tedy měl být někde tady:
 if (count($chyba) != 0 || $chyba_rozmery == 1 || $chyba_obrazek == 1)  {
      $adresa = "podat_inzerat.php?status=";
      if ($chyba_podminky == 1) $adresa .= "podminky";
      elseif ($chyba_rozmery == 1) $adresa .= "rozmery";
      elseif ($chyba_obrazek == 1) $adresa .= "obrazek";
      elseif (count($chyba) != 0) $adresa .= "nevyplneno";
 
      for ($a=0; $a<count($hodnoty); $a++) {
         $hodnota = $hodnoty[$a];
         $adresa .= "&$hodnoty[$a]=$_POST[$hodnota]";
      }
      $adresa .= "&podminky=$_POST[podminky]&cena_typ=$_POST[cena_typ]&cena_typ2=$_POST[cena_typ2]";
      Header("Location:$adresa");
      exit;
   }
panther
Profil
Pavel Straka:
nechce se mi studovat celou diskusi, ale pokud myslíš, že je chyba zde, plní se ti správně proměnná adresa? Když dáš na 13. řádek před header die($adresa);, co se ti vypíše? Je tam přesně to, co při dané chybové situaci očekáváš?

Mimoto, v header bys měl předávat absolutní adresu, nikoliv relativní.
Pavel Straka
Profil
Ano, ta adresa se plní určitě správně. Navíc ta chyba se objevuje ve více souborech, toto je jen jeden, kde je výskyt nejčastější. A chyba se objevuje i s absolutní adresou.
Davex
Profil
Neprojde-li kontrola vyplněného formuláře na začátku, tak budou na konci neinicializované proměnné $chyba_podminky, $chyba_rozmery a $chyba_obrazek. Nemůže být chyba v tom, že se o tom vypíše varování?

Také když skládáš novou adresu, tak nijak neošetřuješ vypisované hodnoty a může tedy vzniknout neplatné URL.
Pavel Straka
Profil
Ale jakékoliv varování by se přece díky tomuto:
error_reporting(E_ERROR | E_WARNING | E_PARSE);
mělo vypsat nebo ne?


A proč by se chyba vyskytovala jen takto nahodile? A jak prosím myslíš to s ošetřováním vypisovaných hodnot?
Davex
Profil
Pavel Straka:
mělo vypsat nebo ne?
Tím to vlastně nebude, protože nedefinované proměnné jsou E_NOTICE, takže se o tom chyba nezobrazí.

Když bude v některé položce nějaký vtipný znak - třeba v poznámce nový řádek - tak se složí nová adresa na víc řádků, a to není moc dobře. Chtělo by to všechny hodnoty vkládané do adresy escapovat pomocí urlencode().
Pavel Straka
Profil
To máš vlastně pravdu, každopádně to by se ta chyba děla mnohem častěji, protože to, že uživatel nevyplní všechny povinné položky korektně se děje celkem často. Možná by zakopaný pes mohl být v té druhé alternativě, kterou jsi zmínil.
Franko
Profil *
Pavel Straka:

Dobry den,

zobrazuje se chybove hlaseni na ruzych OS, nebo jen na Linuxu ?
Pavel Straka
Profil
Franko: Nevím, jak přesně to myslíte, hosting běží na Linuxu, co se týče uživatelů, zobrazuje se chyba i jinde než na Linuxu.
Davex: Ještě jsem se nad tím zamýšlel, a došlo mi, že ta možná příčina, o které jsme mluvili, nekoresponduje s faktem, že po obnovení stránky vše funguje normálně, v pořádku. Nenapadá tě ještě něco?
Děkuju

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: