停止php-fpm(apache同理):

sudo /png/php/7.0.0/png_fpm stop

创建opcode缓存目录:

mkdir -m 777 /png/php/opcache_file_cache

在php.ini中配置:

zend_extension=/png/php/7.0.0/lib/php/extensions/no-debug-non-zts-20151012/opcache.so

opcache.memory_consumption=128

opcache.interned_strings_buffer=8

opcache.max_accelerated_files=4000

;opcache不保存注释,减少opcode大小

opcache.save_comments=0

;关闭PHP文件时间戳验证

opcache.validate_timestamps=Off

;每60秒验证php文件时间戳是否更新

;opcache.revalidate_freq=60

opcache.fast_shutdown=1

;注意,PHP7下命令行执行的脚本也会被 opcache.file_cache 缓存.

opcache.enable_cli=1

;设置不缓存的黑名单

;opcache.blacklist_filename=/png/php/opcache_blacklist

opcache.file_cache=/png/php/opcache_file_cache

opcache.file_cache_only=0

opcache.enable=On

备份原来项目(以phpMyAdmin为例):

cp -R /png/www/example.com/public_html/app/pma /png/www/example.com/public_html/app/pma.bak

执行opcache_compile_file.php导出PHP脚本对应的opcode:

sudo /png/php/7.0.0/bin/php /png/www/example.com/public_html/app/opcache_compile_file.php

opcache_compile_file.php 内容如下:

function getfiles( $path , &$files = array() ) {

if ( !is_dir( $path ) ) return null;

$handle = opendir( $path );

while ( false !== ( $file = readdir( $handle ) ) ) {

if ( $file != '.' && $file != '..' ) {

$path2 = $path . '/' . $file;

if ( is_dir( $path2 ) ) {

getfiles( $path2 , $files );

} else {

if ( preg_match( '%\.php$%' , $file ) ) {

$files[] = $path2;

}

}

}

}

return $files;

}

// 获取指定目录及其子目录下的所有PHP文件

$files = getfiles('/png/www/example.com/public_html/app/pma');

foreach($files as $file){

opcache_compile_file($file); //编译PHP文件生成opcode

file_put_contents($file, ''); //清空原来的PHP脚本

echo $file."\n";

}

echo 'Total PHP Files: '.count($files)."\n";

或者使用PHP的SPL库里提供的递归目录迭代器RecursiveDirectoryIterator实现递归编译PHP:

opcache_compile_files('/png/www/example.com/public_html/app/pma');

function opcache_compile_files($dir) {

foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $v) {

if(!$v->isDir() && preg_match('%\.php$%', $v->getRealPath())) {

opcache_compile_file($v->getRealPath());

echo $v->getRealPath()."\n";

}

}

}

把缓存目录所有者设为php-fpm运行用户,我这里是png:

sudo chown -R png:png /png/php/opcache_file_cache/

启动php-fpm:

sudo /png/php/7.0.0/png_fpm start

访问phpMyAdmin:

http://www.example.com/app/pma/

phpMyAdmin的PHP文件一一对应的opcode(后缀为.php.bin)生成在:

/png/php/opcache_file_cache/xxx/png/www/example.com/public_html/app/pma

其中xxx是一个32位的md5编码的字符串.

部署到目标服务器的时候,需要保留项目中内容被清空的PHP脚本.

而且路径一定要对应导出opcode时的路径,文中的就是:

/png/www/example.com/public_html/app/pma

另外,PHP还可以使用函数php_strip_whitespace()删除PHP源码中的注释和空格.

后话:

opcache.file_cache是PHP7对hhvm.repo.central.path的反击,鸟哥威武!

opcache.file_cache对比PHP5时代APC的apc_bin_dumpfile和apc_bin_loadfile来说,

导出和导入操作都由opcache完成,显然ZendOpcache比APC更加自动化.

那个md5串由 PHP_VERSION / ZEND_EXTENSION_BUILD_ID / ZEND_BIN_ID 确定:

php-src/ext/opcache/zend_file_cache.c: zend_file_cache_get_bin_file_path ZCG(system_id)

php-src/ext/opcache/ZendAccelerator.c: accel_gen_system_id ZCG(system_id)

#define ZEND_EXTENSION_BUILD_ID "API" ZEND_TOSTR(ZEND_EXTENSION_API_NO) ZEND_BUILD_TS ZEND_BUILD_DEBUG ZEND_BUILD_SYSTEM ZEND_BUILD_EXTRA

#define ZEND_BIN_ID "BIN_" ZEND_TOSTR(SIZEOF_CHAR) ZEND_TOSTR(SIZEOF_INT) ZEND_TOSTR(SIZEOF_LONG) ZEND_TOSTR(SIZEOF_SIZE_T) ZEND_TOSTR(SIZEOF_ZEND_LONG) ZEND_TOSTR(ZEND_MM_ALIGNMENT)

因为Ubuntu上编译的PHP7,打包依赖库后放到CentOS上运行,这个md5串是相同的.

可以肯定的是,Linux上导出的opcode不能放到Windows上运行,反之也是如此.

Beast加密过的PHP文件,也一样能看到PHP文件对应的opcode,

因为Beast解密后,还是一样需要调用zend_compile_file生成页面的opcode,

