V. MODULIZATION & PERFORMANCE
23.  ½ºÄÚÇÎ
setScope() ¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© ÅÛÇø´À» ĸ½¶È­ÇÔÀ¸·Î½á ¸ðµâ°£ ÅÛÇø´ º¯¼öÀÇ Ãæµ¹À» ¹æÁöÇϰí, ÇÑ ÆäÀÌÁö¿¡¼­ °°Àº ÅÛÇø´À» ¿©·¯ ¹ø »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
setScope() ´ë½Å ¸ðµâ³»¿¡¼­ º°µµÀÇ ÅÛÇø´ ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇϰí fetch() ¸Þ¼­µå¿¡ ÀÇÇÑ °á°ú¸¦ ¸®ÅÏÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÒ ¼öµµ ÀÖÀ¸³ª ¸Þ¸ð¸®¸¦ ºñÈ¿À²ÀûÀ¸·Î »ç¿ëÇÏ°Ô µË´Ï´Ù.
¸Þ¼­µå ÀÇ¹Ì »ç¿ë¹ý
setScope() ÅÛÇø´º¯¼ö¸¦ ĸ½¶È­ $tpl->setScope('file_id');
¡Ø  ½ºÄÚÇÁ¿Í ÅÛÇø´º¯¼ö
$tpl->setScope("file_id"); ÀÌÈÄ ÇÒ´çµÈ ÅÛÇø´º¯¼ö´Â ÇØ´çÅÛÇø´("file_id")°ú ±× ÇÏÀ§ÅÛÇø´³»¿¡¼­¸¸ À¯È¿ÇÕ´Ï´Ù. setScope()¿¡ ÀÎÀÚ¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ±âº»½ºÄÚÇÁ·Î º¹±ÍÇÕ´Ï´Ù.
index.php
<?php
...
$tpl->define(array(
    'layout'=>'layout.tpl',
    'mod_a' =>'sub.tpl',
    'mod_b' =>'sub.tpl',
    'mod_c' =>'sub.tpl',
));
$tpl->assign('var', 'hello');
$gvar='This is global value.';
$tpl->setScope('mod_a');
$tpl->assign('var', 'This is mod_a value.');
$tpl->setScope('mod_b');
$tpl->print_('layout');
?>
layout.tpl
<body>
<div> mod_a : {# mod_a}</div>
<div> mod_b : {# mod_b}</div>
<div> mod_c : {# mod_c}</div>
<div> layout: {_gvar} - {var}</div>
</body>
sub.tpl
{_gvar} - {var}
>>output
<body>
<div> mod_a : This is global value. - This is mod_a value.</div>
<div> mod_b : This is global value. - </div>
<div> mod_c : This is global value. - hello</div>
<div> layout: This is global value. - hello</div>
</body>
¾ð´õ¹Ù(_)·Î ½ÃÀÛÇÏ´Â Àü¿ªº¯¼ö´Â ½ºÄÚÇÁ¿¡ °ü°è¾øÀÌ ¾îµð¼­³ª À¯È¿Çϰí, 'mod_b' ´Â ½ºÄÚÇÁ»ç¿ëÀ» ÁöÁ¤ÇßÀ¸³ª ÇØ´ç ½ºÄÚÇÁÀÇ ÅÛÇø´º¯¼ö°¡ °ªÀ» ÇÒ´ç¹ÞÁö ¸øÇ߱⠶§¹®¿¡ Ãâ·Â³»¿ëÀÌ ¾ø½À´Ï´Ù.
¡Ø  ½ºÄÚÇÁ¸¦ ÀÌ¿ëÇÑ ¸ðµâÀÛ¼º ¿¹Á¦
mod.listing.php
function listing(&$tpl, $scope) {
    $tpl->define($scope, 'mod.listing.tpl');
    $tpl->setScope($scope);
    $tpl->assign('title', $scope);
    $query = 'select name, date from '.$scope.' where ------';
    $result= mysql_query($query);
    $loop = array();
    while ($data = mysql_fetch_assoc($result)) $loop[] = $data;
    $tpl->assign('list', $loop);
    $tpl->setScope();
}
?>
mod.listing.tpl
<table>
<tr><td colspan=2>{title}</td></tr>
<!--{@ list}-->
<tr><td>{list.name}</td><td>{list.date}</td></tr>

<!--{/}-->
</table>
index.php
<?php
...
include LIB_DIR.'/mod.listing.php';
$tpl = new Template_;
listing($tpl, 'fruit');
listing($tpl, 'sport');
$tpl->define('layout', 'layout.tpl');
$tpl->assign('title', 'My Page');
$tpl->print_('layout');
?>
layout.tpl
<div>{title}</div>
{# fruit}
{# sport}
>>output
<div>My Page</div>
<table>
<tr><td colspan=2>fruit</td></tr>
<tr><td>apple</td><td>2003-09-26</td></tr>
<tr><td>orange</td><td>2003-08-20</td></tr>
<tr><td>melon</td><td>2003-05-05</td></tr>

</table>
<table>
<tr><td colspan=2>sport</td></tr>
<tr><td>running</td><td>2003-07-10</td></tr>
<tr><td>pingpong</td><td>2002-01-01</td></tr>
<tr><td>pushup</td><td>2000-03-06</td></tr>

</table>
¡Ø  ½ºÄÚÇÁ¿Í ÆÄÀϾÆÀ̵ð
½ºÄÚÇÁ»ç¿ëÀÌ ÁöÁ¤µÈ ÅÛÇø´ ¿ª½Ã ÇÏÀ§ÅÛÇø´À» °¡Áú ¼ö Àִµ¥, ½ºÄÚÇÁ»ç¿ëÀÌ ÁöÁ¤µÈ ÅÛÇø´ÀÇ ÆÄÀϾÆÀ̵𰡠"scope_id" ¶ó¸é, ÇÏÀ§ÅÛÇø´Àº, "scope_id.file_id" ÀÇ Çü½ÄÀ¸·Î Á¤Àǵ˴ϴÙ.
index.php
<?php
...
$tpl->define(array(
    'layout'  =>'layout.tpl',
    'mod'     =>'sub0.tpl',
    'mod.sub1'=>'sub1.tpl',
    'mod.sub2'=>'sub2.tpl',
));
$tpl->setScope('mod');
$tpl->assign(array(
    'var'=>'This is mod value 1.',
    'abc'=>'This is mod value 2.',
    'xyz'=>'This is mod value 3.',
));
$tpl->print_('layout');
?>
layout.tpl
<body>
{# mod}
</body>
sub0.tpl
{var}
{# sub1}
{# sub2}
sub1.tpl
{abc}
sub2.tpl
{xyz}
>>output
<body>
This is mod value 1.
This is mod value 2.
This is mod value 3.
</body>
PHP ÆÄÀÏ¿¡¼­´Â "mod.sub1" ÀÌÁö¸¸, ÅÛÇø´ÆÄÀÏ ³»¿¡¼­´Â ½ºÄÚÇÁ¸¦ »ç¿ëÇÏÁö ¾ÊÀ» ¶§¿Í ¶È°°ÀÌ {# sub1} ÀÓ¿¡ À¯ÀÇÇÕ´Ï´Ù.
24.  Ä³½³
ij½¬¸¦ »ç¿ëÇϸé, ÇÑ ¹ø Ãâ·ÂÇß´ø °á°ú¹°À» ÀúÀåÇÏ¿´´Ù°¡, °°Àº Ãâ·ÂÀÌ ÇÊ¿äÇÏ´Ù¸é ÇÁ·Î±×·¥½ÇÇàÀ» »ý·«Çϰí ÀúÀåµÈ °á°ú¹°À» Ãâ·ÂÇÏ°Ô µË´Ï´Ù.
Note:
ÅÛÇø´ ÆÄÀÏÀ» PHP ÆÄÀÏ·Î º¯È¯ÇÏ´Â °ÍÀº ij½¬°¡ ¾Æ´Õ´Ï´Ù. º¯È¯ÆÄÀÏÀº À־ ¾ø¾îµµ ÁÁÀº ÀÓ½ÃÀûÀÎ °ÍÀÌ ¾Æ´Ï¶ó, Ãâ·ÂÀ» À§Çؼ­ ¹Ýµå½Ã ÇÊ¿äÇϱ⠶§¹®ÀÔ´Ï´Ù. ÅÛÇø´¾ð´õ¹Ù¿Í °ü·ÃÇÏ¿© µÎ °¡Áö ij½¬°¡ ÀÖ½À´Ï´Ù.

Çϳª´Â, Zend Performance Suit, TurckMMCache, PHPA ¿Í °°ÀÌ ¼³Ä¡¸¸ ÇÏ¸é µ¿ÀÛÇϴ ij½¬¿£ÁøÀÔ´Ï´Ù. ÀÌµé ¿£ÁøÀº ÇÑ ¹ø ÆÄ½Ì/½ÇÇàµÈ PHP ÆÄÀÏÀÇ ¿ÉÄÚµå(opcode)¸¦ ÀúÀåÇÏ¿© ´ÙÀ½ ¹ø ½ÇÇàºÎÅÍ´Â ÆÄ½ÌÀ» »ý·«ÇÏ°í ¿ÉÄڵ带 ¹Ù·Î ½ÇÇàÇÏ°Ô ÇÕ´Ï´Ù. ÀÌ ¶§, ÅÛÇø´Å¬·¡½ºÆÄÀÏ »Ó ¾Æ´Ï¶ó ÅÛÇø´ º¯È¯ÆÄÀÏ ¿ª½Ã PHP ÆÄÀÏÀ̹ǷΠÀÌµé ¿£Áø¿¡ ÀÇÇØ ¸ðµÎ ij½³µË´Ï´Ù.

µÎ ¹øÂ°´Â ÀÌ ¼½¼Ç¿¡¼­ ¼³¸íÇϴ ij½¬ÀÔ´Ï´Ù.
ij½¬¸¦ »ç¿ëÇÏ·Á¸é $caching ¼Ó¼ºÀ» true·Î ÇÕ´Ï´Ù. $cache_dir ¼Ó¼º¿¡´Â ij½¬ÆÄÀÏÀÌ ÀúÀåµÉ µð·ºÅ丮¸¦ ÁöÁ¤(Àý´ë ¶Ç´Â »ó´ë°æ·Î)Çϰí À¥¼­¹ö°¡ ÀÐ°í ¾µ ¼ö ÀÖµµ·Ï ±ÇÇÑ ¼³Á¤À» ÇÕ´Ï´Ù.
var $caching   = true;
var $cache_dir = '/path/to/_cache';
¡Ø  ±âº» »ç¿ë¹ý, ¸¸·á½Ã°£¿¡ ÀÇÇÑ Ä³½¬ °»½Å
¸Þ¼­µå ÀÇ¹Ì »ç¿ë¹ý
setCache() ÅÛÇø´¿¡ ij½¬Á¤º¸ ¼³Á¤ $tpl->setCache('file_id', expiration);
isCached() ij½¬ÀÇ À¯È¿¿©ºÎ ÆÇº° $tpl->isCached('file_id');
setCache() ¸Þ¼­µåÀÇ Ã¹ ¹øÂ° ÀÎÀÚ·Î ÁöÁ¤µÈ ÆÄÀϾÆÀ̵𿡠´ëÇØ ij½¬¸¦ µ¿ÀÛ½ÃŰ°Ô µË´Ï´Ù. ij½¬°¡ ¸¸µé¾îÁö¸é, µÎ ¹øÂ° ÀÎÀÚ·Î ÁöÁ¤µÈ ½Ã°£µ¿¾È »ç¿ëµÈ ÈÄ °»½ÅµË´Ï´Ù.
index.php
<?php
...
$tpl->define(array(
    'layout'=>'layout.tpl',
    ...,
    ...,
));
$tpl->setCache('layout', 3600); // update per 1 hour
if (!$tpl->isCached('layout')) {
    // code for layout
}
$tpl->print_('layout');
?>
isCached() ¸Þ¼­µå´Â ij½¬ÀÇ À¯È¿¿©ºÎ¸¦ ¸®ÅÏÇϹǷÎ, ij½¬°¡ À¯È¿ÇÒ ¶§´Â // code for layout  ºí·°ÀÇ ½ÇÇàÀÌ »ý·«µË´Ï´Ù.
setCache() ÀÇ µÎ ¹øÂ°ÀÎÀÚ°¡ 0 À̸é ij½¬°¡ ¸¸µé¾îÁøÈÄ °»½ÅµÇÁö ¾Ê°í °è¼Ó »ç¿ëµË´Ï´Ù. 1 À̸é $cache_expire ¼Ó¼º¿¡ ¼³Á¤µÈ ±âº»°ªÀ» »ç¿ëÇÏ°Ô µË´Ï´Ù.
ÅÛÇø´ ÆÄÀϺ°·Î ij½¬¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¶ÇÇÑ ">"À¸·Î Á¤ÀÇÇÑ ¿ÜºÎ PHP ÆÄÀÏ¿¡µµ ij½¬¸¦ ¼³Á¤ÇÒ ¼ö ÀÖÀ¸¸ç, À̰ÍÀ» ÅëÇØ ÅÛÇø´¾ð´õ¹Ù¸¦ ij½¬¿£ÁøÀ¸·Î¸¸ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
index.php
<?php
...
$cache = new Template_;
$cache->define('>source', '/path/to/other-php-source.php');
$cache->setCache('source', 3600);
$cache->print_('source');
?>
¡Ø  »èÁ¦¾ÆÀ̵𿡠ÀÇÇÑ Ä³½¬ °»½Å
setCache() ¸Þ¼­µåÀÇ ¼¼ ¹øÂ° ÀÎÀÚ·Î »èÁ¦¾ÆÀ̵𸦠ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç. ÀÌ ¾ÆÀ̵𸦠»ç¿ëÇÏ¿© ¾î¶² ÆäÀÌÁö¿¡¼­µç $cache_dir ¼³Á¤ÀÌ °°´Ù¸é ¸¸·á½Ã°£¿¡ °ü°è¾øÀÌ °­Á¦¸¸·á½Ãų ¼ö ÀÖ½À´Ï´Ù.
$tpl->setCache( 'file_id', 3600, 'clear_id' );
$tpl->clearCache( 'clear_id' );
¸Þ¼­µå ÀǹÌ
clearCache() ÀÎÀÚ·Î ÁöÁ¤µÈ »èÁ¦¾ÆÀ̵𸦠°®´Â ¸ðµç ij½¬¸¦ »èÁ¦ÇÔ
¿£Áø ³»ºÎÀûÀ¸·Î´Â ij½¬Çì´õ¸¦ °Ë»öÇØ¼­ ij½¬ÆÄÀÏÀ» ½ÇÁ¦·Î »èÁ¦ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, º°µµÀÇ µð·ºÅ丮¿¡¼­ °ü¸®µÇ´Â »èÁ¦¾ÆÀ̵ðÁ¤º¸¸¸À» ¾ï¼¼½ºÇϹǷΠºü¸£°Ô 󸮵˴ϴÙ. clearCache() ¿¡ ÀÎÀÚ¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¸ðµç ij½¬ÆÄÀÏÀ» »èÁ¦ÇÕ´Ï´Ù.
show-list.php
<?php
...
$tpl->define(array(
    'layout'=>'layout.tpl',
    'main'  =>'shop/listing.tpl',
    ...
));
$tpl->setCache('main', 0, 'book_list');
if (!$tpl->isCached('main')) {
    // code for listing
}
$tpl->print_('layout');
?>
update-list.php
<?php
...
// code for updating list

$tpl->clearCache('book_list');
...
?>
setCache() ÀÇ ¼¼ ¹øÂ° ÀÎÀÚ·Î ¹®ÀÚ¿­ ´ë½Å ¿©·¯ °³ÀÇ »èÁ¦¾ÆÀ̵𸦠¹è¿­·Î ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Áß Çϳª¶óµµ clearCache() ·Î 󸮵Ǹé ij½¬´Â °»½ÅµË´Ï´Ù.
$tpl->setCache( 'file_id', 1800, array('book', 'magazine') );
¶ÇÇÑ ¿©·¯ ij½¬°¡ °°Àº »èÁ¦¾ÆÀ̵𸦠°¡Áú °æ¿ì »èÁ¦¾ÆÀ̵𰡠clearCache() ·Î 󸮵Ǹé ÇØ´çµÇ´Â ¸ðµç ij½¬°¡ °»½ÅµË´Ï´Ù.
¼¼ ¹øÂ° ÀÎÀÚ·Î ºó¹®ÀÚ¿­('')À» ÁöÁ¤ÇÏ¸é »èÁ¦¾ÆÀ̵ð´Â ¼³Á¤µÇÁö ¾Ê½À´Ï´Ù.
¡Ø  Ä³½¬¾ÆÀ̵𿡠ÀÇÇÑ ´ÙÁß Ä³½¬
¿¹¸¦ µé¾î º» ½ÎÀÌÆ®ÀÇ ·¹ÆÛ·±½º ÆäÀÌÁö´Â get À¸·Î Àü´ÞµÈ º¯¼öÀÇ °ª¿¡ µû¶ó ´Ù¸¥ ÆäÀÌÁö¸¦ Ãâ·ÂÇÕ´Ï´Ù. setCache() ¸Þ¼­µåÀÇ ³× ¹øÂ° ÀÎÀÚ¸¦ ¼³Á¤ÇÔÀ¸·Î½á °¢°¢ÀÇ ÆäÀÌÁö¸¦ ij½³ÇÒ ¼ö ÀÖ½À´Ï´Ù.
$tpl->setCache( 'body', 0, '', $_GET );
³× ¹øÂ° ÀÎÀÚ´Â ¹®ÀÚ¿­, º¯¼ö, ¹è¿­(À妽º¹è¿­, ¿¬°ü¹è¿­, ´ÙÁ߹迭) µîÀ¸·Î ÁöÁ¤µÉ ¼ö ÀÖ°í, ¿£Áø ³»ºÎÀûÀ¸·Î´Â serialize() ÇÔ¼ö¿¡ ÀÇÇØ ij½¬¾ÆÀ̵ð·Î ¼³Á¤µË´Ï´Ù. ¹è¿­·Î ÁöÁ¤ÇÒ ¶§ ÇÊ¿äÇÑ º¯¼ö¸¸À» Æ÷ÇÔÇÏ¿© ºÒÇÊ¿äÇÏ°Ô ¸¹Àº ij½¬ÆÄÀÏÀÌ ¸¸µé¾îÁöÁö ¾Êµµ·Ï ÇÕ´Ï´Ù.
ij½¬´Â »ç¿ë¹üÀ§°¡ Á¦ÇÑÀûÀ̸ç Àû¿ë¹æ½ÄÀÌ ´Ù¾çÇÕ´Ï´Ù. »ç¿ë½Ã ¾î·Á¿îÁ¡ÀÌ ÀÖ´Ù¸é °Ô½ÃÆÇ¿¡ ¹®ÀÇÇϽñ⠹ٶø´Ï´Ù.
 
2003-03-03 ~