76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\sery\os\proc;
 | 
						|
 | 
						|
class tasks {
 | 
						|
  static function pf(string $name): string {
 | 
						|
    $envname = envs::get();
 | 
						|
    return "/tasks/$envname/$name";
 | 
						|
  }
 | 
						|
 | 
						|
  /** le verrou doit être posé avant l'appel de cette méthode */
 | 
						|
  private static function _list(bool $include_invalids, bool $sort): array {
 | 
						|
    $tmpfiles = glob(self::pf("*.task"));
 | 
						|
    if ($tmpfiles === false) return [];
 | 
						|
    $tasks = [];
 | 
						|
    foreach ($tmpfiles as $taskfile) {
 | 
						|
      $task = new ManagedTask($taskfile);
 | 
						|
      if (!$include_invalids && !$task->isValid()) {
 | 
						|
        continue;
 | 
						|
      }
 | 
						|
      $tasks[] = [$taskfile, $task];
 | 
						|
    }
 | 
						|
    if ($sort) {
 | 
						|
      clearstatcache();
 | 
						|
      usort($tasks, function ($fta, $ftb) {
 | 
						|
        /**
 | 
						|
         * @var ManagedTask $ta
 | 
						|
         * @var ManagedTask $tb
 | 
						|
         */
 | 
						|
        [$fa, $ta] = $fta;
 | 
						|
        [$fb, $tb] = $ftb;
 | 
						|
        # comparer l'état "running"
 | 
						|
        $wa = $ta->isStarted() && !$ta->isDone();
 | 
						|
        $wb = $tb->isStarted() && !$tb->isDone();
 | 
						|
        $c = -base::compare($wa, $wb);
 | 
						|
        if ($c != 0) return $c;
 | 
						|
        # comparer la date de dernière modification du fichier
 | 
						|
        $mta = filemtime($fa);
 | 
						|
        $mtb = filemtime($fb);
 | 
						|
        return -base::compare($mta, $mtb);
 | 
						|
      });
 | 
						|
    }
 | 
						|
    return $tasks;
 | 
						|
  }
 | 
						|
 | 
						|
  /** supprimer toutes les tâches */
 | 
						|
  static function delete_all(): void {
 | 
						|
    lock::exlusive(ManagedTask::LOCK);
 | 
						|
    try {
 | 
						|
      foreach (self::_list(true, false) as [$taskfile, $task]) {
 | 
						|
        unlink($taskfile);
 | 
						|
      }
 | 
						|
    } finally {
 | 
						|
      lock::release(ManagedTask::LOCK);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * retourner la liste des tâches valides
 | 
						|
   * @return ManagedTask[]
 | 
						|
   */
 | 
						|
  static function list(?string $selectId=null): array {
 | 
						|
    $tasks = [];
 | 
						|
    lock::exlusive(ManagedTask::LOCK);
 | 
						|
    try {
 | 
						|
      foreach (self::_list(false, true) as [$taskfile, $task]) {
 | 
						|
        $id = $task->getId();
 | 
						|
        if ($selectId !== null && $id !== $selectId) continue;
 | 
						|
        $tasks[$id] = $task;
 | 
						|
      }
 | 
						|
    } finally {
 | 
						|
      lock::release(ManagedTask::LOCK);
 | 
						|
    }
 | 
						|
    return $tasks;
 | 
						|
  }
 | 
						|
}
 |