而opcode是可以用VLD(Vulcan Logic Disassembler)这类PECL扩展查看的.

php -dvld.active=1 -S 127.0.0.1:8080

curl http://127.0.0.1:8080/

也就是说,PHP脚本加密能够避免脚本被恶意篡改,但脚本里的数据仍然是可见的.

所以,文中的opcache.file_cache用来保护代码逻辑应该还是可以的,

但不能确保里面定义的量的安全,比如加密密钥.存也可以,但防君子不防小人,门槛高点而已.

Zend Guard和ionCube加密的PHP脚本可以用DeZender/De-ionCube解密:

http://dezender.net/

Java字节码和Android APK可以用Java Decompiler反编译:

http://jd.benow.ca/

Python脚本可以编译成pyc文件,不过pyc文件也很容易被反编译.

所以包括opcache.file_cache这样的代码保护,也只能防君子不防小人.

php7 opcache 编译,PHP7中用opcache.file_cache导出脚本opcode实现源代码保护相关推荐

  1. php7 daemon,编译PHP7

    PHP7 PHP7都出了,自然我是要安装的,上次写的那个编译开发环境并没有针对性的说PHP,就这次说清楚吧. Download $ wget http://cn2.php.net/get/php-7. ...

  2. php opcache 坑,PHP7 opcache缓存清理问题

    PHP7 opcache缓存清理问题 背景 OPcache通过opcode的缓存和优化,提供更快的PHP执行过程. 业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展 ...

  3. php编译7教程,PHP7 快速编译安装

    PHP7正式版发布啦, 之前没有安装过的,都来安装试一试 . 即将发布的ThinkPHP5 在PHP7环境下也完全兼容, 佩服鸟哥把兼容性做得这么好 快速编译安装PHP7步骤: 第一步: 安装必要一些 ...

  4. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  5. Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)

    来源:http://blog.csdn.net/liuxinmingcode/article/details/50319145 场景 LNMP  当前版本:PHP 5.5.7  为了体验PHP7的速度 ...

  6. macos 编译php,TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  7. php 编译记录文件,php-7.1编译记录

    编译php-7.1.28步骤 检查环境 ./configure \ --prefix=/u01/server/php-7.1.28 \ --enable-fpm \ --with-fpm-user=d ...

  8. 解决Windows上编译PHP7.1拓展的错误

    转载请注明文章出处:https://tlanyan.me/solve-buil... 接上篇Windows编译PHP7.2拓展,以为编译PHP7.1的拓展应该水到渠成,马到成功.哪知道编译PHP7.1 ...

  9. php7.1 rc,解决Windows上编译PHP7.1拓展的错误

    接上篇Windows编译PHP7.2拓展,以为编译PHP7.1的拓展应该水到渠成,马到成功.哪知道编译PHP7.1拓展出现了新问题,折腾更超7.2. 第一个问题是VC15(visual studio ...

  10. LNMP nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache编译安装+opcache参数详解+opcache可视化php页面代码

    可能要用到的软件: libiconv-1.13.tar.gz  libmcrypt-2.5.8.tar.gz  mcrypt-2.6.8.tar.gz  mhash-0.9.9.9.tar.gz  m ...

最新文章

  1. 虚拟机常用的内存查看与分析工具
  2. B12_Numpy字符串函数(add,multiply,center,capitalize,title,lower,upper,split,join,replace,decode,splitline)
  3. 模拟请求分页式存储管理 ---4种置换算法
  4. android 补签控件,问道手游安卓12月8日维护公告 新增补签功能
  5. 5月TIOBE编程榜,Java、PHP降级,C#再度上升!
  6. 整数返回poj1005——I Think I Need a Houseboat
  7. [SSH] 设置密钥登陆
  8. 第1篇--基于jdk7和jdk8分析 JVM的内存区域
  9. Django实战1-权限管理功能实现-10:用户管理
  10. 基于JavaScript技术完成单击事件完成显示和隐藏
  11. oracle union orderby,Oracle中union 和 order by 的联用
  12. RISCV-MCU启航篇之硬件选择-GD32VF103芯片
  13. Solr(一) Solr 简介及搜索原理
  14. 玄奥八字V5.6 爆破实例2
  15. ftp服务器文件不显示,ftp服务器不显示文件夹大小
  16. 正则表达式中常用符号
  17. 关闭Win10自动更新
  18. iOS16.1RC版发布后 iPhone14 Pro系列机型可以在灵动岛显示球赛比分
  19. 华为相机M系列交叉编译32位openssl
  20. SSL证书过期怎么办?别慌!SSL应急解决方案及注意事项来了

热门文章

  1. Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]
  2. MISRA C-2012规则中文版
  3. Matlab 全局变量定义与使用
  4. c语言缺陷与陷阱,《C语言的缺陷与陷阱》读后总结
  5. Linxu终端远程协助工具termpair
  6. Win10自带的录屏功能怎么使用?
  7. NMF非负矩阵分解算法(Non-negative Matrix Factorization)
  8. wechat 微信ipad协议GO版本 最新不封号 长链接 完整版
  9. java中的各种集合排序
  10. 计算机电子报模板,计算机辅助电气电子线路设计课程设计设计报告排版模板(WIT).doc...