Autor Zpráva
Martin888
Profil *
Dobrý den,

asi rok jsem měl na stránkách funkční kód na ukazování teploty. Nyní mi to začalo dělat problémy, pomůžete mi dopátrat se chyby? ... V PHP jsem úplná lama, tak nějak polopatě Děkuji.

<?php

$teplota = file_get_contents("http://www.skrealty.cz/duo/teplota/teplota-hp.php");
$rozdeleni = explode("Aktuální teplota je", $teplota);
$rozdeleni_final = explode("  °C.</strong>", $rozdeleni[1]);

echo $rozdeleni_final[0]. " °C"

?> 


Na serveru už mám povolenu hodnotu url_fopen , myslím si že tedy bude někde chyba v kódu. Chybu můžete sledovat zde
www.chata-sachovka.cz/soubory/teplota2.php (načítá se delší dobu).

Díky za všechny informace a úpravy kódu...
Ernie
Profil
Chybová hláška:
Warning: Division by zero in /hosting/www/chata-sachovka.cz/www/soubory/teplota2.php on line 5
Warning: file_get_contents(http://www.skrealty.cz/duo/teplota/teplota-hp.php): failed to open stream: Connection timed out in /hosting/www/chata-sachovka.cz/www/soubory/teplota2.php on line 10
Notice: Undefined offset: 1 in /hosting/www/chata-sachovka.cz/www/soubory/teplota2.php on line 12 °C [/pre]

Takže postupně:
Division by zero znamená dělení nulou.
To není úplně v pořádku.
failed to open stream: Connection timed out znamená, že se nepořadilo otevřít soubor, protože vypršel čas spojení.
To znamená, že se skript vykonává příliš dlouho (možná nekonečný cyklus způsobený dělením nulou?).
Undefined offset: 1 znamená, že čtete z nějakého pole např. pole[1], ovšem na indexu 1 nic není.
(to je asi způsobeno tím, že čtete ze souboru, který se nenačetl).
Martin888
Profil *
Ernie:
Tak nějak chápu ty chyby ovšem nevím ani netuším jak to řešit :(
Ernie
Profil
Zkuste toto:
<?php
set_time_limit(30);
$teplota = file_get_contents("http://www.skrealty.cz/duo/teplota/teplota-hp.php");
$rozdeleni = explode("Aktuální teplota je", $teplota);
$rozdeleni_final = explode("  °C.</strong>", $rozdeleni[1]);
echo $rozdeleni_final[0]. " °C";
?>

Tím zvýšíte časový limit skriptu.
Pokud by to nestačilo, zkuste zvýšit to číslo.
Martin888
Profil *
Ernie:
No to se mi nezdá, pokud se ten skript nevykoná hned, tak je něco špatně. Dokud se nenačte ten skript, tak se mi nenačte ani stránka (což je nepraktické)...

Ale večer určitě vyzkouším ;)
Davex
Profil
Martin888:
Pomocí funkce file_get_contents() se ti nenačte obsah žádné stránky (třeba jiný web) nebo je problém pouze s touto?
soucekgns
Profil
Tam musí být nějaká jiná chyba...
Mě to bez problémů funguje
Martin888
Profil *
Martin888:
Tak nic, nepomáhá...

Davex:
Bylo to dělané tak, že ze stránky http://www.skrealty.cz/duo/teplota/teplota-hp.php se odstranil veškerý text a zůstala samostatná teplota.

soucekgns:
Tobě to funguje? Teď jsem to zkoušel a pořád nic :(
Martin888
Profil *
Chci se zeptat co přesně dělá tento kus kódu?
$rozdeleni_final = explode("  °C.</strong>", $rozdeleni[1]);


Protože podle chyby Undefined offset: 1 je něco špatně s tím
$rozdeleni[1]
Tori
Profil
Martin888:
Zkuste tam použít $rozdeleni[0]. Předchozí explode by měl sice rozdělit řetězec na dvě části, ale jelikož je jako oddělovač jednotlivých částí zadaný začátek textu, tak z toho vznikne pouze jedna část. Je možné, že v předchozí (funkční) verzi byly ještě nějaké (bílé) znaky před "Aktuální", takže se ten text rozdělil na dvě části.
Martin888
Profil *
Tori:
Nic zůstává stejná chyba.

Zkusím kontaktovat ještě hosting, protože na localhostu mi to normálně funguje.
YoSarin
Profil
Tori:
koukni na html, před tím hledaným textem je spousta balastu...
Martin888:
Zkuste:
// nastavíme si timeout pro file_get _contents, aby se nám to nenačítalo donekonečna
define('TIMEOUT', 3);
$context = stream_context_create(array(
    'http' => array(
        'timeout' => TIMEOUT      // Timeout in seconds
    )
));
$teplota = file_get_contents("http://www.skrealty.cz/duo/teplota/teplota-hp.php", null, $context);
if ($teplota) {
  // všechno OK, data se načetla během TIMEOUT vteřin
  $rozdeleni = explode("Aktuální teplota je", $teplota);
  $rozdeleni_final = explode("  °C.</strong>", $rozdeleni[1]);

  echo $rozdeleni_final[0]. " °C"
} else {
  // nepodařilo se v nastaveném čase stáhnout potřebné informace
  echo 'Teplotu se nepodařilo načíst';
}

ale vzhledem k [#2] bych řekl, že je tam i nějaký kód který jste nám neposkytl - opravdu je to, co jste vložil kompletní obsah souboru '/hosting/www/chata-sachovka.cz/www/soubory/teplota2.php' ?
Majkl578
Profil
Scripty v [#1], [#4] a [#12] vyžadují povolenou direktivu allow_url_fopen, což by teoreticky mohlo jít i v htaccessu.

Případně lze ještě použít knihovnu cURL, pokud je na serveru přítomna.

Tady je univerzální script, který prvně zkusí cURL, pokud neexistuje, zkusí obyčejné načtení a pokud i to selže, umře. Mimojiné obsahuje i elegantnější cestu jak získat hodnotu...
$url = 'http://www.skrealty.cz/duo/teplota/teplota-hp.php';

if (extension_loaded('curl')) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
} elseif (($data = file_get_contents($url)) !== FALSE) {
    //success - do nothing
} else die('Nelze získat teplotu');

//získání teploty
preg_match('~<strong>Aktuální teplota je\s+(\d+(?:\.\d+))\s+°C.</strong>~iu', $data, $temp);

echo $temp[1], ' °C';
Davex
Profil
Martin888:
Bylo to dělané tak, že ze stránky http://www.skrealty.cz/duo/teplota/teplota-hp.php se odstranil veškerý text a zůstala samostatná teplota.
Na to jsem se neptal.

Když spustíš následující skript, tak to tu chybu „Warning: file_get_contents(http://www.seznam.cz/): failed to open stream: Connection timed out in ... on line ...“ nehlásí?

<?php
  $kod = file_get_contents('http://www.seznam.cz/');
  echo '<pre>';
  var_dump($kod);
  echo '</pre>';

Majkl578:
Scripty v [#1], [#4] a [#12] vyžadují povolenou direktivu allow_url_fopen
Kdyby jí měl Martin888 vypnutou, tak by se hlásila jiná chyba.
Martin888
Profil *
YoSarin:
Když jsem vyzkoušel ten tvůj kód, tak se mi zobrazila pouze čistá stránka, ani žádnou hlášku to nevyhodilo.
Jinak ano je to kompletní kód pro získání teploty, takhle to doposud fungovalo.

Majkl578
Když vyzkouším tvůj kód tak to hází chybu:

Warning: Division by zero in /hosting/www/chata-sachovka.cz/www/soubory/teplota2.php on line 4 Warning: preg_match(): Compilation failed: invalid UTF-8 string at offset 13 in /hosting/www/chata-sachovka.cz/www/soubory/teplota2.php on line 20 °C

viz.:
http://www.chata-sachovka.cz/soubory/Majkl578_teplota.php


Davex:
Když pustím tvůj uvedený skript, tak výsledek je:
http://www.chata-sachovka.cz/soubory/seznam.php


jinak hodnota allow_url_fopen je povolena, potvrdili mi to na hostingu.
Davex
Profil
Martin888:
Takže jiná stránka se stáhne a všem ostatním tvůj skript funguje. To by mohlo znamenat, že se správci webu skrealty.cz nelíbilo, že někdo často přistupuje na to URL s teplotou a zablokoval přístup z IP adresy tvého webhostingového serveru.

Compilation failed: invalid UTF-8 string at offset 13 in ... on line 20
Zvláštní, Majkl578 sem dá 15 řádků, a ty máš chybu na tom 20. Nechceš sem dát to, co máš předtím?
Martin888
Profil *
Davex:

Tak to by bylo škoda kdyby to už nešlo. Asi se poohlídnu po nějaké svém vlastním internetovém teploměru.
Jinak ten výpis chyb bych měl teda dávat asi až na konec že?

<?php
  ini_set("display_errors", 1); //nepouzivejte v PHP4
  error_reporting(E_ALL);
  $a = 5 / 0;   //chyba deleni nulou
?>

<?
$url = 'http://www.skrealty.cz/duo/teplota/teplota-hp.php';

if (extension_loaded('curl')) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
} elseif (($data = file_get_contents($url)) !== FALSE) {
    //success - do nothing
} else die('Nelze získat teplotu');

//získání teploty
preg_match('~<strong>Aktuální teplota je\s+(\d+(?:\.\d+))\s+°C.</strong>~iu', $data, $temp);

echo $temp[1], ' °C';

?>

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