Úvodní stránka › Fórum podpory WordPressu › Problémy s WordPressem › Problém s dočasným adresářem /tmp
Štítky: disable_functions, get_temp_dir(), open_basedir, set_time_limit(), sys_get_temp_dir(), tempnam(), tmp, upload_tmp_dir, WP All Import, WP_TEMP_DIR, xml
Zvolené téma obsahuje celkem 14 odpovědí. Do diskuze (4 účastníci) se naposledy zapojil uživatel neteyescz a poslední změna je stará 12 let, 9 měsíců.
-
AutorPříspěvky
-
13. dubna 2012 (20:22) #1536
Zdravím,
snažím se rozchodit jeden plugin na import XML, ale nemohu překonat problém s open_basedir. Neustále mi to v adminu vypisuje následující hlášku:
Warning: tempnam() [function.tempnam]: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/data/web/virtuals/20713/virtual) in /data/web/virtuals/20713/virtual/www/domains/bulharsko.dovolena-7.cz/wp-content/plugins/wpallimport/libraries/XmlImportTemplateCodeGenerator.php on line 101
Warning: file_put_contents() [function.file-put-contents]: Filename cannot be empty in /data/web/virtuals/20713/virtual/www/domains/bulharsko.dovolena-7.cz/wp-content/plugins/wpallimport/libraries/XmlImportTemplateCodeGenerator.php on line 103
Composing contents…
Těch hlášek je samozřejmě víc, ale řekl bych, že jsou následkem té první. Z té jsem schopen vyluštit, že se jedná o problém s přístupem do dočasného adresáře /tmp, ale bohužel už nevím co s tím. Adresář tmp na serveru mám snad na správném místě (zkoušel jsem jej vytvořit i na jiných adresářových úrovních, ale úspěch to nepřineslo) a zkoušeno bylo CHMOD 777 i 775, takže tady by problém být neměl. Kontaktoval jsem autora pluginu, ten tvrdí, že je třeba provést jiné nastavení na hostingu, tam mi zase napsali, že chyba není u nich, ale že je potřeba upravit konfiguraci ve wp. Na můj dotaz, zda je možné v php.ini změnit cestu k dočasnému adresáři odpověděli, že to změnit nejde.
Stejný plugin na jiném hostingu a stejné verzi wp jede bez problémů, takže bych si tipnul, že problém bude nejspíše v nastavení současného hostingu. Z toho, co jsem všechno vyzkoušel a co jsem si přečetl, tipuji, že někde v konfiguraci wp potřebuji změnit nastavení cesty k dočasnému adresáři – zkoušel jsem měnit cestu v Nastavení > Média, pak taky pomocí wp_temp_dir v souboru wp-config.php, a taky jsem přes ftp přidával nějaký nový php.ini soubor, ale nic nezabralo a plugin pořád nefunguje.
Jen dodám, že wp je ve verzi 3.3.1 (zkoušeno ale i 3.1.3 a stejný výsledek), php verze 5.3.9., hosting Wedos, který má úplně jinou adresářovu strukturu než ten původní, což bude asi právě kámen úrazu.
Věděl by někdo, jak problém vyřešit?
Díky
Zemq
13. dubna 2012 (20:39) #11103Zdravím,
Podivné, Wedos mám rád a většinou vše podporuje, nicméně vámi zmíněná chybová hláška označuje, že složka /tmp není oprávněna měnit obsah zmíněných souborů. Zkoušel jste nastavit CHMOD zmíněným souborům?
S Pozdravem,
Neteyescz
13. dubna 2012 (20:48) #11104Díky za reakci. Adresář je nastaven na CHMOD 777 (případně na 775), ale adresář je prázný. Kvůli té chybě se žádný soubor ani nevytvoří.
Jinak Wedos mám taky rád a proto k nim postupně přesunuji vše, tak doufám, že tohle rozchodím. Na podpoře mi napsali, že “nekde v konfiguraci wp musíte mít zadanou špatnou cestu k adresáři tmp. Ta je /data/web/virtuals/20713/virtual/tmp nikoliv /tmp.” Z toho usuzuji, že se wp snaží přistupovat do adresáře o několik úrovní výše a tam pochopitelně nemůže. Ale nedaří se mi přijít na to, jak mu to rozmluvit.
Ještě připojuji adresu phpinfo, pokud by to k něčemu bylo.
http://dovolena-7.cz/phpinfo.php
Ještě jednou díky za čas.
Zemq
13. dubna 2012 (20:51) #11105Možná se trochu podívat do pluginu a případně opravit cesty…
Ale musí tomu předcházet úplná záloha serveru a databáze.
13. dubna 2012 (22:39) #11106Kontaktoval jsem autora pluginu s žádostí o úpravu, tak jsem zvědav. Moje znalosti programování na toto nestačí. Dám pak vědět jak jsem dopadl. Nicméně pokud by mezitím ještě někoho něco napadlo, tak sem s tím.
Zemq
13. dubna 2012 (22:52) #11107Podle výše uvedených údajů se zdá, že jde o prémiový plugin WP All Import?
Patrně to bude chtít trochu prozkoumat zdrojový kód pluginu, protože tam bude nějaký problém. Pokud hostujete u Wedosu, tak moc nevěřím, že by byl problém na straně hostingu, pokud je tedy plugin napsán “korektně”. Ideální by bylo, pokud byste mohl poslat přístupy ke konkrétnímu webu na email pavelevap@separatista.net.
Problém může být ve špatné definici parametrů pro funkci tempnam(). Obvykle bývá nejdříve definován nějaký adresář a až když neexistuje, tak se skript pokouší uložit soubor do výchozího tmp adresáře serveru (ten ale bude patrně na sdíleném hostingu pochopitelně zakázán právě pomocí direktivy open_basedir). Takže chce to prozkoumat, co a kam chce ta funkce ukládat a proč se tam objevuje problém…
Trik s pomocí WP_TEMP_DIR pak myslím funguje pouze v případě, že autor pluginu správně používá API WordPressu, jinak je to víceméně k ničemu.
13. dubna 2012 (23:03) #11108Ano, jedná se přesně o tento plugin. Koupil jsem zhruba před rokem, doteď mi poměrně úspěšně fungoval jinde a rád bych ho nyní rozchodil i na webech u Wedosu. Přístupy zašlu (stačí FTP a wp admin nebo je potřeba i MySQL?), moc děkuju za Váš zájem a čas.
Zemq
13. dubna 2012 (23:06) #1110913. dubna 2012 (23:08) #11110To je jasný, slušný lidi jdou spát :)
14. dubna 2012 (17:11) #11111Zdravím, tak jsem před chvilkou dostal odpověď od autora pluginu na mou žádost o úpravu pluginu. Tady je:
“The error is not with the plugin code. The plugin is not hardcoded to only write to “/tmp” – it tries to write to the location of the temp directory, as specified by your web host.
There is a PHP global variable, set by your web host, which is the path to the temp directory.
Your web host needs to set this to /data/web/virtuals/20713/virtual/tmp instead of /tmp.”
No tak teď už fakt nevím, jak si s tím poradit.
Zemq
15. dubna 2012 (10:52) #11112Zdravím, do pluginu jsem nekoukal, ale funkce tempnam() vrací “false” v případě neúspěchu, takže bych asi plugin upravil tak, že pokud by byla tato funkce neúspěšná použila by se jiná alternativní funkce kde by se použil jiný adresář umístěný už kdekoliv na serveru.
function alternative_tempnam($dir,$prefix){
$name = $prefix.md5(time().rand());
$handle = fopen(ABSPATH.$dir.'/'.$name, "w");
fclose($handle);
return $dir.'/'.$name;
}
if(!function_exists('tempnam') || tempnam($dir, $prefix) === false){
alternative_tempnam($dir, $prefix);
}
Viz. komentáře v PHP manuálu.
15. dubna 2012 (12:48) #11113Ano, problém je ve funkci tempnam(), respektive v parametrech, které jí jsou v pluginu předávány a vedou tak k “neúspěchu” (aneb false). Trochu jsem plugin prozkoumal a oprava je vcelku jednoduchá (napsal bych to pak asi i autorovi pluginu, aby to upravil do dalších verzí).
1) Měl jste tam verzi 1.09, ale dostupná je už verze 1.26. Je nějaký důvod proč používat starší verzi? Aktualizoval jsem ho, ale nepomohlo to. Naopak se objevil další problém :-) Tentokrát šlo o problém s použitou PHP funkcí set_time_limit().
Podle dostupných informací totiž Wedos tuto funkci z bezpečnostních důvodů na sdíleném hostingu zakazuje (např. 1, 2). Je to docela zajímavé omezení tohoto hostingu, o kterém jsem dříve nevěděl (technicky je to provedené pomocí PHP direktivy disable_functions). Každopádně co s tím? Jednoduše stačí “zakometovat” 2 výskyty této funkce v kódu v souboru wp-content/plugins/wpallimport/controllers/admin/import.php, řádky 16 a 594.
Můžete také napsat autorovi pluginu, aby tyto problémy do budoucna odstranil např. pomocí jednoduché podmínky:
if ( function_exists( 'set_time_limit' ) ) {
set_time_limit( 120 );
}Případně:
if ( !ini_get( 'safe_mode' ) && strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) === FALSE) {
set_time_limit( 120 );
}Pokračování za chvíli…
15. dubna 2012 (13:26) #11114A zpět k původnímu problému…
Nejdůležitější část spočívá v této funkci (opět soubor wp-content/plugins/wpallimport/controllers/admin/import.php, tentokrát řádek 32:
XmlImportConfig::getInstance()->setCacheDirectory(sys_get_temp_dir());
Výsledkem funkce setCacheDirectory by měl totiž být právě tmp adresář pro dočasné odkládání souborů. Autor pluginu, ale bohužel používá funkci sys_get_temp_dir(), která bohužel nerespektuje klasické nastavení sdílených hostingů, a to open_basedir či upload_tmp_dir. Odkazuje tedy skript někam (hlavní tmp adresář celého serveru), kam nemá přístup. Místo této funkce je možné použít mnoho jiných možností, např.
ini_get( 'upload_tmp_dir' )
Vše lze ale jednoduše a komplexně vyřešit pomocí funkce WordPressu get_temp_dir(), která bere všechny tyto případy v potaz (umístěna v souboru wp-includes/functions.php) a při jejím použití lze také dále modifikovat odkládací tmp adresář pomocí konstanty WP_TEMP_DIR.
Výsledná funkce pak bude vypadat takto:
XmlImportConfig::getInstance()->setCacheDirectory(get_temp_dir());
Řešením je tedy nakonec vcelku jednoduchá změna, doporučuji ji ale zaslat i autorovi, aby ji zahrnul do další verze pluginu. Úpravu by měl podle mě přijmout, protože je snad bezproblémová a ještě využívá přímo funkce WordPressu (a nikoli PHP). Otestováno a funguje… Dovolil bych si nakonec tvrdit, že je to spíše problém na straně autora pluginu než hostingu…
P.S. Stejný dotaz je zde (a možná i jinde).
15. dubna 2012 (18:18) #11115Velice děkuji za pomoc. Plugin jsem kupoval zhruba před rokem (tehdy ve verzi 1.09) a přiznám se, že mne ani nenapadlo si stáhnout novější verzi. Váš postup jsem tedy aplikoval na ní, ale nenačetlo se vůbec XML. Tak jsem si tedy stáhl nejnovější verzi pluginu a po uvedených úpravách funguje.
Jinak problém s funkcí set_time_limit byl i ve starší verzi a “vyřešil” jsem ho stejně jako Vy tzn. zakomentováním inkriminovaných řádků. Jenže jsem se pak zasekl jinde.
Každopádně ještě jednou velice děkuji za vaši ochotu a čas, který jste mému problému věnovali.
P.S. příště už budu s žádostmi o pomoc při řešení problémů s WP chodit pouze sem :), protože jinde mi bohužel pomoci nedokázali a to jsem psal i na zahraniční fóra, kde se předpokládá širší členská základna
15. dubna 2012 (18:48) #11116To nás těší ;)
-
AutorPříspěvky
Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.