CRON s využitím Cli na webhostingu
- Bohosu
- Člen | 24
Krásné Velikonoce všem! :)
Měl bych na Vás prosbu, protože si už nevím rady a bohužel jsem nikde na fóru nenašel funkční řešení. Rád bych ve své aplikaci využil cron, který bude např. jednou denně něco dělat.
Mám:
nette 2.0.10
php 5.3
hosting Station.cz
Pokud v administraci hostingu zadám url pro cron script:
http://mojedomena.cz/cron/
nebo
http://mojdedomena.cz/index.php Cron:default
tak nefunguje bohužel ani jedno z toho.
I na localhostu příkaz
php http://localhost/aplikace/cron/
či varianta s index.php Cron:default nefunguje. Obojí vrátí chybu:
Could not open input file:
http://localhost/aplikace/cron/
Přes příkaz wget samozřejmě problém není, bohužel ale
na hostingu jaksi nemám možnost si příkaz zvolit :)
CronPresenter
class CronPresenter extends BasePresenter
{
public function actionDefault()
{
// .... nejaky kod, co by cron mel delat...
$this->terminate();
}
}
bootstrap.php
//... originální bootstrap z verze 2.0.10 stable pro php 5.3
if ($container->params['consoleMode']) {
$container->removeService('httpRequest');
$container->addService('httpRequest', function() {
$uri = new UrlScript;
$uri->scheme = 'http';
$uri->port = Url::$defaultPorts['http'];
$uri->host = 'mojedomena.cz';
$uri->path = '/';
$uri->canonicalize();
$uri->path = Strings::fixEncoding($uri->path);
$uri->scriptPath = '/';
return new Http\Request($uri, array(), array(), array(), array(), array(), 'GET', null, null);
});
RouterFactory.php
class RouterFactory
{
/**
* @return Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList();
// if ($container->params['consoleMode']) {
// $application->allowedMethods = FALSE;
$router[] = new CliRouter('Default:default');
$router[] = new CliRouter(array(
'action' => 'Cron:default',
));
//} else {
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
//}
return $router;
}
}
(Vadí, pokud v RouterFactory neuvádím podmínku na params[consoleMode]? )
Můžete mi prosím poradit, co dělám špatně? Případně bych byl nesmírně vděčný za demo pro aktuální verzi nette :) Nemůže být chyba např. v .httacces, resp. nemá tam být něco změměno oproti původnímu?
Děkuji moc!
Editoval Bohosu (1. 4. 2013 21:56)
- Filip Procházka
- Moderator | 4668
Jsi si jistý, že ti při wgetu spadne požadavek do CLI? Já bych právě neřekl :)
- Quinix
- Člen | 108
Podle toho jak to rozhraní vypadá to budou nejspíš spouštět wgetem, čili http://mojedomena.cz/cron/ by mělo fungovat…
Přesně ti nejspíš poradí podpora hostingu…
- Johny 5
- Člen | 5
Zdravím,
dá se nějak spouštět skripty (CRON) jen ze serveru. Napsal jsem routování pomocí CLI a poslal na podporu, ať mi zaregistrují skript. A bohužel oni mohou jen dávat URL (viz. níže). Dá se to nějak zabezpečit, aby šlo zpouštět jen ze serveru? Půjde to poznat z módu? Nebo zabezpečit dle IP? Napadá vás něco?
Děkuji
Dobry den,
skripty v Cronu jsou spousteny pres Lynx, je tedy potreba nam sdelit presnou URL ktery skript chcete spoustet pripadne vcetne promennych.
Priklad:
lynx -source 'http://www.domena.cz/skript.php?prom1=aa?prom2=nn
Potrebuji tedy znat presnou URL.
Upresnete tedy Vas pozadavek.
Dekuji.
- thunderbuff
- Člen | 164
Pokud umí skripty spouštět jen z URL, tak je zabezpečení problematické. Napadá mě jen přidávat v GETu nějaký tajný token nebo kontrolovat IP. Případně si ještě můžeš dumpnout $_SERVER a mrknout, zda tam není něco, podle čeho by se dalo rozeznat, zda request pochází z „cronu“ nebo ne.
- sandal
- Člen | 8
Ahoj,
mám velice podobný problém s PHP 5.3.6 a Nette 2.0.13
V podstatě stejný kód (úplně stejný akorát jiné url, názvy akcí atp.) jako Bohosu, který jsem přebral z https://pla.nette.org/…tovani-v-cli
Co potřebuji, je spustit z command line konkrétní funkci. Můj příkaz je:
php.exe D:\workspace\archiv\www\index.php Default:download
Existuje DefaultPresenter a v něm actionDownload()
Vše provádím na localhostu ale funkce se nespustí. I v budoucnu budu mít kompletní hosting ve svých rukách takže enní problé změnit jakékoliv nastavení.
Tušíte kde by mohl být problém, proč nedojde ke spuštění funkce?
- thunderbuff
- Člen | 164
@sandal: Zkus to popsat nějak lépe. Co se stane? Vyhodí to nějakou chybovou hlášku?
Editoval thunderbuff (4. 1. 2014 3:02)
- sandal
- Člen | 8
eh, tak po lepším nastavení debugeru jsem zjistil, že se jedná o mojí hloupou chybu. Omylem jsem smazal řádku, která vrací z RouterFactory::createRouter samotný router.
Nicméně měl bych ještě jeden dotaz. V odkazovaném návodu je v routování přímo v bootstrap.php. Tím, že jsem ho přesunul do RouterFactory vyvstává problém (problém nejspíš jenom pro začátečníka v Nette) jak v RouterFactory získat $container abych mohl napsat ekvivalent pro
if ($container->params['consoleMode']) {
$application->allowedMethods = FALSE;
$router[] = new CliRouter('Default:default');
} else {
$router[] = new Route('index.php', 'Default:default', Route::ONE_WAY);
$router[] = new Route('prihlaseni', 'Default:login');
$router[] = new Route('<presenter>/<action>[/<id>]', 'Default:default');
}
Díky
- jiri.pudil
- Nette Blogger | 1029
Vyžádáš si ho jako závislost v konstruktoru:
public function __construct(Nette\DI\Container $container) { ... }
Čistější by ovšem bylo předat si pouze ten parametr, to už ale budeš muset explicitně uvést v configu:
services:
routerFactory: RouterFactory(%consoleMode%)
public function __construct($consoleMode) { ... }