Jak includovat obsah z cizých stránek, když to server nepovoluje

9.2.2008
Nedávno jsem řešil problém s includováním obsahu z jiných stránek. To se může hodit, pokud například potřebujete zpracovávat data, která cizí stránka nabízí a dále s nimi pracovat.
Problém je, že pokud provozovatel hostingu zakáže v souboru php.ini direktivu allow_url_fopen načítání obsahu z jiných webů nebude fungovat. A to jak pomocí funkcí include, require, fopen, fread apod.

Na stránce se pouze ukáže varovný text:

URL file-access is disabled in the server configuration

failed to open stream: no suitable wrapper could be found in ...

Failed opening... for inclusion

V dnešní době je direktiva allow_url_fopen nastavena na off u většiny poskytovatelů hostingu.

Řešení, jak do svých stránek cizí obsah includovat jsou následující:

  • První možností je pokusit se přepsat defaultní nastavení pomocí fce ini_set('allow_url_fopen', 'on');, která by měla být jako první příkaz v top indexu stránek. Bohužel tohle fungovalo jen do PHP 4 myslím. Takže dnes nic takového asi nezafunguje :(
  • Druhou možností je se spojit s provozovatelem hostingu a vysvětlit mu že tuto funkčnost opravdu potřebujete a že to pro něj nebude žádné bezpečnostní riziko :)
  • Nebo můžete použít fci curl_init(); tak jako já

Pro načtení stránky tedy stačí použít následující konstrukci:

header("Content-Type: text/xml"); //nastavení hlavičky pro xml
$file = "http://www.example.com/rss.xml";
$f = curl_init($file);
curl_setopt($f, CURLOPT_HEADER, 0);
curl_exec($f);
curl_close($f);

Ve stránce, kde předchozí konstrukci voláte, se bude zobrazovat obsah z http://www.example.com/rss.xml. Danou stránku si však musíte následně zpracovávat pomocí JS, nebo AJAXu. Pokud byste chtěli tuto stránku totiž includovat, načte se vám pouze daná konstrukce :)

Pokud někdo víte o jiném, ať už jednodušším, nebo složitějším řešení includování stránek, neváhejte napsat.

mIRA
mIRA | webovky
V tomhle případě stačí upravit konstrukci popsanou výše na:

$ch = curl_init($file);
$f = fopen("temp.html", "w");
curl_setopt($ch, CURLOPT_FILE, $f);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($f);

a následně v PHP stránce zpracovat soubor temp.html:

$filename = "temp.html";
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);

Kde v proměnné $contents budou data.
pavels
pavels
Dobry den, vyzkoušel jsem Vaše doporučení jak includovat http://... funguje, ale výpis proběhl na standardní výstup. Já bych potřeboval includovat do stringu a ne na standardní výstup. Neznáte nějaký trik?

Děkuji

Tvůj komentář k článku

Políčka označené hvězdičkou * jsou povinné.

7 + 2 =