Portál AbcLinuxu, 12. května 2025 01:42

Dotaz: PHP funkce COPY ve skriptu volaném CRONem

27.5.2009 16:05 Saix
PHP funkce COPY ve skriptu volaném CRONem
Přečteno: 592×
Odpovědět | Admin

Zdravím,

vytvořil jsem php skript, který pracuje jak má zavoláním z browseru i z shellu pod rootem (Debian). Nechce mi ale fungovat pod cronem.

Cron zcela určitě běží. Dokonce po zapnutí logování je vidět, že se skript spouští. Potíž je v tom, že nedělá co má. Využívá php funkce copy ke vzdálenému stažení a uložení souboru na serverový disk. Skript je přes cron spouštěn rootem, adresář kam se soubor má uložit má práva na 777 a vlastníka root. Přesto to vypadá, že uložení souboru vždy selže, pokud je skript volán z cronu.

Nějaké nápady co s tím?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.5.2009 16:20 marek
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Odpovědět | | Sbalit | Link | Blokovat | Admin

Dobry den.

Cron muze mit jinak nastaveny PATH nez ho ma nastaveny nalogovany root.

Marek

27.5.2009 16:28 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem

V tom to bohužel taky nebude, protože ve skriptu mám include('config.php') a ten se evidentně načte ze správného adresáře i bez absolutní cesty, protože informace se zapisují do databáze z parametrů v naicludovaném souboru správně.

Když jsem to pak prvně nechal spustit přes cron tak jsem se divil, že se mi soubor nestáhl, ale do databáze se mi data zapsala. Tak jsem to ošetřil podmínkou if(copy(..)) která evidentně vrací false, protože do databáze se nic nezapíše a soubor nestáhne. Přes browser nebo shell to ale funguje.

Takže v cestách bych taky problém neviděl.

27.5.2009 18:19 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Když to kopírujete ze vzdáleného serveru, tak to asi v copy používáte fopen wrapper, ne? Ten by mohl vracet nějakou hlášku (vizte manuál) copy --> fopen --> Errors/Exceptions If the open fails, the function an error of level E_WARNING is generated. Nevím no, možná jen řeknou "že to selhalo" :) Asi nejsnáž to vyzkoušet udělat fopen(vzdálený soubor) nebo tak něco.
27.5.2009 19:00 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem

nn používám čistě copy(odkud,kam), přičemž odkud je vzdálená URL

Ale ví,m, že fopen funguje protože ten tam taky používám, ale na něco trochu jiného, nejprve si načítám potřebné informace pro následný download z json souboru (něco jako xml), právě přes fopen a to se do databáze zapisuje úspěšně, selže to až při snaze uložit na disk soubor, dokonce i přes fwrite, jak jsem si teď ověřil.

 

KAPITULACE a funkční leč nehezké řešení:

Protože přes webové rozhraní to jde, tak jsem si vytvořil druhý php skript, který spouštím cronem a v něm pouze otevírám a zavírám pro čtení přes fopen ten první, kde parametrem je celá URL adresa. Takže ten první skript spustí ten druhý přes webové rozhraní. Musel jsem ale bohužel zvýšit limity serveru pro zpracování skriptů přes webové rozhraní (execution time, paměť atp.)

27.5.2009 19:04 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Nestačilo by v cron použiť lynx na ten php súbor na webe?
27.5.2009 19:17 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem

No moje řešení nepotřebuje ani browser, prostě jednoduše fopen, fclose. Lynx by udělal v podstatě to samé. A myslím, že problém s limity by to nevyřešilo. Lynx by sice běžel přímo na tom serveru, ale opět by odkazoval absolutní URL, takže by apache opět bralo v potaz nastavení php pro externí webové rozhraní.

Až budu mít víc času se v tom hrabat, zkusím zapnout na moment logy a zjistit jestli to něco hlásí. Teď by mě ty logy, ale přidělaly moc práce a možná by to nahlásilo jen "copy failed" nebo "permision denied", což by mě zrovna moc nepomohlo. Stejně už nevím jaká práva bych kde mohl nastavit.

27.5.2009 20:15 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Rozhodně analýzou chybových hlášek se správně (TM) má začínat, až pak psát na abclinuxu.cz ;)
27.5.2009 20:17 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Samozřejmě pokud máte pocit že ostatní mají víc času než vy tak na chybové hlášky kašlete a hledejte řešení cestou "někdo na abclinuxu něco tipne a já zkusím zjistit jestli se náhodou netrefil".
27.5.2009 21:51 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem

Zdá se mě to nebo si odpovídáš na vlastní příspěvěk? To nevypadá úplně normálně a proto nemá smysl se před tebou ospravedlňovat. Ke svému jednáním mám důvody. A rozhodně bych nechtěl plýtvat něčím časem, kromě toho tvého samozřejmě. Pokud tě totiž odpovědi na dotazy natolik obtěžují, nechápu, co tady vůbec pohledáváš. Nemůžeš přece očekávat, že každý se bude řídit postupem řešení, kterým by ses patrně řídil ty. Existují opodstatnitelné vyjímky. Prosím opusť toto vláknu a již se nevracej :) O tvou pomoc nestojím.

28.5.2009 01:14 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Klídek, vždyť mám pravdu. Přečíst si chybové hlášky je základ, to není nějaký můj patentovaný postup.
28.5.2009 01:15 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
A pokud chci ke svému příspěvku něco dodat, logicky to řeším reakcí na něj, aby to nezapadlo. Vždyť to je také normální, na to přijdete.
27.5.2009 20:14 Ash | skóre: 53
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
nn používám čistě copy(odkud,kam),

vizte ten zmíněný manuál, fce copy. když je "odkud" vzdálená URL, tak ve skutečnosti transparentně používáte fopen wrapper, fce copy sama o sobě by vzdálené kopírování nezvládla.

Zdá se tedy že popisujete dvě různé chyby: 1) copy nefunguje vzdáleně (ale fopen ano), 2) nefunguje zápis na disk.
27.5.2009 21:37 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem

Nefunguje pouze zápis na disk.

27.5.2009 22:37 Saix
Rozbalit Rozbalit vše Re: PHP funkce COPY ve skriptu volaném CRONem
Odpovědět | | Sbalit | Link | Blokovat | Admin

Vyřešeno

Po tolika hodinách jsem nakonec objevil chybu tam kde jsem ji hledal hned na začátku. Cesta v "copy" musí být serverová absolutní cesta. Jenže chybu to nevyhazovalo ani nelogovalo, prostě se to jen nezkopírovalo. Ačkoli jsem zkoušel téměř každou prkotinu na tohle jsem už nějak pozapomněl a to taky proto, že v "include" příkazu to vzalo klidně relativní adresu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.