Maximum execution time exceeded

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

Zdravím,
potřebuji provést nějaké větší zpracování db (duplikovat a upravit určitou množinu dat uložených ve 2 tabulkách – 1:n) a narážím dobu zpracování. Používám Nette 2.1 devel z 30.7.2012 a PostgreSQL.
Tedy v prvé řadě transakce. Zkusil jsem to podle https://forum.nette.org/…-nette-2-0-3, takže kód vypadá takto:

<?php
$dsn = $x['driver'].':host='.$x['host'].';dbname='.$x['dbname'];
$this->db = new Connection($dsn, $x['user'], $x['password']);
$this->db->beginTransaction();
foreach($s_lv as $o_lv) {//pro kazde LV
	//uprav hodnoty
	...
	// zaloz nove LV
	$lv_id = $this->s_lv->duplicateLv($o_lv, $this->uid);
	$s_nem= $this->context->nem->getNemLv($o_lv->id); //na puvodnim lv
	foreach($s_nem as $o_nem) {
		//uprav hodnoty
		...
		$o_nem->lv_id = $lv_id; //nove lv id
		$this->context->nemovitost->duplicateNem($o_nem, $this->uid);
	}
}
$this->db->commit();
?>

Takto to sice běží, ale pomalu, předpokládám, že mimo tu transakční obálku. Pokud tam namísto metod duplicateLV a duplicateNem dám:

<?php
$this->db->table('lv')->insert($o_lv);
$lv_id = $this->db->table('lv')->select("currval('lv_id_seq')")->fetch()->currval;
$this->db->table('nem')->insert($o_nem);
?>

tak to skončí na warning illegal offset type (ukazuje to na ten poslední uvedený řádek – tabulka nem) – mám dojem, že laděnka ukáže pokaždé jiný počet dotazů. Vypadá to, že tam spadne pár insertů z té nadřazené (lv) tabulky a z té podřazené (nem) nic.

Kromě toho: má Nette nějaké prostředky pro asynchronní zpracování – tedy aby se spustilo zpracování, ale ihned se vrátila nějaká stránka a nehrozilo přetečení času? Případně, jak takovéto záležitosti řešíte?

frosty22
Člen | 373
+
0
-

Co se týče tvého hlavního problému, tak ten jsem bohužel celý nepochopil a asi mi k tomu chybí ony metody duplicate* ..

Ale měl bych něco k té druhé části – asynchronní zpracování. V podstatě toto není přímo možné, a je to omezené ze strany jazyka, čili PHP. Přestože již existuje modul pro PHP, který zvládá nějaká vlákna, tak ale si nejsem jist, zda-li je to řešením tvého problému.

Předpokládám, že ti jde o to, aby se inicializoval nějaký proces, ze kterého na stránku nepotřebuješ žádný výsledek. V opačném případě, nelze bez AJAXu odeslat nějaký výsledek až potom, co se načte stránka (- tedy z části to lze ovlivnit přes ob_* metody a buffer, ale není to moc spolehlivé).

Jinak tedy pokud potřebuješ na web i výsledek – tak jedině AJAX, a v případě, že ti jde jen o inicializování nějakého procesu, tak potom jednoduše uložit někde příznak ke spuštění – například databáze, či nějaký tempovský soubor. A následně mít v crontabu skript, který kontroluje zda-li nejsou procesy ke zpracování (existence onoho souboru či záznam v databázi) a pokud ano, tak to spustí a provede (ideálně tedy crontab + PHP CLI).