Autor | Zpráva | ||
---|---|---|---|
Martin888 Profil * |
#1 · Zasláno: 10. 6. 2011, 11:28:00
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 |
#2 · Zasláno: 10. 6. 2011, 11:36:10
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 * |
#3 · Zasláno: 10. 6. 2011, 12:27:41
Ernie:
Tak nějak chápu ty chyby ovšem nevím ani netuším jak to řešit :( |
||
Ernie Profil |
#4 · Zasláno: 10. 6. 2011, 14:06:59
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 * |
#5 · Zasláno: 10. 6. 2011, 14:12:09
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 |
#6 · Zasláno: 10. 6. 2011, 18:31:56 · Upravil/a: Davex
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 |
#7 · Zasláno: 10. 6. 2011, 19:38:45 · Upravil/a: soucekgns
Tam musí být nějaká jiná chyba...
Mě to bez problémů funguje |
||
Martin888 Profil * |
#8 · Zasláno: 11. 6. 2011, 00:50:37
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 * |
#9 · Zasláno: 11. 6. 2011, 00:53:38
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 |
#10 · Zasláno: 11. 6. 2011, 01:00:32 · Upravil/a: Tori
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 * |
#11 · Zasláno: 11. 6. 2011, 01:03:28
Tori:
Nic zůstává stejná chyba. Zkusím kontaktovat ještě hosting, protože na localhostu mi to normálně funguje. |
||
YoSarin Profil |
#12 · Zasláno: 11. 6. 2011, 02:39:12
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 |
#13 · Zasláno: 11. 6. 2011, 05:24:31
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 |
#14 · Zasláno: 11. 6. 2011, 10:36:52 · Upravil/a: Davex
Martin888:
„Bylo to dělané tak, že ze stránky ht>tp://w>ww.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(ht>tp://w>ww.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 * |
#15 · Zasláno: 11. 6. 2011, 11:34:59
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 |
#16 · Zasláno: 11. 6. 2011, 11:54:44 · Upravil/a: Davex
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 * |
#17 · Zasláno: 11. 6. 2011, 12:15:09
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'; ?> |
||
Časová prodleva: 13 let
|
0