Správně napsaný cron, který by se spouštěl každý měsíc
- charmed
- Člen | 9
Dobrý den, potřebovala bych poradit s napsáním Cron.php.
Předem děkuji za pomoc
Zatím ho mám takto:
require_once('/home/www/***/www/***/app/presenters/CronPresenter.php')
require_once('/home/www/***/www/***/app/presenters/BasePresenter.php');
A toto je obsah CronPresenter.php, který by se tím měl spustit:
class CronPresenter extends BasePresenter
{
public function actionRecountEvent()
{
if (!$this->context->params['consoleMode']) $this->terminate();
$this->template->setFile(NULL);
\Nette\Diagnostics\Debugger::timer('users');
$feeder = $this->context->createFeeder();
/** @var Feeder $feeder */
$users = $feeder->getAllUsersWithScore();
\Nette\Diagnostics\Debugger::dump("Users:" . \Nette\Diagnostics\Debugger::timer('users'));
$feeder->startTransaction();
\Nette\Diagnostics\Debugger::timer('transaction');
foreach ($users as $user) {
$scoreForPrevDay = $feeder->getUserScoreById((string)$user->id);
$currentScore = ($user->score === FALSE) ? 0 : $user->score;
$newScore = (int)$currentScore + (int) $scoreForPrevDay->count;
$feeder->updateScore(array(
'userId' => $user->id,
'userScore' => $newScore
));
}
\Nette\Diagnostics\Debugger::dump("Transaction:" . \Nette\Diagnostics\Debugger::timer('transaction'));
$feeder->commitChanges();
if (date('d') === '18') {
$maxScoreUser = $feeder->getUserWithMaxScore();
$feeder->insertNewPlusUser($maxScoreUser);
$feeder->clearScore();
}
}
}
Editoval charmed (18. 5. 2016 19:26)
- Jiří Nápravník
- Člen | 710
Tohle fungovat nebude, ten require jenom nacte ten soubor, ale nejsou tam predany zadny contexty,template atd.
Tim presenterem se v podstate vytvorila nejaka akce, ktera je pristupna pres
prohlizec
pravdepodobne domena/cron/recount-event
Zjisti tu adresu a pokud ji otevres pres prohlizec tak mas adresu s kterou dale pracovat a ve vetsine pripadu staci ji dat v administraci hostingu, nebo spolecne s wget. Kde ten cron poustis? Pokud uz to musi byt nejaky jiny skript treba to cron.php tak bych to resil tak, ze bych zavolal file_get_contents(TA_ADRESA); ale musi byt povolene nacitani externich zdroju.
- charmed
- Člen | 9
Lexi napsal(a):
Nemas moznost vyuzit Kdyby/Console?
Hostuji na český-hosting a tam není možný přístup k root či konzoly.
- charmed
- Člen | 9
Jiří Nápravník napsal(a):
Tohle fungovat nebude, ten require jenom nacte ten soubor, ale nejsou tam predany zadny contexty,template atd.
Tim presenterem se v podstate vytvorila nejaka akce, ktera je pristupna pres prohlizec
pravdepodobne domena/cron/recount-eventZjisti tu adresu a pokud ji otevres pres prohlizec tak mas adresu s kterou dale pracovat a ve vetsine pripadu staci ji dat v administraci hostingu, nebo spolecne s wget. Kde ten cron poustis? Pokud uz to musi byt nejaky jiny skript treba to cron.php tak bych to resil tak, ze bych zavolal file_get_contents(TA_ADRESA); ale musi byt povolene nacitani externich zdroju.
Přes prohlížeč se k obsahu nedostanu. Cron má za úkol pouze spočítat záznamy a ty zapsat do databáze.
Český-hosting neumožňuje přístup ke command line. Ono k aplikace je více souborů např. Feeder atd. Vím na 100%, že vše funguje, jak má a aplikace dělá to, co chci. Bohužel, před časem se ztratil cron v Cron.mesic a za boha nejsem schopna dát nový spouštěč dohromady. Český-hosting umožňuje nastavit spouštění v určitou dobu. Takže to nemusím zapisovat přímo do cronu.
- charmed
- Člen | 9
Lexi napsal(a):
Tak treba pres Guzzle posilat GET pozadavky (doporucuji to nejak zabezpecit, alespon jednoduchym hashem, aby ti nekdo neshodil appku pokud se k URL dostane) na tvuj cron presenter.
Díky. Ale Composer nemám a abych ho nainstalovala, musela bych mít asi lokální prostředí, což bohužel také nemám.
- Jiří Nápravník
- Člen | 710
Composer staci nainstalovat lokalne u sebe a pak to nahrajes normalne na server…
Nicmene kdyz mrknu na cesky hosting , tak tam dole je presne to co myslim, musis jen ziskat tu www adresu, na ktere mas ten CronPresenter. Pres ten prohlizec se dostanes, pokud mas CronPresnter a router spravne.
Editoval Jiří Nápravník (18. 5. 2016 22:41)
- Martk
- Člen | 661
Co vzít presenter z DI a spustit ho?
<?php
$container = require __DIR__ . '/../app/bootstrap.php';
/** @var \Nette\Application\IPresenterFactory $presenterFactory */
$presenterFactory = $container->getByType(\Nette\Application\IPresenterFactory::class);
$presenter = $presenterFactory->createPresenter('Cron');
$presenter->autoCanonicalize = FALSE;
$presenter->run(new \Nette\Application\Request('Cron', 'GET', [
'action' => 'recountEvent'
]));
- charmed
- Člen | 9
Jiří Nápravník napsal(a):
Composer staci nainstalovat lokalne u sebe a pak to nahrajes normalne na server…
Nicmene kdyz mrknu na cesky hosting , tak tam dole je presne to co myslim, musis jen ziskat tu www adresu, na ktere mas ten CronPresenter. Pres ten prohlizec se dostanes, pokud mas CronPresnter a router spravne.
CronPresenter mám v app/presenters. Ale když zadám http://domena.cz/…resenter.php, nenajde mi to. Když zkusím kopii CronPresenteru hodit do www, napíše to:
PHP Fatal error: Class 'BasePresenter' not found in /home/www/***/www/***/www/cron.php on line 15
Řádek 14 a 15 je:
class CronPresenter extends BasePresenter
{
Editoval charmed (18. 5. 2016 23:11)
- charmed
- Člen | 9
Antik napsal(a):
Co vzít presenter z DI a spustit ho?
<?php $container = require __DIR__ . '/../app/bootstrap.php'; /** @var \Nette\Application\IPresenterFactory $presenterFactory */ $presenterFactory = $container->getByType(\Nette\Application\IPresenterFactory::class); $presenter = $presenterFactory->createPresenter('Cron'); $presenter->autoCanonicalize = FALSE; $presenter->run(new \Nette\Application\Request('Cron', 'GET', [ 'action' => 'recountEvent' ]));
to mám dát do Cron.mesic?
- Jiří Nápravník
- Člen | 710
To neni ale adresa – jako prvni bych zkusil http://domena.cz/…ecount-event – úpokud se ten skript pusti je to ono. No a pak do toho Cron.mesic dat <?php file_get_contents(‚http://domena.cz/cron/recount-event‘);
charmed napsal(a):
CronPresenter mám v app/presenters. Ale když zadám http://domena.cz/…resenter.php, nenajde mi to. Když zkusím kopii CronPresenteru hodit do www, napíše to:PHP Fatal error: Class 'BasePresenter' not found in /home/www/***/www/***/www/cron.php on line 15
Řádek 14 a 15 je:
class CronPresenter extends BasePresenter {