使用bcompiler对PHP文件进行加密的代码

  使用说明:

  //载入函式

  include_once('phpCodeZip.php');

  //建立加密文件(sourceDir要加密的php文件目录,targetDir加密后的文件目录)

  $encryption = new PhoCodeZip('sourceDir','targetDir');

  //执行行加密

  $encryption->zip();

  phpCodeZip.php源码下载

  phpCodeZip.rar

  phpCodeZip.php源码内容

  

复制代码 代码如下:

  /*

  * @license:MIT & GPL

  */

  class PhpCodeZip{

  //欲進行壓縮加密的來源資料夾

  var $sourceDir = '.';

  //進行壓縮加密的存放的資料夾

  var $targetDir = 'tmp';

  //是否進行加密

  var $bcompiler = true;

  //是否去除空白註解斷行

  var $strip = true;

  //來源資料夾檔案路徑陣列

  var $sourcefilePaths = array();

  //目的資料夾檔案路徑陣列

  var $targetPaths = array();

  //進行壓縮加密前的資料夾大小

  var $sizeBeforeZip = null;

  //進行壓縮加密後的資料夾大小

  var $sizeAfterZip = null;

  //斷行的輸出

  var $newline = '';

  /**

  * 建構子

  *

  * @param string $sourceDir 來源資料夾

  * @param string $targetDir 目的資料夾

  * @param boolean $bcompiler 是否進行加密

  * @param boolean $strip 是否去除空白註解斷行

  * @return boolean

  */

  public function PhpCodeZip($sourceDir='.',$targetDir='tmp',$bcompiler=true,$strip=true){

  //配置初始變數

  $this->sourceDir = $sourceDir;

  $this->targetDir = $targetDir;

  $this->bcompiler = $bcompiler;

  //檢查來源資料是否存在

  if(!is_dir($this->sourceDir)){

  die('指定的來源資料夾'.$this->sourceDir.'不存在,請重新設定');

  } else {

  //如果指定的目的資料夾存在,砍掉重練

  if(is_dir($this->targetDir)){

  echo '【初始化目的地資料夾】'.$this->newline.$this->newline;

  $this->cleanDir($this->targetDir,true);

  }

  //建立與來源資料夾結構一樣的目的資料夾

  mkdir($this->targetDir,0777);

  $dir_paths = $this->getPaths($this->sourceDir,'*',GLOB_ONLYDIR);

  foreach($dir_paths as $key => $path){

  $path = explode('/',$path);

  $path[0] = $this->targetDir;

  echo '=> '.join('/',$path).$this->newline;

  mkdir(join('/',$path),0777);

  }

  //取得來源資料夾的檔案路徑清單

  $this->sourcefilePaths = $this->getPaths($this->sourceDir,'*');

  //配對應目的地的檔案路徑清單

  foreach($this->sourcefilePaths as $key => $path){

  //設定目的資料夾檔案路徑

  $path = explode('/',$path);

  $path[0] = $this->targetDir;

  $this->targetPaths[$key] = join('/',$path);

  }

  //記錄執行前的資料夾大小

  $this->sizeBeforeZip = $this->getSizeUnit($this->getDirSize($this->sourceDir),2);

  echo $this->newline.$this->newline;

  }

  }

  /**

  * 進行壓縮加密

  * @return boolean

  */

  public function zip(){

  $this->newline = '';

  echo '【開始進行加密程序】(資料夾大小:'.$this->sizeBeforeZip.')'.$this->newline.$this->newline;

  //將來源檔案進行壓縮

  foreach($this->sourcefilePaths as $key => $path){

  if(is_file($path)){

  //取得檔案資訊

  $pathInfo = pathInfo($path);

  echo '讀取來源檔:'.$path.$this->newline;

  //取得壓縮後的內容

  echo '=>去除空白註解..........';

  if($this->strip && $pathInfo['extension'] == 'php'){

  $fileAterZip = php_strip_whitespace($path);

  } else {

  $fileAterZip = file_get_contents($path);

  }

  echo '完畢'.$this->newline;

  //取壓縮後的內容寫到目的位置

  $fp = fopen($this->targetPaths[$key],'w+');

  echo '=>寫入目的檔..........';

  fwrite($fp,$fileAterZip);

  fclose($fp);

  echo '完畢'.$this->newline;

  //是否若選擇進行加密

  if($this->bcompiler && $pathInfo['extension'] == 'php'){

  echo '=>加密原始檔..........';

  //複製原始檔

  $fh = fopen($this->targetPaths[$key].'encrypt.php', "w");

  bcompiler_write_header($fh);

  bcompiler_write_file($fh, $this->targetPaths[$key]);

  bcompiler_write_footer($fh);

  fclose($fh);

  //刪除未加密的原始檔

  unlink($this->targetPaths[$key]);

  //重新命名加密過後的檔案

  rename($this->targetPaths[$key].'encrypt.php',$this->targetPaths[$key]);

  echo '完畢'.$this->newline;

  }

  echo $this->newline.$this->newline;

  }

  }

  //重新計算壓縮加密後的資料夾大小

  $this->sizeAfterZip = $this->getSizeUnit($this->getDirSize($this->targetDir),2);

  echo '【結束加密程序】'.$this->newline.$this->newline;

  echo '《報告資訊》'.$this->newline;

  echo '來源資料夾:'.$this->sourceDir.'('.$this->sizeBeforeZip.')'.$this->newline;

  echo '目的資料夾:'.$this->targetDir.'('.$this->sizeAfterZip.')'.$this->newline;

  echo '檔案大小增幅:+'.$this->getSizeUnit(($this->getDirSize($this->targetDir) - $this->getDirSize($this->sourceDir))).$this->newline;

  echo '檔案總數:'.count($this->sourcefilePaths).'個'.$this->newline;

  }

  /**

  * 刪除目錄夾所有檔案

  *

  * @param string $dir 欲刪除的資料夾

  * @param boolean $deleteSelf 同時刪除資料夾

  * @return void

  */

  private function cleanDir($dir='.',$deleteSelf=true){

  if(!$dh = @opendir($dir)) return;

  while (($obj = readdir($dh))) {

  if($obj=='.' || $obj=='..') continue;

  if (!@unlink($dir.'/'.$obj)) $this->cleanDir($dir.'/'.$obj, true);

  }

  if ($deleteSelf){

  closedir($dh);

  @rmdir($dir);

  }

  }

  /**

  * 取得資料夾的總檔案大小

  *

  * @param string $dir 欲剖析的資料夾

  * @return int 位元組

  */

  private function getDirSize($dir='.'){

  //取得檔案路徑清單

  $filePaths = $this->getPaths($dir,'*');

  //初始化計數器

  $sizeCounter = 0;

  foreach($filePaths as $key => $path){

  $sizeCounter = $sizeCounter + filesize($path);

  }

  return ($sizeCounter);

  }

  /**

  * 取得資料夾所有配對的路徑

  *

  * @param string $start_dir 欲剖析的資料夾

  * @return array 檔案路徑陣列

  */

  private function getPaths($sDir, $sPattern, $nFlags = NULL){

  $sDir = escapeshellcmd($sDir);

  $aFiles = glob("$sDir/$sPattern", $nFlags);

  foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir) {

  $aSubFiles = $this->getPaths($sSubDir, $sPattern, $nFlags);

  $aFiles = array_merge($aFiles, $aSubFiles);

  }

  return $aFiles;

  }

  /**

  * 檔案大小單位轉換函式

  *

  * @param int 檔案大小

  * @param int 小數點位數

  * @param boolean 是否要將資料切成陣列

  * @return mix 字串或陣列

  */

  public function getSizeUnit($size,$decimal=2,$split=false){

  //設定單位序列

  $unit = array('Bytes','KB','MB','GB','TB','PB','EB','ZB','YB');

  //初始化索引

  $flag = 0;

  //進行簡化除算

  while($size >= 1024){

  $size = $size / 1024;

  $flag++;

  }

  //是否要將數值與單位分開

  if($split){

  $sizeUnit = array(

  'size' => number_format($size,$decimal),

  'unit' => $unit[$flag]

  );

  } else {

  $sizeUnit = (number_format($size,$decimal)).$unit[$flag];

  }

  //回傳大小與單位

  return ($sizeUnit);

  }

  }