Az idő túl lépés figyelést, nehéz _jól_ megoldani.
Én általában darabra szoktam meghatározni a végrehajtandó feladatokat. pl.: 1 könyvtárból kell beimportálni képeket (node|galléria)
És csinálok hozzá admin felületet ahol lehet állítani, hogy mennyi legyen az darabszám, így az Administrator dönthet a PHP beállítások figyelembe vételével. Ugyan ezt meg lehet csinálni másodperc megadásával, vagy a max_execution_time bizonyos százalékának kihasználásával.
Önmagában nézve mindegyik, jó megoldás.
Feladat függő a dolog, de ha lehet, akkor a konkrét műveletet elvégző függvényeket úgy írom meg, hogy cron-ból és batch process-ből is meghívhatóak legyenek.
A cron bonyolítja a helyzetet, mert mindenképpen figyelni kell a hátralévő időt.
ini_get('max_execution_time')
$_SERVER['REQUEST_TIME']
function process(&$context) {
if (!isset($context['sandbox']['state'])) {
$context['sandbox']['state'] = 'initialize';
}
switch ($context['sandbox']['state']) {
case 'initialize' :
$context['sandbox']['items'] = array(/* ezt fel kell tölteni */);
$context['sandbox']['items_count'] = count($context['sandbox']['items']);
$context['finished'] = 0;
//Lépés a következő fázisra
$context['sandbox']['state'] = 'doit-1';
break;
case 'doit-1' :
//Jellemzően nem probléma ha másik böngésző ablakban
//variable_set('mymodule_limt', 8) hívás történik a folyamat közben.
$limit = variable_get('mymodule_limt', 2);
while ($limit AND $item = array_pop($context['sandbox']['items'])) {
item_bizergáló($item);
$limit--;
}
//Ha több doit-# van akkor a finished kiszámolása bonyolultabb.
$context['finished'] = ($context['sandbox']['items_count'] - count($context['sandbox']['items'])) / $context['sandbox']['items_count'];
break;
}
}
Ez a változat akkor (lehet) jó ha az összes végre hajtandó feladat ismert.
Még soha nem próbáltam de amit a másik hozzászólásban írtam az akkor lehet jó, ha a proccess-ek egy module_invoke_all()-lal vannak begyűjtve.
(De akkor valószinüleg, nem szükséges a közös sandbox)
Egyébként a PHPmanual importálóban ezt a módszert használom
ezt a process függvényben kell figyelni.
Az idő túl lépés figyelést, nehéz _jól_ megoldani.
Én általában darabra szoktam meghatározni a végrehajtandó feladatokat. pl.: 1 könyvtárból kell beimportálni képeket (node|galléria)
És csinálok hozzá admin felületet ahol lehet állítani, hogy mennyi legyen az darabszám, így az Administrator dönthet a PHP beállítások figyelembe vételével. Ugyan ezt meg lehet csinálni másodperc megadásával, vagy a max_execution_time bizonyos százalékának kihasználásával.
Önmagában nézve mindegyik, jó megoldás.
Feladat függő a dolog, de ha lehet, akkor a konkrét műveletet elvégző függvényeket úgy írom meg, hogy cron-ból és batch process-ből is meghívhatóak legyenek.
A cron bonyolítja a helyzetet, mert mindenképpen figyelni kell a hátralévő időt.
ini_get('max_execution_time')
$_SERVER['REQUEST_TIME']
function process(&$context) { if (!isset($context['sandbox']['state'])) { $context['sandbox']['state'] = 'initialize'; } switch ($context['sandbox']['state']) { case 'initialize' : $context['sandbox']['items'] = array(/* ezt fel kell tölteni */); $context['sandbox']['items_count'] = count($context['sandbox']['items']); $context['finished'] = 0; //Lépés a következő fázisra $context['sandbox']['state'] = 'doit-1'; break; case 'doit-1' : //Jellemzően nem probléma ha másik böngésző ablakban //variable_set('mymodule_limt', 8) hívás történik a folyamat közben. $limit = variable_get('mymodule_limt', 2); while ($limit AND $item = array_pop($context['sandbox']['items'])) { item_bizergáló($item); $limit--; } //Ha több doit-# van akkor a finished kiszámolása bonyolultabb. $context['finished'] = ($context['sandbox']['items_count'] - count($context['sandbox']['items'])) / $context['sandbox']['items_count']; break; } }Ez a változat akkor (lehet) jó ha az összes végre hajtandó feladat ismert.
Még soha nem próbáltam de amit a másik hozzászólásban írtam az akkor lehet jó, ha a proccess-ek egy module_invoke_all()-lal vannak begyűjtve.
(De akkor valószinüleg, nem szükséges a közös sandbox)
Egyébként a PHPmanual importálóban ezt a módszert használom