Autor Zpráva
anonymníí
Profil *
Ahoj,
válčím teď s CRONem na VPS, nedaří se mi spustit script, který jinak funguje bezchybně - je to stažení nějakých dat a uložení na server.

Nejprve jsem si zjistil cestu k PHP, příkazem whereis php. To mi vrátilo celkem 3 výsledky, 2 cesty a 1 zip (nebo gz?) soubor.

Na VPS jsem se dostal do editace CRONu, crontab -e, přidal 0 23 * * * /usr/bin/php -f /var/www...script.php

V daném souboru je jen:
<?php
$url = '...';
$filename = 'soubor.xml'; // relativni adresa, soubor se bude tvorit ve stejne slozce
file_put_content($filename, file_get_contents($url));

Poradíte, kde by mohla být chyba?


oprava: názvy funkcí jsou správně, překlepl jsem se zde: file_put_contentS samozřemě.

Script jinak funguje, syntakticky je správně. Psal jsem to teď z hlavy.
juriad
Profil
anonymníí:
Když ten skript spustíš manuálně jako:
/usr/bin/php -f /var/www...script.php
Tak to funguje? Netestoval jsi to náhodou jen pomocí http requestu?
anonymníí
Profil *
juriad:
To jsem nezkoušel zatím. Nenapadlo mě to :-) Odpoledne na to budu mít chvilku.

Spouštěl jsem to v proohlížeči, example.com/script.php a požadovaný XML soubor se mi vytvořil.

CRON jinak funguje, mám tam nějaké .sh scripty, které se vykonávají. Problém by tedy měl být v cestě k PHP interpreteru?
juriad
Profil
anonymníí:
Problém by tedy měl být v cestě k PHP interpreteru?
Možná. PHP také při spuštění z příkazové řádky používá jiné php.ini, které může mít zakázané allow_url_fopen. Také bych ověril, co je aktuální adresář (podle PHP). Ověřil bych, že uživatel, pod kterým se spouští ten skript má právo na zápis v tom adresáři. (Může to obecně být jiný uživatel než pod kterým běží webový server.)
anonymníí
Profil *
juriad:
Co konkrétně mám v phpinfo() hledat? POd jakou kolonkou najdu, které php.ini se bere?

Ohledně toho uživatele, cron nastavuji po přihášení via SSH jako root, takže předpokládám, že práva bych měl mít všude. Nebo se pletu?

Jak mohu ověřit allow_url_fopen pro daného uživatele? Přenastavení pak proběhne, tuším, v PHP.INI, že?
juriad
Profil
anonymníí:
Co konkrétně mám v phpinfo() hledat? POd jakou kolonkou najdu, které php.ini se bere?
Viz www.ostraining.com/blog/coding/phpini-file

Ohledně toho uživatele, cron nastavuji po přihášení via SSH jako root, takže předpokládám, že práva bych měl mít všude. Nebo se pletu?
Správně, může všude. Ale není dobrou praxí pracovat jako root.

Jak mohu ověřit allow_url_fopen pro daného uživatele? Přenastavení pak proběhne, tuším, v PHP.INI, že?
Obvykle v php.ini, ale může být změněno i pomocí .htaccess (tuším).

Ve výpisu phpinfo() to uvidíš. Jsi programátor, tak spusť třeba:
/usr/bin/php -r 'phpinfo();' | less
a v tom se ti bude dobře hledat (znáš-li less).

V každém případě spusť skript z příkazové řadky. Snad se dozvíš, zda něco selže nebo co se vlastně děje.
anonymníí
Profil *
juriad:
Velice děkuji, moc jsi mi pomohl.

Spuštění scriptu ručně skrze konzoli mi pomohlo (cesta k PHP byla správná), nicméně, ač rozumím tomu, co je špatně, jde mi z toho hlava kolem. Chyba, resp. varování, bylo PHP Notice: Undefined index: SERVER_NAME in... config.php. Tam používám podmínku if (strpos('localhost', $_SERVER['SERVER_NAME']) !== false) pro rozlišení lokální/produkční server. Přijde mi divné, že by tento klíč nebyl za nějakých okolností definován. Podmínku jsem rozšířil ještě o jeden isset.

