编译其实就是把所有的代码整合在于一个文件,减少文件包含时间,加快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, ); $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)), );
} /**
* 去除代码中的空白和注释
*
* @param string $content
* 代码内容
* @return string
*/
function strip_whitespace($content)
{
$stripStr = '';
// 分析php源码
$tokens = token_get_all($content);
$last_space = false;
for ($i = , $j = count($tokens); $i < $j; $i ++)
{
if (is_string($tokens[$i]))
{
$last_space = false;
$stripStr .= $tokens[$i];
}
else
{
switch ($tokens[$i][])
{
// 过滤各种PHP注释
case T_COMMENT :
case T_DOC_COMMENT :
if (stripos($tokens[$i][], '{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 + ; $k < $j; $k ++)
{
if (is_string($tokens[$k]) && $tokens[$k] === ';')
{
$i = $k;
break;
}
else if ($tokens[$k][] === T_CLOSE_TAG)
{
break;
}
}
break;
default :
$last_space = false;
$stripStr .= $tokens[$i][];
}
}
}
return $stripStr;
}

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

php 编译代码的更多相关文章

  1. Java反编译代码对齐

    使用反编译的代码作为jar包源码进行调试时,经常会遇到的情况是反编译后的源码之在注释里包含行号,但是与代码所在行经常对应不上.这个时候,就有必要对代码进行对齐了. ​ public class Reo ...

  2. 代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?

    代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值? 解决:通过vs的预先生成命令中,添加批处理命令,删除对应的obj文件方式,强制 ...

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

    Notepad++的NppExec插件可以调用好多编译器来编译代码. 比如编译Java: NPP_SAVE javac "$(FULL_CURRENT_PATH)" java -c ...

  4. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

  5. 【反编译系列】一、反编译代码(dex2jar + jd-gui)和反编译资源(apktool)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! [反编译系列]二.反编译代码(jeb) [反编译系列]三.反编译神器(jadx) [反编译系列]四.反编译so文件(IDA_Pro) 概述 ...

  6. 【反编译系列】二、反编译代码(jeb)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 一般情况下我们都是使用dex2jar + jd-gui的方式反编译代码,在实际使用过程中,有时候发现反编译出来的代码阅读效果不是很好 ...

  7. VS每次F5都重新编译代码,即使没有任何修改

    遇到一个奇怪现象,不知道怎么设置了,突然工程的Release模式下,F5每次都要重新编译代码,而且是全部代码都重新编译 而Debug模式没问题 重启VS,重启机器,清理工程重新生成工程都无法解决 最后 ...

  8. Maven编译代码的时候跳过单元测试

    Maven编译代码的时候跳过单元测试 <properties> <maven.test.skip>true</maven.test.skip> </prope ...

  9. Maven编译代码的相关命令

    第一.main目录下的主代码编写完毕后,使用Maven进行编译,在项目根目录下运行命令mvn clean compile进       行项目编译. 第二.test目录下的测试用例编写完毕之后就可以调 ...

  10. hadoop 编译代码及运行

    搞定了hadoop配置之后,可以写代码运行了,首先要配一下CLASS_PATH,修改/etc/profile export JAVA_HOME=/usr/lib/jvm/java--openjdk-i ...

随机推荐

  1. Docker dockerfile-maven-plugin 使用

    https://blog.csdn.net/liubingyu12345/article/details/79015966 背景: 环境阿里云CentOs7下面Docker部署Spring boot ...

  2. UNITY插件信息收集

    2018.8.7 UNITY超级优化神器 : Amplify Impostors

  3. editplus 链接FTP失败,超时

    最近在用editplus链接服务器是出现了超时连接不上的情况 检查后发现FTP配置没问题 后来打开高级设置后发现没有配置端口号 配置后登陆成功

  4. iOS开源项目:AFNetworking----写得非常好

    https://github.com/AFNetworking/AFNetworking 与asi-http-request功能类似的网络库,不过是基于NSURLConnection 和 NSOper ...

  5. 自制精排 ePub 集、不定期更新(UPDATA-2015-8-2)

    说明 排版不说最好,上乘是必须的. 段落空行 首行缩进 具备清爽元数据 包含高清封面.目录 图片居中,图片标题以下标形式居中位于图片下* 支持多看/Kindle原生系统弹出注释,其他软件跳转注释* 各 ...

  6. Java程序设计17——多线程-Part-C

    11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...

  7. IRC聊天指南

    参考https://www.cnblogs.com/fzzl/archive/2011/12/26/2302637.html

  8. 8.3 mysql 表操作

    库操作 一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等    performance_sch ...

  9. .NET基础 (21)ASP NET应用开发

    ASP.NET中的WebForm相关的内容其实有点儿过时了,但在很多的老项目中还是WebForm的,这些都是遗留问题,新上的项目基本上都用MVC了,在微软最新的 ASP.NET 的版本中已经默认使用M ...

  10. Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息

    我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得 ...