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
;关闭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.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 内容如下:
<?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)$/i" , $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-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

后话:
opcache.file_cache是PHP7对hhvm.repo.central.path的反击,鸟哥威武!
opcache.file_cache对比PHP5时代APC的apc_bin_dumpfile和apc_bin_loadfile来说,
导出和导入操作都由opcache完成,显然ZendOpcache比APC更加自动化.
谁能告诉我那个xxx的md5串代表什么?
个人估计这个md5串对应当前PHP版本.
因为Ubuntu上编译的PHP7,打包依赖库后放到CentOS上运行,这个md5串是相同的.

你可能感兴趣的:(PHP7中用opcache.file_cache导出脚本opcode实现源代码保护)