blog.twista.cz :: Zephir - píšeme vlastní extenzi do PHP 30.03.2017 - 00:46

web-developer & PHPLover
<< zpět na výpis

Zephir - píšeme vlastní extenzi do PHP

qr kód tohoto článku

Úvod

Zephir je projekt od autorů PHP framerowku Phalcon. Pro ty kteří neví o co jedná, je to PHP framework, který je dodáván jako extenze do PHP a proto je jeho hlavní výhodou rychlost a nízká paměťová náročnost. Dostupný je už něco okolo dvou let a za tu dobu si získal mnoho fanoušků. Obsahuje snad vše co člověk k vývoji potřebuje, od MVC, přes ORM, Templatovací engine - Volt, ODM, devtools až po spoustu drobností.

Jak jsem psal, Phalcon je dodáván jako extenze do PHP, což znamená že je psán v C. To sebou krom řady výhod (rychlost), nese i dost nevýhod. Jednou z hlavních je, kor u komunitního projektu, je to že lidé nemohou moc příspívat k jeho vývoji. Je potřeba aby krom PHP znali i C. Proto se autoři rozhodli pro vytvoření Zephiru. Zephir je jazyk, hodně podobný PHP s pár drobnostmi navíc, který umožňuje jednoduché psaní PHP extenzí.

 

Instalace

Instalaci nebudu nijak extra zvlášť popisovat, návod je dostupný na githubu, případně na stránkách projektu.

Jen podoktnu že u mě na Ubuntu, jsem musel doinstalovat pár balíčků, vesměs stačil copy&paste z těchto stránek + apt-get install php5-dev a make spustit jako superuser.

 

Použití

Ukazovat tu hello world asi nemá moc smysl, proto jsem přemýšlel nad nějakou ukázkou, kde by se i dala porovnat rychlost oproti Pure PHP. Jednou z věcí co se ve většině projektech řeší je transformace dat, například pokud vytýhneme nějaká data ze databáze a potřebujeme, aby klíčem v poli bylo id.

Kód v php by mohl vypadat následovně (předpokládejme že data jsou konzistentní a vždy obsahují klíč id)

class Transform {
	
	/**
	 * @param  array  $records
	 * @return [array
	 */
	static public function byId(array $records){
		$result = array();
		foreach($records as $record){
			$result[$record['id']] = $record;
		}
		return $result;
	}
}

Stejná implementace v Zephiru:

namespace Twista;

class Transform {
	
	/**
	 * @param  array  records
	 * @return array
	 */
	static public function byId(records){
		var result, record;
		let result = [];
		for record in records {
			let result[record["id"]] = record;
		}
		return result;
	}
}

Na příkladu je krásně vidět, jak jsou jazyky takřka stejné, jde jen o trošku obohacenou syntaxi. Nyní už zbývá jen napsat test, který nám změří rychlost obou implementací.

require __DIR__.'/twista/transform.php';

$numberOfLoops = 1000;

/**
 * testovací data
 */

$record = array(
		'name' => 'test article 1',
		'content' => 'Mám-li eh něhou v lomozil. Ji ho dát černý sklapl šílel. Zakázaná, jak roztyl špióna bimbal ni barvili brejcha alžbětu, čikulí bandinelliho notoričtí ah napíšu vítr moučnice! Ke utíká. Sám zjeví znám dělání ze podejte ó rozchod z školy zívat mučivější vydíráním, daří nu kdo pravou šesti, z ve čem löbla toliko o růžově z nadpis do ráz, už výklad stejně. Papíry nima starost snesla moc vsadil. Slepý sklouzl záhy veřejný uštvaně káča dlani ji bezpodmínečně.',
		'author' => 1,
	);

$data = array();

for($i = 0;$i < 10; $i++){
	$item = $record;
	$item['id'] = $i+10;
	$data[] = $item;
}

/**
 * vlastní test
 */

$time1 = microtime(true);
for($i = 0; $i < $numberOfLoops; $i++){
	$r = Transform::byId($data);
}

echo (microtime(true) - $time1);

echo PHP_EOL;
$time2 = microtime(1);
for($i = 0; $i < $numberOfLoops; $i++){
	
	$r = Twista\transform::byId($data);
}
echo (microtime(true) - $time2);

echo PHP_EOL;

Vytvoříme si testovací pole s deseti záznamy. To pak pošleme naší funkci, která provede transformaci. Pro přesnější výsledky pak projdeme pole vícekrát. Výsledky pak vypadají takto:

$ php test.php 
0.0041329860687256
0.0019371509552002

Z výsledků vyplývá že je Zephir o polovinu rychlejší než implementace v čistém PHP, viz. graf níže.

 

Závěr

Z malého testu vyplynulo, že je Zephir o více jak polovinu rychlejší. Sice jsme testovali jen obyčejnou funkci pro jednoduchou transformaci dat, ale ukazuje to, že kdyby jsme celou aplikaci psali v Zephiru, pak získáme o dost větší výkon. Případně se dají přepsat kritické sekce aplikace. V Kombinaci s HHVM to přináší do PHP světa úpně nové možnosti. Zephir sice není stable, ale věřím že jednou to bude zajímavá alternativa/dopněk PHP aplikací.

Komentáře

comments powered by Disqus