Robo feladat végrehajtó

A Grunttal történt rövid ismerkedés után tudtam, hogy milyen irányban kell kutakodnom ha elégedetten szeretném használni a választott automatizáló megoldást. Azt is tudom, hogy a node.js ellen küzdeni hasztalan, de amíg nem merülök el benne jobban maradok a PHP mellett. Így esett a választás a Robo feladat végrehajtóra.

A feladat megegyezik azzal, amit a Grunt bejegyzésben már bemutattam:

  • találja meg a legújabb tömörített fájlokat egy bizonyos mappán belül
  • tömörítse ki a megtalált fájlokat
  • másolja a kitömörített fájlokat a megadott helyre a megadott jogosultságokkal
  • importálja az adatbázisba az adatbázismentést

Mivel a Robonak is létezik shell parancsfuttató funkciója, ezért a shell scriptet kényelmesen át lehet emelni, a Grunt esetében is ez volt az első lépés. Azonban a RoboFile egy hétköznapi PHP osztály, sokkal rugalmasabb a feladatok megvalósításában, ezért bátrabban kalandozik el az ember. A legújabb fájlok megtalálásához akár ilyen megoldás is születhet:

private function getlatest () {
	$filesfs = array();
	$filesdb = array();
	foreach (scandir($this->indir) as $file) {
		if (fnmatch($this->fspattern, $file)) {
			// FS files
			$base = basename($file, '.tar.gz');
			$filesfs[$base] = filemtime($this->indir . '/' . $file);
		}elseif (fnmatch($this->db.'*', $file)) {
			// DB files
			$base = basename($file, '.sql.gz');
			$filesdb[$base] = filemtime($this->indir . '/' . $file);
	    	}else{
			continue;
		}
	}
	arsort($filesfs);
	reset($filesfs);
	$first_key = key($filesfs);
	$this->say($first_key);
	$this->latestfs = $this->indir.'/'.$first_key;

	arsort($filesdb);
	reset($filesdb);
	$first_key = key($filesdb);
	$this->say($first_key);
	$this->latestdb = $this->indir.'/'.$first_key;
}

Ez egy hosszú kód. Akkor különösen, ha a shell parancsot meghagyva következő módon is elérhettük volna:

$latestfs = $this->taskExec('basename $(ls -1 -dtr '.$this->indir.'/'.$this->pattern.' | tail -1) .tar.gz')->run();

A tömörségben nem lehet vele versenyezni, de nem biztos hogy ezt a shell scriptet a projektbe újonnan csatlakozó PHP fejlesztő megérti vagy a Windows gépén egyáltalán le tudja futtatni. De kétségtelenül vannak hátrányok. A fájlok kitömörítésénél 2-2,5 GB-os biztonsági mentéssel kell megbirkózni. A feladat PHP-ban sem lehetetlen, az Archive_Tar osztály nagyon jó szolgálatot tesz, de a teljesítményben alulmarad. Méghozzá jócskán:

[RoboFile] Extracting with shell...
[Exec] running tar -C /var/backups/backup-6-29-2015 -xzf /var/backups/backup-6-29-2015.tar.gz ./public_html/projekt
[Exec] Done in 81.413s
[RoboFile] Extracting with shell finished: 81.454183101654
[RoboFile] Extracting with PHP...
[RoboFile] Filelist with PHP finished: 103.15755081177
[RoboFile] Extracting with PHP finished: 1638.9883499146

Ezt a 20-szoros különbséget nem lehet figyelmen kívül hagyni, és amíg jobb lehetőség nincs, benne kell maradnia a shell parancsnak.

A terjedelem és teljesítménybeli hátrányokat bőven ellensúlyozza az, hogy a Robót a valószínűleg már létező composer.json fájlunkhoz hozzáadva egyszerűen telepíthetjük, és egy PHP projektben otthonosabban fogják magukat érezni a fejlesztők, mint valamelyik node.js alternatívában.