Source for file jIncluder.class.php

Documentation is available at jIncluder.class.php

  1. <?php
  2. /**
  3.  * @package    jelix
  4.  * @subpackage core
  5.  * @author     Laurent Jouanneau
  6.  * @copyright  2005-2012 Laurent Jouanneau
  7.  *    Idea of this class was picked from the Copix project (CopixInclude, Copix 2.3dev20050901, http://www.copix.org)
  8.  * @link       http://www.jelix.org
  9.  * @licence    GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10.  */
  11.  
  12. /**
  13.  * interface for compiler which needs only one source file.
  14.  * The PHP file generated by the compiler should check itself
  15.  * if it is still valid. The file should have a "return" statement
  16.  * with a boolean : true if it is ok, false if it should be recompiled.
  17.  * @package  jelix
  18.  * @subpackage core
  19.  */
  20. interface jISimpleCompiler {
  21.     /**
  22.      * parse the given file, and store the result in a cache file
  23.      * @param jSelector $aSelector the file selector
  24.      * @return boolean true : process ok
  25.      */
  26.     public function compile($aSelector);
  27. }
  28.  
  29. /**
  30.  * interface for compiler which needs many source files
  31.  * The PHP file generated by the compiler should check itself
  32.  * if it is still valid. The file should have a "return" statement
  33.  * with a boolean : true if it is ok, false if it should be recompiled.
  34.  * @package  jelix
  35.  * @subpackage core
  36.  */
  37. interface jIMultiFileCompiler {
  38.  
  39.     /**
  40.      * parse one of needed file
  41.      * @param string $sourceFile the file selector
  42.      * @param string $module    the module name of the file
  43.      * @return boolean true : process ok
  44.      */
  45.     public function compileItem($sourceFile$module);
  46.  
  47.     /**
  48.      * save the results in a temporary file
  49.      * called at the end of the compilation.
  50.      * @param string $cachefile the name of cache file
  51.      */
  52.     public function endCompile($cachefile);
  53. }
  54. /**
  55.  * This object is responsible to load cache files.
  56.  * Some jelix files needs to be compiled in PHP (templates, daos etc..) and their
  57.  * correspondant php content are stored in a cache file.
  58.  * jIncluder verify that cache file exists, and if not, it calls the correspondant compiler.
  59.  * Finally, it includes the cache.
  60.  * @package  jelix
  61.  * @subpackage core
  62.  * @author     Laurent Jouanneau
  63.  * @copyright  2001-2012 Laurent Jouanneau
  64.  * @licence    GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html .
  65.  */
  66. class jIncluder {
  67.     /**
  68.      * list of loaded cache file.
  69.      * It avoids to do all verification when a file is include many time
  70.      * @var array 
  71.      */
  72.     protected static $_includedFiles array();
  73.  
  74.     /**
  75.      * This is a static class, so private constructor
  76.      */
  77.     private function __construct(){}
  78.  
  79.     /**
  80.      * includes cache of the correspondant file selector
  81.      * check the cache, compile if needed, and include the cache
  82.      * @param    jISelector   $aSelectorId    the selector corresponding to the file
  83.     */
  84.     public static function inc($aSelector){
  85.  
  86.         $cachefile $aSelector->getCompiledFilePath();
  87.  
  88.         if($cachefile == '' || isset(jIncluder::$_includedFiles[$cachefile])){
  89.             return;
  90.         }
  91.  
  92.         $mustCompile jApp::config()->compilation['force'|| !file_exists($cachefile);
  93.  
  94.         if(!$mustCompile{
  95.             // if the cache file has been compiled with checkCacheFiletime=on
  96.             // it verify itself if it is valid
  97.             $isValid = require($cachefile);
  98.             if ($isValid === true{
  99.                 jIncluder::$_includedFiles[$cachefile]=true;
  100.                 return;
  101.             }
  102.         }
  103.  
  104.         $sourcefile $aSelector->getPath();
  105.         if($sourcefile == '' || !file_exists($sourcefile)){
  106.             throw new jException('jelix~errors.includer.source.missing',array$aSelector->toString(true)));
  107.         }
  108.  
  109.         $compiler $aSelector->getCompiler();
  110.         if(!$compiler || !$compiler->compile($aSelector)){
  111.             throw new jException('jelix~errors.includer.source.compile',array$aSelector->toString(true)));
  112.         }
  113.         // Because we did a require few lines ago, a second
  114.         // require load the file content from the opcode cache
  115.         // if it is existing. So we must invalidate the file.
  116.         if (function_exists('opcache_invalidate')) {
  117.             opcache_invalidate $cachefiletrue );
  118.         }
  119.         else if (function_exists('apc_delete_file')) {
  120.             apc_delete_file($cachefile);
  121.         }
  122.         require($cachefile);
  123.         jIncluder::$_includedFiles[$cachefile]=true;
  124.     }
  125.  
  126.     /**
  127.      * include a cache file which is the results of the compilation of multiple file sotred in multiple modules
  128.     * @param    array    $aType 
  129.     *     = array(
  130.     *     'compilator class name',
  131.     *     'relative path of the compilator class file to lib/jelix/',
  132.     *     'foo.xml', // file name to compile (in each modules)
  133.     *     'foo.php',  //cache filename
  134.     *     );
  135.     */
  136.     public static function incAll($aType){
  137.  
  138.         $cachefile jApp::tempPath('compiled/'.$aType[3]);
  139.         if(isset(jIncluder::$_includedFiles[$cachefile])){
  140.             return;
  141.         }
  142.  
  143.         $config jApp::config();
  144.         $mustCompile $config->compilation['force'|| !file_exists($cachefile);
  145.  
  146.         if(!$mustCompile && $config->compilation['checkCacheFiletime']){
  147.             $compiledate filemtime($cachefile);
  148.             foreach($config->_modulesPathList as $module=>$path){
  149.                 $sourcefile $path.$aType[2];
  150.                 if (is_readable ($sourcefile)){
  151.                     iffilemtime($sourcefile$compiledate){
  152.                         $mustCompile true;
  153.                         break;
  154.                     }
  155.                 }
  156.             }
  157.         }
  158.  
  159.         if($mustCompile){
  160.             require_once(JELIX_LIB_PATH.$aType[1]);
  161.             $compiler new $aType[0];
  162.             $compileok true;
  163.             foreach($config->_modulesPathList as $module=>$path){
  164.                 $compileok $compiler->compileItem($path.$aType[2]$module);
  165.                 if(!$compileokbreak;
  166.             }
  167.  
  168.             if($compileok){
  169.                 $compiler->endCompile($cachefile);
  170.                // the require may load the file content from the
  171.                // opcode cache if it is existing.
  172.                // So we must invalidate the file.
  173.                 if (function_exists('opcache_invalidate')) {
  174.                    opcache_invalidate $cachefiletrue );
  175.                 }
  176.                 else if (function_exists('apc_delete_file')) {
  177.                    apc_delete_file($cachefile);
  178.                 }
  179.                 require($cachefile);
  180.                 jIncluder::$_includedFiles[$cachefile]=true;
  181.             }
  182.         }else{
  183.             require($cachefile);
  184.             jIncluder::$_includedFiles[$cachefile]=true;
  185.         }
  186.     }
  187. }

Documentation generated on Wed, 04 Jan 2017 22:55:08 +0100 by phpDocumentor 1.4.3