php 编译代码

编译其实就是把所有的代码整合在于一个文件,减少文件包含时间,加快php解析,虽然优化后时间上提升了不多,但
能优化便多多少少进行优化。下面给一个编译例子,从而引申。

// 定义编译状态
define(‘COMPILE‘, true);
// 引入框架入口(项目框架入口)
require_once ‘rukou.php‘;
$result = ‘‘;
// 引入想要引入的核心文件
$result .= includeFile(PATH_CORE_DRIVER . "Config/ConfigBase.class.php");
$result .= includeFile(PATH_CORE_DRIVER . ‘Config/ConfigPhp.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Config/Config.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . "Cache/CacheBase.class.php");
$result .= includeFile(PATH_CORE_DRIVER . ‘Cache/CacheFile.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Cache/Cache.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Log/LogBase.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Log/LogFile.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Log/Log.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . "Db/DbBase.class.php");
$result .= includeFile(PATH_CORE_DRIVER . ‘Db/DbMysql.class.php‘);
$result .= includeFile(PATH_CORE_DRIVER . ‘Db/Db.class.php‘);
// 引入核心其它文件
foreach ($arr as $value)
{
    $result .= includeFile(PATH_CORE . "{$value}.class.php");
}
// 定义已编译状态
$fc = strip_whitespace(file_get_contents(‘Yurun.php‘));
$fc = substr($fc, 5);

$fc = "<?php define(‘IS_COMPILED‘,true);{$fc}";
// 写出文件
file_put_contents(‘compile_success.php‘, str_replace(‘// {compile}‘, $result, $fc),LOCK_EX);
header(‘Content-type: text/html; charset=utf-8‘);
echo ‘生成成功!‘;
/**
 * 将PHP文件读入并去除空格和注释
 *
 * @param type $file
 * @return type
 */
function includeFile($file)
{
    return substr(strip_whitespace(file_get_contents($file)), 5);
}

/**
 * 去除代码中的空白和注释
 *
 * @param string $content
 *            代码内容
 * @return string
 */
function strip_whitespace($content)
{
    $stripStr = ‘‘;
    // 分析php源码
    $tokens = token_get_all($content);
    $last_space = false;
    for ($i = 0, $j = count($tokens); $i < $j; $i ++)
    {
        if (is_string($tokens[$i]))
        {
            $last_space = false;
            $stripStr .= $tokens[$i];
        }
        else
        {
            switch ($tokens[$i][0])
            {
                // 过滤各种PHP注释
                case T_COMMENT :
                case T_DOC_COMMENT :
                    if (stripos($tokens[$i][1], ‘{compile}‘) !== false)
                    {
                        $stripStr .= "// {compile}\n";
                    }
                    break;
                // 过滤空格
                case T_WHITESPACE :
                    if (! $last_space)
                    {
                        $stripStr .= ‘ ‘;
                        $last_space = true;
                    }
                    break;
                case T_START_HEREDOC :
                    $stripStr .= "<<<\n";
                    break;
                case T_END_HEREDOC :
                    $stripStr .= "\n";
                    for ($k = $i + 1; $k < $j; $k ++)
                    {
                        if (is_string($tokens[$k]) && $tokens[$k] === ‘;‘)
                        {
                            $i = $k;
                            break;
                        }
                        else if ($tokens[$k][0] === T_CLOSE_TAG)
                        {
                            break;
                        }
                    }
                    break;
                default :
                    $last_space = false;
                    $stripStr .= $tokens[$i][1];
            }
        }
    }
    return $stripStr;
}

生成之后,代码会糅合在一起。

时间: 2024-10-25 19:06:19

php 编译代码的相关文章

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器: 要实现这种功能,我们只需要调用CSharpCodeProvider就可以实现了: string prefix = "using System;"+ "public static class Test{"+ "public static void Run(){"; string po

Notepad++根据语言类型自动选择对应编译器来编译代码

Notepad++的NppExec插件可以调用好多编译器来编译代码. 比如编译Java: NPP_SAVE javac "$(FULL_CURRENT_PATH)" java -cp "$(CURRENT_DIRECTORY)" "$(NAME_PART)" 保存为:Run Java 编译Python: NPP_SAVE python "$(FULL_CURRENT_PATH)" 保存为:Run Python 然后就是自动切换

Resharper的配置(习惯使用了VS的F6编译和F12(快速非resharper查询编译代码)转到定义的默认设置)【设置了好多次resharper的使用了,特此记下简单的思路】

1:如何设置vs默认的快捷键方式: 2:重新设置resharper的F12及其其它选项设置: 3:通过以上两步,就可以使用默认的vs快捷方式和resharper的常用功能设置了. Resharper的配置(习惯使用了VS的F6编译和F12(快速非resharper查询编译代码)转到定义的默认设置)[设置了好多次resharper的使用了,特此记下简单的思路],布布扣,bubuko.com

C# 动态编译代码

C# 动态编译代码: 公共辅助类,有注释就不废话了. using System; using System.Text; using System.Reflection; using System.CodeDom.Compiler; namespace DynamicCompilation.Compilation { /// /// 编译返回结果 /// public class CompilationReturn { /// /// 程序集 /// public Assembly Assembl

Synopsys VCS MX vJ-2014.12 SP2 Linux64 1DVD编译代码模拟器

Synopsys VCS MX vJ-2014.12 SP2 Linux64 1DVD编译代码模拟器Synopsys Hspice vK-2015.06.Linux32_64 2CDSynopsys Saber RD vJ-2015.03 Windows 1DVDSynopsys公司,世界领先的软件和IP设计,验证和制造电子元件和系统,发布了Synopsys VCS MX VI-2014.03 - 一个编译代码模拟器.它使 我们能够分析,编译和模拟Verilog,VHDL,混合HDL,Syste

Mac OS X 10.10 编译代码出错 fatal error: &#39;__debug&#39; file not found #include &lt;__debug&gt;

1. 错误描述 在mac系统升级到yosemite,或者Xcode版本升级后,在编译c++程序的时候无法通过,错误类型如下: 2. 解决方案 创建一个临时文件"__debug",可以解决这个问题.在命令行中执行以下代码: $ echo '#define _LIBCPP_ASSERT(x, m) ((void)0)' | sudo tee -a /Library/Developer/CommandLineTools/usr/include/c++/v1/__debug > /dev

【学习】从.txt文件读取生成编译代码。

1 string code = null; 2 String projectName = Assembly.GetExecutingAssembly().GetName().Name; 3 // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) 4 Stream stram = Assembly.GetExecutingAssembly() 5 .GetManifestResourceStream(projectName + ".code.txt"); 6 using

c# msbuild.exe编译代码实例

msbuild.exe编译代码实例 cmd执行语句 @echo off C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe "H:\WQB\SBCERP2\trunk-new\SBC.sln" /t:rebuild /p:Configuration=Debug 解释: /t:rebuild :重新生成,/t:build 生成/t:clean 清理/p:Configuration=Debug 编译模式:debug/p:Con

Linux巩固记录(5) hadoop 2.7.4下自己编译代码并运行MapReduce程序

程序代码为 ~\hadoop-2.7.4\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.7.4-sources\org\apache\hadoop\examples\WordCount.java 第一次  删除了package import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configur