<?php 
 
namespace JLaso\ToolsLib; 
 
/** 
 * A class to control the status of the tasks, have to be used by the invoker (start-task) and by the 
 * status requester (status-task) 
 */ 
class Status extends CommonAbstract 
{ 
    const QUEUED = 'queued'; 
    const PROCESSING = 'processing'; 
    const DONE = 'done'; 
 
    /** 
     * obtain the status for the id passed, if not exists the status returned is "" 
     * 
     * @param $id 
     * @return string 
     */ 
    public function getInfo($id) 
    { 
        if (!$this->existsStatusFile()) { 
            return ""; 
        } 
 
        $status = $this->getStatusContent(); 
 
        return isset($status[$id]) ? $status[$id] : ""; 
 
    } 
 
    /** 
     * get the content of the status file as an array with $id=>$status 
     * 
     * @return array 
     */ 
    public function getStatusContent($dontUnlock = false) 
    { 
        $status = array(); 
 
        $content = $this->getStatusFileContent($dontUnlock); 
 
        $rows = preg_split("/$\R?^/m", $content); 
 
        foreach ($rows as $row) { 
            $row = str_replace("\n", "", $row); 
            if (trim($row)) { 
                list($id, $text) = explode("|", $row); 
                $status[intval($id)] = $text; 
            } 
        } 
 
        return $status; 
    } 
 
    /** 
     * get the list of the tasks that are unfinished 
     * 
     * @return array 
     */ 
    function getNotDoneTasks() 
    { 
        $statuses = $this->getStatusContent(); 
        foreach ($statuses as $id => $status) { 
            if (strpos($status, self::DONE) === 0) { 
                unset($status[$id]); 
            } 
        } 
 
        return $statuses; 
    } 
 
    /** 
     * update the status for the $id into the status file 
     * 
     * @param $id 
     * @param $message 
     */ 
    public function updateStatus($id, $message) 
    { 
        $this->lockStatusFile(false); 
        $status = $this->getStatusContent(self::DONT_UNLOCK); 
        $status[$id] = $message; 
        $this->dumpStatusContent($status); 
        $this->unlockStatusFile(); 
    } 
 
    /** 
     * saves the content of the internal status array to the status file 
     * 
     * @param array $content 
     */ 
    protected function dumpStatusContent($content = array()) 
    { 
        $tmp = ""; 
        foreach ($content as $id => $msg) { 
            $tmp .= $id . '|' . $msg . "\n"; 
        } 
        $this->putStatusFileContent($tmp); 
    } 
}
 
 |