-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
A bit late, but, you should just use jsPull with the persistentNamespace.
...................................
: ___ _ ___ ___ ___ _ ___ :
: | \ /_\ / __| _ \ _ (_) \ :
: | |) / _ \\__ \ _/ / | |) | :
: |___/_/:\_\___/_| |_|_\_|___/ :
:........:........................:
: Web : http://www.dasprids.de :
: E-mail : [email protected] :
: Jabber : [email protected] :
: ICQ : 105677955 :
:........:........................:
Ryan Brooks schrieb:
> Howdy folks,
>
> I have to confess that I am truly pleased with Zend_ProgressBar. However, I
> had a couple thoughts once I actually started using it. I am sending this
> message to the mailing list because I'm not entirely sure it is within the
> scope/context of Zend_ProgressBar.
>
> I wonder if it's not a good idea to allow single instances of ZPB
> (namespaces). For instance, in my case I'm doing a search index rebuild of
> a large resultset. In particular I flush my index tables, fetch all my
> records and insert the index values into one table and the relations to
> another.
>
> However, I'd like this process to be running a single instance at a time.
> For example, if I request /resource/intense/rebuild-search-index/, the
> process will start. However, if I request it again, I'd like the process to
> not start again, but update with the current progress. I had already
> considered adjusting Zend_ProgressBar::$_min to use
> Zend_ProgressBar::$_current as an offset, but in this particular case I
> don't think it applies. I'm including some code as an example.
>
> One caveat I can think of is sharing process information across
> sessions/users, so it may be a good idea to pass in a cache object, or
> explicitly define a cache prefix? I also don't think this would be
> considered adapter functionality, as it seems fairly global to
> Zend_ProgressBar.
>
> Other potential usage scenarios would be converting a video from one type
> to another, or converting a CMYK image to RGB (using a filename as a
> prefix), etc.
>
> The methods I propose (though their functionality, names and usage aren't
> in stone, I leave that to the devs) include:
>
> setSingleInstance() // sets ZPB to allow a single instance of a progress
> bar, cross user
> setCacheInstance() // Either setting a Zend_Cache instance, or just a
> namespace
> setIgnoreUserAbort() // sets ignore_user_abort() - just a thought, not sure
> if it is needed
> isIdle() // Returns (bool) where singleInstance is registered (but not
> running?)
> isRunning() // returns (bool) if running
> getCurrent() // Current record convenience method
> removeCache() // flushes the cache object
> rewind() // Potentially not the best method name, but it would flush the
> cache, reset user abort, etc.
>
> Just let me know if I'm out of my mind!
>
> Thanks folks,
>
> -Ryan
>
> <?php
> require_once 'Zend/ProgressBar.php';
> require_once 'Zend/ProgressBar/Adapter/JsPush.php';
> class Resource_IntenseController extends My_Controller
> {
> private $_cacheObj = NULL;
> public function init()
> {
> $frontendOptions = array('automatic_serialization' => true);
> $backendOptions = array(
> 'cache_dir' => 'cache/progressbar',
> 'file_name_prefix' => 'myNamespace'
> );
> $this->_cacheObj = Zend_Cache::factory('Core', 'File',
> $frontendOptions,
> $backendOptions);
> }
> private function _exampleRecordList()
> {
> if(!$records = $this->_cacheObj->load('index_process'))
> {
> $records =
> IndexFactory::getInstance()->fetchLargeResultsetForReindexing('*');
> $this->_cacheObj->save($records, 'index_process');
> }
> return $records;
> }
> public function indexAction()
> {
> // ...
> }
> public function rebuildSearchIndexAction()
> {
> $this->noRender();
> if (isset($_GET['progress']))
> {
> $rows = $this->_exampleRecordList();
> $cnt = count($rows);
> $adapter = new
> Zend_ProgressBar_Adapter_JsPush(array('updateMethodName' =>
> 'Zend_ProgressBar_Update', 'finishMethodName' =>
> 'Zend_ProgressBar_Finish'));
> $progressBar = new Zend_ProgressBar($adapter, 0, $cnt,
> 'index_Process');
>
> $progressBar->setSingleInstance('my_namespace') // Or
> true, and use
> _persistenceNamespace as a namespace adapter. It would allow single
> instances of multiple namespaces
> ->setCacheInstance($this->_cache)
> ->setIgnoreUserAbort();
> try
> {
> if($progressBar->isIdle() === (bool) TRUE)
> {
> do {
> $runningStatus =
> $progressBar->isRunning();
> $currentRecord =
> $rows[$progressBar->getCurrent()];
>
> Records_IndexFactory::getInstance()->insertSearchIndex($currentRecord,
> 'my_large_search_index');
> $text = "Starting record
> $currentRecord of $cnt";
>
> $progressBar->update($currentRecord, $text);
> usleep(100000);
> } while($runningStatus);
> $progressBar->finish()
> ->removeCache();
> }
> }
> catch(Exception $e)
> {
> $progressBar->rewind();
> }
> }
> }
> }
>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkmxmyoACgkQ0HfT5Ws789CfXQCfSk5VgwzyCRH0r1vcNiaEAB7/
2J8AoJvXrY83PG9noYQGIwIAkYiLCJDa
=iPfa
-----END PGP SIGNATURE-----