-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 : m...@dasprids.de :
: Jabber : jab...@dasprids.de :
: 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 {