Add new comment

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