Maximum execution time exceeded
- jik
- Člen | 146
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
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).