Protože to ale byla jen noticka, na běh scriptu to asi nemělo vliv, ten by měl doběhnout (bral jsem jej za nefunkční, protože jsem na cílovém FTP neviděl vygenerovaný soubor). Ve skutečnosti (po opravení té noticky) jsem script pustil znovu a XML soubor se mi vytvořil v místě, kde jsem byl v konzoli. Měl jsem za to, že by se měl vytvořit relativně vůči scriptu, který spouštím. Další omyl. Divné, nebo ne?

Správně tedy nakonec je
$filename = __DIR__ . '/soubor.xml';

Ještě závěrem, kromě toho, že budu rád, pokud mi pomůžeš objasnit to s tím neexistujícím klíčem (pokus víš z hlavy - ať ano či ne, každopádně budu hledat něco více, zajímá mě to).

Psal jsi, že není vhodné přihlašovat se jako root. S tím se v obecné rovině nedá nesouhlasit, nicméně, jak mám správně postupovat, pokud:
- jsem jediným, kdo má na VPS přístup
- běží na něm X webů, na různých (sub)doménách
- každý web má na sobě nějaké CRONové úlohy, ale vesměs nic velkého - typicky třeba to, co jsem řešil v tomto vlákně, je to jednou denně v noci aktualizace recenzí na heuréce, třířádkový PHP script

V rámci přehledosti se mi hodí vidět všechny CRONové úlohy pohromadě, tyto dílčí scripty nemohou napáchat žádné velké zlo (tedy, myslím). Jiná možnost, než přihlásit se za roota tedy není, pokud při kontrole, jaké scripty máme v CRONu spuštěné, nechci procházet jednotlivé účty (co web, to účet). Podotýkám, že momentlně chápu uživatele (účet) pro každý web zvlášť (podobně jako na FTP, kde můžu mít "hlavní" účet napříč všemi weby a pak pro každý web vlastní, který mohu sdílet). Nebo jsi myslel mít celkem dva účty, root a třeba "cron", který bude mít přístup pouze ke CRONu (všem, podobně jako to mám teď s tím rootem)? To by bylo řešení, zkusím pohledat, jak bych to mohl vyřešit, pokud to jde. To mě dosud nenapadlo. Pokud jsem myšlenku pochopil správně, tak děkuji za nakopnutí a její objevení :-)


PS. programátorem jsi mě nazval, ale jsem tak trochu z nouze. Dělám, co můžu, ale spoustu věcí nevím a ty mě překvapují (viz to s tím místem, kde se mi vytvořil ten soubor).
Keeehi
Profil
anonymníí:
Ještě závěrem, kromě toho, že budu rád, pokud mi pomůžeš objasnit to s tím neexistujícím klíčem
Je to jasné, když to spouštíš normálně z venku jde požadavek nejdříve na Apache který pak následně volá PHP. Ty voláš PHP přímo. A ten chybějící Apache je důvodem proč není nastavený ten klíč. Protože je to jeho práce.
juriad
Profil
anonymníí:
V dokumentaci k proměnné $_SERVER:
„The entries in this array are created by the web server. There is no guarantee that every web server will provide any of these; servers may omit some, or provide others not listed here.“
Zřejmě při ručním spuštěním z příkazové řádky nemá SERVER_NAME smysl.
Na toto jsem neupozorňoval, protože jsi to ve zdrojáku v [#1] neměl uvedené.

Měl jsem za to, že by se měl vytvořit relativně vůči scriptu, který spouštím. Další omyl. Divné, nebo ne?
To bych také čekal, ale protože vím, že ruční spuštění (což je i spuštění CRONem) se chová jinak, sám bych si to zkontroloval.

K uživatelským účtům se teď nemám čas vyjádřit; třeba později.

Takže výsledek je, že to funguje?
anonymníí
Profil *
Keeehi:
Tím se vše vysvětluje. Neměl jsem tušení, že je tato proměnná tvořena na Apachi, ani že Apache přeskočíme. Teď to dává smysl.

juriad:
Ano, toto jsem v úvodním příspěvku nezmiňoval, nepřišlo mi to důležité. Nicméně, byla to noticka, předpokládám, že se soubor tvořil od začátku, ale jinde, než jsem ho čekal.

Výsledek je, že to funguje bezvadně, ještě jednou díky za pomoc!


ad uživatelské účty: pokud se vyjádříš (nebo kdokoliv jiný samozřejmě), rád si to přečtu. Jdu hledat i nějaké další zdroje, nicméně jistě se zde objeví i něco, co mnou nalezené informace rozšíří. Více hlav (a zdrojů) více ví :-)

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: