Autor Zpráva
4li3n
Profil
Dobrý den,

stalo se mi následující a prosím o radu, zda by někdo nevěděl...

Mám cronem spouštěný skript, který používá definované konstanty. Například konstanta "MANUFACTURER_FEED". Když spustím skript normálně z prohlížeče, vše je OK. Jakmile to projde cronem, tak ten jakoby neznal tuto definovanou konstantu, kterou mám uloženou ve zvláštním souboru a do onoho spouštěného skriptu tento soubor includuji přes include dirname( __FILE__ ) ."/../includes/xxx.php";

Spouštěný skript generuje textový obsah a ukládá jej do souboru pomocí file_put_contents(dirname( __FILE__ )."/XXX.xml",Feed::get());

Proč definovanou konstantu z includovaného souboru cron nevidí a přitom, když to projde přes prohlížeč (a tedy i apache) tak ji vidí?

Adresy mám absolutní (což je u cronu nezbytné) a jiný zádrhel tam nevidím.

Prosím o radu.

Díky Honza
Chro.
Profil
Jak víš, že CRON konstantu nevidí? Na konec spouštěného skriptu jsi si její hodnotu třeba přes file_put_contents uložil do pomocného souboru ke kontrole?
file_put_contents(time().'.txt', MANUFACTURER_FEED);
4li3n
Profil
Vím to, protože ve výstupu - v tom XML souboru je místo oné hodnoty definované v konstantě jen její název - a to se děje přesně, když použije člověk nedefinovanou konstantu...

Rozumíme si? Prostě vygenerované XML, kde je ta konstanta používána, je defektní - tedy není tam dosazena ta hodnota, ale pouze název oné konstanty.

Pokud spustím přes Apache (z prohlížeče), je vše OK..
tiso
Profil
Skontroluj si vložené súbory v tom cron skripte:
$files = get_included_files();
4li3n
Profil
Zkusil jsem a inkriminovaný soubor tam najdu, kde tu konstantu definuji, tam najdu....

To by mě tedy zajímalo o co jde... Kdyby to aspoň nefungovalo ani přes prohlížeč sakra...


Napadá mě jedna věc a to sice:

Mohlo by na to mít vliv, že v includovaném souboru užívám $_SERVER proměnné, které Cron samozřejmě nezná? Že by mu to nějak vadilo a tedy by nějak ignoroval například další řádky onoho includovaného souboru?


Oni ty konstanty, které $_SERVER používají nejsou v tom daném skriptu důležité, takže jsem to nějak neměl potřebu řešit. Napadlo mě to až teď...
Alphard
Profil
4li3n:
je místo oné hodnoty definované v konstantě jen její název - a to se děje přesně, když použije člověk nedefinovanou konstantu
PHP se někdy bohužel zotaví z chyb, za které by mělo programátorovi dát pár facek. To, že nedefinovanou konstanu bere jako řetězec je jedna z nich.

echo @NEDEFINOVANA_KONSTANTA; # PHP se s tím vyrovná, ale není to správný styl programování

Případ práce s nedefinovanými proměnnými je to samé. Potlačujte výpis hromady chyb (Notice abych byl přesný) a doufáte, že zbylá část scriptu provede to, co chcete... Doporučuji podívat se do logu a vše opravit tak, aby byl log čistý, pak to bude fungovat. Konstanty fungují i při spuštění cronem, chyba je jinde.

Kromě toho, script takto spouštěný cronem může zpracovávat jinak nakonfigurované PHP. Jestli vám to činí potíže, můžete i cronem volat scripty přes http, pak to bude totožné s otevřením v prohlížeči.
4li3n
Profil
Nechci být hrubý, ale nechte si prosím přednášku o tom, jak se vyhýbám hlášení chyb.

Kdyby mi to PHP zahlásilo, skákal bych radostí a rád bych to opravil. Byl jsem tázán na to, zda jsem si ověřil, že konstantu nevidí CRON - psal jsem, že to mám ověřené, protože místo hodnoty je ve vygenerovaném XML přímo název konstanty. Nic víc, nic míň. Proč tomu tak je se tu snažím zjistit. Žádné potlačování hromady chyb se tedy nekoná - sám to nemám rád, každou proměnnou si předem definuji, aby mi nevyhazovalo PHP zbytečně hlášky "use of undefined"... Programuji se zapnutím veškerých chyb a nemám s tím problém. Když se ale chyba projevuje až v Cronu, tak je to problém těžko odhalitelný. Zavináče před proměnné a funkce jsem nepoužil NIKDY.

Zřejmě to opravdu zapříčinilo to, že jsem includoval soubor, kde ona konstanta byla definována a v tom souboru bylo užito serverových proměnných z pole $_SERVER které samosebou při spuštění Cronem neexistují.

Nevšiml jsem si toho, protože onen soubor, kde ty konstanty jsou, používám napříč webem a tedy při spuštění Cronem mě toto nenapadlo odkontrolovat - ty konstanty, kde se $_SERVER proměnné používají v tom Cronovém scriptu nepoužívám, jsou tam pro jinou část aplikace.

K poslední poznámce "skrip pouštěný cronem volejte přes HTTP" - to právě nechci. Rád bych co nejvíce ulehčil serveru a toto není nejvhodnější. Tahat to zbytečně přes Apache fakt ne.

Už jsem to snad vyřešil. Opravdu to nejspíš bylo právě tím, co popisuji výše.
Alphard
Profil
Já jsem se nikoho dotknout nechtěl, popsal jsem všechny příčiny, co mě napadly, a navrhl nějaká řešení. Ten ironický komentář v kódu jsem přepsal, doufal jsem, že všichni pochopí nadsázku.

Kdyby mi to PHP zahlásilo, skákal bych radostí a rád bych to opravil.
Však jsem psal o logu, někam by se chyby ukládat měly. Zkuste prohledat adresáře dostupné přes ftp nebo si nastavit vlastní soubor pro ukládání chyb.
4li3n
Profil
Díky,

ono se to z těch písmenek blbě poznává...

Mrknu na to, základní problém jsem vyřešil. Do error logů se kouknu a zjistím, zda to bylo opravdu tím.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: