Autor Zpráva
spoj_alfa
Profil *
Chtěl bych na stránky umístit informaci, kterou lze načíst na cizích stránkách, tedy konkrétně:
kdesi v této diskusi jsem našel odkaz na stránku např. "http://www.google.com/ig/api?weather=Klinovec". Otevřením běžným prohlížečem mi jako odpověď přijde (pravděpodobně vygenerovaný) xml soubor s informací o aktuálním počasí, v tomto příkladě na Klínovci. Naučil jsem se pomocí PHP vyjmout konkrétní informaci z tohoto souboru, ovšem pouze pokud jej mám již někde ve složce uložený. Teď tedy potřebuji soubor v pravidelných intervalech (např. po hodině) aktualizovat/ukládat v adresáři pod svou doménou. Zkoušel jsem všelicos, ale zatím bez úspěchu. Problém je pravděpodobně v tom, že soubor se musí vždy při dotazu prohlížečem vygenerovat, já se snažim data stáhnout PHP skriptem, který se ani jako prohlížeč nehlásí. V PHP nejsem zdatný, ale když mi někdo ukáže směr... Celý problém bych tedy rozložil na 2 části:
1. načtení dat a uložení do souboru
2. pravidelné opakování tohoto načítání
nightfish
Profil
ad 1) curl
ad 2) cron
Alphard
Profil
1. copy(), nebo pro načtení do proměnné file_get_contents(), ukládat byste si mohl již zpracovaná data.
2. Pro pravidelné opakování hledejte cron, ale stačilo by při načtení souboru kontrolovat jeho stáří a občas aktualizovat PHP: filemtime - Manual
spoj_alfa
Profil *
Alphard,nightfish:
Dík za odpovědi, ale problém bude možná ještě jinde...
Funkce copy(), fopen(), file_get_contents() jsem již zkoušel a vždy se stejným výsledkem:

Warning: copy(http://www.google.com/ig/api?weather=Klinovec) [function.copy]: failed to open stream: Connection refused in /var/www/web1894/web/test/pocasi2.php on line 11
failed to copy http://www.google.com/ig/api?weather=Klinovec...

Warning: file_get_contents(http://www.google.com/ig/api?weather=Klinovec) [function.file-get-contents]: failed to open stream: Connection refused in /var/www/web1894/web/test/pocasi2.php on line 2

Ještě zkusím curl - tam je trochu větší nabídka, tak se tím nejdřív zkusím prokousat.
spoj_alfa
Profil *
Zkoušel jsem tedy využít curl, ale výsledkem následujícího je prázdná stránka. Stejný výsledek je vždy při použití jiné domény, než z které skript spouštím, pokud použiju do parametru $url soubor z vlastní domény tak funguje.

<?php
$url = "http://www.google.com/ig/api?weather=Klinovec";
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) ");
  $data = curl_exec($ch);
  echo ($data);
  curl_close($ch);
?> 


Nastavení přenosu curl_setopt má tolik volitelných parametrů, že vyzkoušením všech kombinací bych strávil mládí a nakonec tady možná ani není problém. Těch parametrů jsem nastavoval mnohem víc, ale tyto 3 jsou podle mého nutné a měly by být dostačující pro přenos dat. Nemáte někdo představu co s tím?

Moderátor Alphard: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
nightfish
Profil
spoj_alfa:
zřejmě tě Google nemá rád
uvedený kód jsem vyzkoušel u sebe a funguje bez problémů

Zkoušel jsem tedy využít curl, ale výsledkem následujícího je prázdná stránka.
ve Firefoxu ano - výsledkem požadavku je XML, které se firefox neobtěžuje zobrazit
zkus si ten skript spustit v Internet Exploreru a nebo se ve Firefoxu podívej na zdrojový kód
spoj_alfa
Profil *
Tu hodnotu začínající "Mozilla/4.0......" jsem opsal z řádku, který mi vypsala funkce phpinfo() > HTTP Headers Information > User-Agent (přišlo mi to i jako hodnota, která by měla být akceptovatelná), ve skutečnosti to otvírám pod IE8. Na zdrojový kód se vždy také koukám a není to úplně prázdná stránka, ale 3x odřádkování, takže vlastně prázdná stránka.
Už jsem nechtěl posledně znovu doplňovat vlastní odpověď, ale otestoval jsem funkci file_get_contents() na soubor pod vlastní doménou a funguje. Problém je tedy u všech funkcí pouze pokud se snažim stáhnout odjinud (google..., volweb..., http://www3.axfone.cz/ - testnul jsem i poskytovatele hostingu vlastních stránek) - nelze tedy stahovat z úrovně mimo vlasní root.
Curl tedy nevypisuje chybová hlášení oproti file_get_contents() nebo copy(). Vyhledával jsem informace na téma "failed to open stream: Connection refused", ale nic co by mi pomohlo.
nightfish
Profil
spoj_alfa:
Curl tedy nevypisuje chybová hlášení
jde nastavit, aby curl vypisovat podrobný log do souboru...
$fp = fopen("log.txt", "w");
// $ch = curl_init();
curl_set_opt($ch, CURLOPT_VERBOSE, true);
curl_set_opt($ch, CURLOPT_STDERR, $fp);

...
fclose($fp);
spoj_alfa
Profil *
nightfish:
Dík za trpělivost
Konečně jsem se tím prokousal a protože jsem slepej a tupě kopíruju, nevěděl jsem, proč mi nefunguje curl_set_opt >>> curl_setopt. V souboru jsem nalezl následující:

* About to connect() to www.volweb.cz port 80
* Trying 212.20.96.25... * Connection refused
* couldn't connect to host
* Closing connection #0

tedy pokud správně chápu, vzdálený server mne z nějakého důvodu odmítl. Port 80 by měl být podle mého správně a víc se takto nedovím. Možná je chyba v parametru CURLOPT_USERAGENT... No budu to zkoušet.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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