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
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);
$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
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.
$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
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
Děkuji
Tvůj komentář k článku
Políčka označené hvězdičkou * jsou povinné.
Poslední komentáře
- Udělal jsem si radost, koupil jsem si nové auto - prodám Škodu Felicii (mIRA)
- Jak includovat obsah z cizých stránek, když to server nepovoluje (mIRA)
- Jak includovat obsah z cizých stránek, když to server nepovoluje (pavels)
- Občan Havel, Pan Prezident (mIRA)
- Občan Havel, Pan Prezident (B)
