Problém s dočasným adresářem /tmp

Úvodní stránka Fórum podpory WordPressu Problémy s WordPressem Problém s dočasným adresářem /tmp

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á 8 let, 3 měsíce.

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (z celkem 15)
  • Autor
    Příspěvky
  • #1536

    zemq
    Participant

    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

    #11103

    neteyescz
    Participant

    Zdraví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

    #11104

    zemq
    Participant

    Dí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

    #11105

    neteyescz
    Participant

    Mož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.

    #11106

    zemq
    Participant

    Kontaktoval 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

    #11107

    admin
    Keymaster
    Web

    Podle 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.

    #11108

    zemq
    Participant

    Ano, 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

    #11109

    admin
    Keymaster
    Web

    Ano, stačí FTP a administrátor WordPressu. Dneska už to ale nebude :-) Dobrou…

    #11110

    zemq
    Participant

    To je jasný, slušný lidi jdou spát :)

    #11111

    zemq
    Participant

    Zdraví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

    #11112

    Lukenzi
    Participant

    Zdraví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.

    #11113

    admin
    Keymaster
    Web

    Ano, 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…

    #11114

    admin
    Keymaster
    Web

    A 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).

    #11115

    zemq
    Participant

    Velice 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

    #11116

    neteyescz
    Participant

    To nás těší ;)

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (z celkem 15)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.