php7 opcache 编译,PHP7中用opcache.file_cache导出脚本opcode实现源代码保护
停止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实现源代码保护相关推荐
- php7 daemon,编译PHP7
PHP7 PHP7都出了,自然我是要安装的,上次写的那个编译开发环境并没有针对性的说PHP,就这次说清楚吧. Download $ wget http://cn2.php.net/get/php-7. ...
- php opcache 坑,PHP7 opcache缓存清理问题
PHP7 opcache缓存清理问题 背景 OPcache通过opcode的缓存和优化,提供更快的PHP执行过程. 业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展 ...
- php编译7教程,PHP7 快速编译安装
PHP7正式版发布啦, 之前没有安装过的,都来安装试一试 . 即将发布的ThinkPHP5 在PHP7环境下也完全兼容, 佩服鸟哥把兼容性做得这么好 快速编译安装PHP7步骤: 第一步: 安装必要一些 ...
- TODO:macOS编译PHP7.1
TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...
- Centos+Nginx+PHP7.0编译安装(和PHP5.6老版本共存)
来源:http://blog.csdn.net/liuxinmingcode/article/details/50319145 场景 LNMP 当前版本:PHP 5.5.7 为了体验PHP7的速度 ...
- macos 编译php,TODO:macOS编译PHP7.1
TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...
- php 编译记录文件,php-7.1编译记录
编译php-7.1.28步骤 检查环境 ./configure \ --prefix=/u01/server/php-7.1.28 \ --enable-fpm \ --with-fpm-user=d ...
- 解决Windows上编译PHP7.1拓展的错误
转载请注明文章出处:https://tlanyan.me/solve-buil... 接上篇Windows编译PHP7.2拓展,以为编译PHP7.1的拓展应该水到渠成,马到成功.哪知道编译PHP7.1 ...
- php7.1 rc,解决Windows上编译PHP7.1拓展的错误
接上篇Windows编译PHP7.2拓展,以为编译PHP7.1的拓展应该水到渠成,马到成功.哪知道编译PHP7.1拓展出现了新问题,折腾更超7.2. 第一个问题是VC15(visual studio ...
- 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 ...
最新文章
- 虚拟机常用的内存查看与分析工具
- B12_Numpy字符串函数(add,multiply,center,capitalize,title,lower,upper,split,join,replace,decode,splitline)
- 模拟请求分页式存储管理 ---4种置换算法
- android 补签控件,问道手游安卓12月8日维护公告 新增补签功能
- 5月TIOBE编程榜,Java、PHP降级,C#再度上升!
- 整数返回poj1005——I Think I Need a Houseboat
- [SSH] 设置密钥登陆
- 第1篇--基于jdk7和jdk8分析 JVM的内存区域
- Django实战1-权限管理功能实现-10:用户管理
- 基于JavaScript技术完成单击事件完成显示和隐藏
- oracle union orderby,Oracle中union 和 order by 的联用
- RISCV-MCU启航篇之硬件选择-GD32VF103芯片
- Solr(一) Solr 简介及搜索原理
- 玄奥八字V5.6 爆破实例2
- ftp服务器文件不显示,ftp服务器不显示文件夹大小
- 正则表达式中常用符号
- 关闭Win10自动更新
- iOS16.1RC版发布后 iPhone14 Pro系列机型可以在灵动岛显示球赛比分
- 华为相机M系列交叉编译32位openssl
- SSL证书过期怎么办?别慌!SSL应急解决方案及注意事项来了
热门文章
- Python基于OpenCV的工作疲劳检测系统[源码&UI界面&部署教程]
- MISRA C-2012规则中文版
- Matlab 全局变量定义与使用
- c语言缺陷与陷阱,《C语言的缺陷与陷阱》读后总结
- Linxu终端远程协助工具termpair
- Win10自带的录屏功能怎么使用?
- NMF非负矩阵分解算法(Non-negative Matrix Factorization)
- wechat 微信ipad协议GO版本 最新不封号 长链接 完整版
- java中的各种集合排序
- 计算机电子报模板,计算机辅助电气电子线路设计课程设计设计报告排版模板(WIT).doc...