Advertisement
Guest User

Tasks

a guest
Jun 8th, 2010
1,685
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. class task
  3. {
  4.     public $handler = '';   //обработчик задачи
  5.     public $query = '';     //задача
  6.     public $params = '';    //дополнительные параметры
  7.     public $priority = 1;   //приоритет
  8.     public $filename='';    //имя файла задачи
  9.  
  10.     public function __construct($query, $handler = '', $priority = 1, $params = '')
  11.     {
  12.         $this->query = $query;
  13.         $this->priority = intval($priority);
  14.         if (!empty($handler)) $this->handler = $handler;
  15.         if (!empty($params)) $this->params = $params;
  16.         return true;
  17.     }
  18. }
  19.  
  20. class tasks
  21. {
  22.     ################################################################################
  23.     #### Внимание, здесь требуется настройка - укажите существующую директорию  ####
  24.     ################################################################################
  25.     const tpath = '/home/user/tmpdir/'; //директория для временных файлов
  26.  
  27.     public static function create($query, $handler = '', $priority = 1, $params = '')
  28.     {
  29.         if (empty($query)) return false;
  30.         $task=new task($query,$handler,$priority,$params);
  31.         if (self::add($task)) return $task;
  32.         else return false;
  33.     }
  34.  
  35.     public static function add(&$task)
  36.     {
  37.         if (!($task instanceof task)) return false;
  38.         if (empty($task->query)) return false;
  39.         return self::write_task_to_file($task);
  40.     }
  41.    
  42.     public static function del(&$task)
  43.     {
  44.         if (!empty($task->filename) && file_exists(self::tpath.$task->filename)) return unlink(self::tpath.$task->filename);
  45.         return false;
  46.     }
  47.  
  48.     public static function update(&$task)
  49.     {
  50.         if (!($task instanceof task)) return false;
  51.         return self::write_task_to_file($task);
  52.     }
  53.    
  54.     public static function execute(&$task)
  55.     {
  56.         if (!($task instanceof task)) return false;
  57.         if (empty($task->handler)) return false;
  58.         if (!file_exists(self::tpath.$task->filename)) return false;
  59.        
  60.         if (method_exists('task_handlers',$task->handler))
  61.         {
  62.             $handler=$task->handler;
  63.             $r=task_handlers::$handler($task);
  64.             self::del($task);
  65.             return $r;
  66.         }
  67.         return false;
  68.     }
  69.  
  70.     public static function get_files_list()
  71.     {
  72.         if (!file_exists(self::tpath)) return false;
  73.         $files = array();
  74.         $dh = opendir(self::tpath);
  75.         while (($f = readdir($dh)) !== false)
  76.         {
  77.             if (is_file(self::tpath.$f) && $f != '..' && $f != '.' && substr($f,-5)=='.task') $files[]=$f;
  78.         }
  79.         return $files;
  80.     }
  81.  
  82.     public static function get_tasks()
  83.     {
  84.         if (!file_exists(self::tpath)) return false;
  85.         $files=self::get_files_list();
  86.         if (empty($files)) return false;
  87.         $tasks = array();
  88.         foreach ($files as $f)
  89.         {
  90.             $newtask = self::read_task_from_file($f);
  91.             if (!empty($newtask->query)) $tasks[$f] = $newtask;
  92.             unset($newtask);
  93.         }
  94.         return $tasks;
  95.     }
  96.    
  97.     public static function read_task_from_file($f)
  98.     {
  99.         if (empty($f) || !is_string($f) || !file_exists(self::tpath.$f)) return false;
  100.         $content = @file_get_contents(self::tpath.$f);
  101.         if (empty($content)) return false;
  102.         $d = explode("\n", $content);
  103.         $task=new task(base64_decode($d[0]));
  104.         if (!empty($d[1])) $task->handler = base64_decode($d[1]);
  105.         if (!empty($d[2])) $task->priority = intval($d[2]);
  106.         if (!empty($d[3])) $task->params = unserialize(base64_decode($d[3]));
  107.         $task->filename=$f;
  108.         return $task;
  109.     }
  110.  
  111.     public static function write_task_to_file(&$task)
  112.     {
  113.         if (!($task instanceof task)) return false;
  114.         if (empty($task->filename)) $task->filename = self::get_new_filename();
  115.         $f=$task->filename;
  116.         $fh=fopen(self::tpath.$f,'wb');
  117.         if (!$fh) return false;
  118.         if (!flock($fh,LOCK_EX)) return false;
  119.         fwrite($fh,base64_encode($task->query)."\n");      
  120.         if (!empty($task->handler)) fwrite($fh,base64_encode($task->handler)."\n");
  121.         if (!empty($task->priority)) fwrite($fh,intval($task->priority)."\n");
  122.         if (!empty($task->params)) fwrite($fh,base64_encode(serialize($task->params))."\n");
  123.         flock($fh,LOCK_UN);
  124.         fclose($fh);
  125.         return $f;
  126.     }
  127.  
  128.     public static function get_new_filename()
  129.     {
  130.         $name=$t=round(microtime(1)*1000);
  131.         $i=0;
  132.         while (file_exists(self::tpath.$name.'.task'))
  133.         {
  134.             $i++;
  135.             $name=$t.'_'.$i;
  136.         }
  137.         return $name.'.task';
  138.     }
  139.  
  140. }
  141.  
  142. class task_handlers
  143. {
  144.     #############################################################
  145.     ####### Эти функции-обработчики приведены для примера #######
  146.     #############################################################
  147.     public function mysql(&$task)
  148.     {
  149.         if (class_exists('mysql'))
  150.         {
  151.             if (!mysql::$connected) mysql::connect();
  152.             return mysql::query($task->query);
  153.         }
  154.         else return mysql_query($task->query);
  155.     }
  156.    
  157.     public function mail(&$task)
  158.     {
  159.         if (function_exists('mailsend')) return mailsend($task->params['to'],$task->params['subject'],$task->params['message'],
  160.                                             $task->params['headers'],$task->params['parameters'],$task->params['immediately']);
  161.         else return mail($task->params['to'],$task->params['subject'],$task->params['message'],$task->params['headers'],$task->params['parameters']);
  162.     }
  163.    
  164. }
  165. ?>
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement