Správně napsaný cron, který by se spouštěl každý měsíc

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
charmed
Člen | 9
+
0
-

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
+
+1
-

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.

Jan Mikeš
Člen | 771
+
+2
-

Nemas moznost vyuzit Kdyby/Console?

charmed
Člen | 9
+
0
-

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
+
0
-

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-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.

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.

Jan Mikeš
Člen | 771
+
0
-

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.

charmed
Člen | 9
+
0
-

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.

Jan Mikeš
Člen | 771
+
0
-

Knihovnu muzes samozrejme pouzit i bez composeru, pekne po staru, pokud tam ta moznost neni ;).

Nebo zkusit file_get_contents() jak tady zaznelo a pripadne curl.

Jiří Nápravník
Člen | 710
+
+2
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
{