编译其实就是把所有的代码整合在于一个文件,减少文件包含时间,加快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. artZoom 图片可放大旋转

    资源下载:http://www.sucaijiayuan.com/Js/TuPianDaiMa/774.html 第一步:引入文件 <link rel="stylesheet" ...

  2. 【poj3254】Corn Fields 状态压缩dp

    AC通道:http://vjudge.net/problem/POJ-3254 [题目大意] 农夫约翰购买了一处肥沃的矩形牧场,分成M*N(1<=M<=12; 1<=N<=12 ...

  3. C语言条件编译及编译预处理阶段(转)

    一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...

  4. FW:考查嵌入式C开发人员的最好的16道题(转)

    考查一个初级嵌入式系统开发人员的C基本功,附有答案题目由资深嵌入式系统专家拟定, 目的是考查入门级的嵌入式软件开发人员 Gavin Shaw提供详细解答. 编者按:非常基本关于C语言的问题,一个信息类 ...

  5. http://www.rabbitmq.com/

    什么是RabbitMQ 官网http://www.rabbitmq.com/ 1.应用程序间健壮的消息发送 2.简单易用 3.可在所有主流操作系统运行 4.支持巨量的开发者平台 5.开源和商用双重支持 ...

  6. SpringMVC源码解析 - HandlerAdater - ModelAndViewContainer上下文容器

    HandlerAdapter在处理请求时上下文数据的传递工作是由ModelAndViewContainer负责的. 源码注释是这样描述的: Records model and view related ...

  7. SQLSERVER带端口号的链接方式

    SQLSERVER带端口号的链接方式 <add key="BBAcnn" value="server=IP,端口号\实例名;database=TESTDB;uid= ...

  8. mysql数据表简单拷贝及重命名

    CREATE TABLE to LIKE from;//拷贝结构 RENAME TABLE from TO to;//重命名

  9. [LeetCode 题解]: Reverse Nodes in K-Groups

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  10. Spring 事务管理案例

    事务管理简介   Spring 事务管理有两种方式:一种是编程式事务管理,即通过编写代码实现事物管理,包括定义事务的开始,程序正常执行后的事物提交,异常时进行的事务回滚.另一种是基于AOP技术实现的声 ...