一、大體流程圖

二、PHP 專案檔案加密

 下表列出了Zend產品中的PHP版本及其內部API版本和Zend產品版本。

如何加密請往後看

三、如何使用

第一步:確認當前環境 Amai Phalcon 前,請確認您具備以下兩個條件,如果您的環境不滿足此條件,建議您對系統環境進行重新配置。

條件1:PHP版本在5.5.X以上(必須為NTS)

條件2:必須安裝ZendGuardLoader

第二步:生成機器碼,機器碼是授權檔案的重要組成部分,每一臺伺服器都有一個獨立的機器碼,您只需執行由 我們所提供的機器碼生成工具來獲取您的機器碼即可。

注: 每一臺伺服器的機器碼都是獨立的,如果您 是需要將 ECstore 部署在多臺伺服器上, 您需要生成多個機器碼 在windows/linux終端執行hardware.sh,獲取機器碼如圖:

(1)Windows 環境

(2)Linux 環境

第三步:申請授權檔案,在郵件中,寫入您的機器碼與您的公司名稱,以郵件形式傳送至[email protected] 進行申請授權檔案。郵件標題以“申請ego license授權檔案”註明

第四步:獲取授權檔案及部署

  1. 如果您提供的資訊有效,您將會以郵件形式獲取到您的license授權檔案:“license.zl” 把該檔案放入在ecstore安裝目錄下  

  2. 編輯php.ini檔案,搜尋‘zend_loader.license_path’  

  3. 加上zend_loader.license_path=‘Phalcon Web 安裝目錄/license.zl’  

  4. 重啟web server  

  5. 通過瀏覽器開啟您的網店地址,這就表示您的 license 授權檔案安 裝成功,可繼續進行安裝  

  6. 完成後記:如果您的研發人員需要在本地進行開發,我們為您提供針對研發人員本地開發的 license檔案:“developer.zl”,開人人員無需進行申請,直接部署在自己的電腦上開發即可。

  本地開發license檔案位置:Phalcon 目錄下developer.zl

 第五步:很遺憾,PHP 的Phalcon框架暫時不支援加密,一下為官方郵件(該郵件為20170512官方回覆)

===========Windows 環境測試 ============================

安裝要求:

  1、php版本 < 5.6

  2、把加密的php檔案上傳到伺服器上看看效果,提示php檔案採用了Zend Guard加密,需要安裝Zend Loader/ZendOptimizer

  3、Zend Guard Loader 僅支援NTS

  4、修改php.ini檔案

  5、重啟伺服器

詳細步驟:

2、phpStudy 安裝,將下載好後解壓壓縮包zend-loader-php5.6-windows-x86_update1.zip ,找到目錄下的 ZendLoader.dll 檔案,將它放到你的php目錄下ext下,再編輯php.ini檔案,新增一段程式碼(如):

在這裡編輯:E:\phpStudy\php\php-5.6.27-nts\php.ini

[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3
zend_loader.license_path=""
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"
.

選擇一個php5.6 的非安全執行緒去啟動

執行phpinfo(),會看到如下資訊:

4、測試程式碼,就以ThinkPhp5.0 的官方程式碼為案例進行測試

  加密前的程式碼檔案:thinkphp_5_full

  加密後的程式碼檔案:thinkphp_5_full_encode

使用Visual Studio Code 分別開啟加密前和加密後的程式碼專案:thinkphp_5_full

通過瀏覽器訪問頁面效果:

thinkphp_5_full_encode

可以看出已被加密成二進位制檔案了,不能開啟,通過瀏覽器訪問則是正常的

注意:把加密後的程式碼放在專案目錄中,如使用了ZendGuard加密的PHP程式碼的網站,而沒有安裝Zend Guard Loader,就會出現下圖錯誤(Zend Guard Run-time support missing!):

 安裝遇到的坑

分析原因:由於我安裝的php 版本為TS ,意思就是安全執行緒,Windows版的PHP從版本5.2.1開始有Thread Safe和NoneThread Safe之分。

【1】Thread Safe是執行緒安全,執行時會進行執行緒(Thread)安全檢查,以防止有新要求就啟動新執行緒的CGI執行方式而耗盡系統資源。

【2】Non Thread Safe是非執行緒安全,在執行時不進行執行緒(Thread)安全檢查。

Thread Safety : enable 是不能安裝 ZendLoader.dll 的(Installing Zend Guard Loader for any PHP-NTS distribution)不安執行緒成才可以的

許可認證為空 

修改配置引數:(禁用修改為不禁用),重啟伺服器即可

zend_loader.disable_licensing=1 修改為:zend_loader.disable_licensing=0

完整配置:

[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\php\php-5.6.27-nts\WWW/tp52.zl"
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"

參考文獻:

======================啟用許可認證license======================

需要先生成一個 license.zl,然後把該檔案配置到php.ini 檔案中

 選擇正確的PHP 版本,很重要的哦

 

 選擇安全,配置license,注意:第四步的 名稱和編碼的要一樣哦(ThinkPHP-Encode-License)

最後生成的加密檔案(二進位制檔案)

複製該檔案到專案目錄下去

瀏覽器訪問:

說明:以上提示表示沒有配置 license路徑,於是提示php警告,這時候我們檢視配置檔案php.ini

[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\WWW/Product_TP5.zl"
zend_extension="E:\phpStudy\php\php-5.6.27-nts\ext\ZendLoader.dll"

也就是以上紅色部分檔案載入的檔案不是方才生成的檔案,修改為以下配置(剛才生成的檔案),重啟伺服器

zend_loader.license_path="E:\phpStudy\WWW/ThinkPHP-Encode-License.zl"

 

重新整理剛才訪問的網頁檔案,就可以正常訪問了

在這裡用的是試用版,有一下問題

1、加密的程式碼不會優化;

2、加密的檔案14天后過期;

3、如果使用license授權,license 3天后過期。

============== Linux 安裝測試====================

2、一定要是NTS

3、下面使用連個專案對比測試加密效果

【1】專案名稱:thinkphp_5_full  Nginx配置埠號:8080

nginx.conf配置檔案:

    # thinkphp_5_full
    server {
        listen       8080;
        server_name  127.0.0.1;

        set $root_path /home/www/thinkphp_5_full/public;
        root $root_path;
        index  index.php index.html;

        location / {
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

通過瀏覽器訪問8080埠,訪問正常

【2】專案名稱:ThinkPHP-Encode-License 埠號:8088  配置檔案:nginx.conf

    # ThinkPHP-Encode-License
    server {
        listen       8088;
        server_name  127.0.0.1;

        set $root_path /home/www/ThinkPHP-Encode-License/public;
        root $root_path;
        index  index.php index.html;

        location / {
            if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=/$1  last;
                break;
            }
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

瀏覽器訪問8088埠,訪問已被加密不可以訪問

 

編輯配置檔案:vim /etc/php5/fpm/php.ini

[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="/home/www/ThinkPHP-Encode-License.zl"
zend_extension="/home/www/zend-loader-php5.5-linux-x86_64/ZendGuardLoader.so"

phpinfo() 檢視是否安裝成功

安裝成功後還是不能夠訪問:

Nginx 錯誤日式

2017/05/23 10:34:59 [error] 5503#0: *9 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Incompatible file format:  The encoded file has format major ID 7,
whereas the Loader expects 6 in /home/www/ThinkPHP-Encode-License/public/index.php on line 0" while reading response header from upstream,

為什麼這樣子來!PHP加密時候的版本問題嗎啊?昨天是5.6 呀,今天在Linux 的是5.5 呀。怎麼可以使用昨天的來除錯這個來,,,,無語.............. 新建個工程:ThinkPHP-Encode-License-5.5

這時候先切換到windows ,同時改變php 版本為5.5,我們寫個test.php 檔案進行測試

訪問專案還是一個吊樣啊!不行啊!大哥

你是載入錯誤的許可認證嗎?一看配置檔案,空的呀!原始切換檔案就是什麼都沒有了

擴充套件都沒安裝,怎麼可鞥?

 去官方在下載個5.5 版本的倒騰下 

[Zend.loader]
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="E:\phpStudy\WWW/ThinkPHP-Encode-License-5.5.zl"
zend_extension="E:\phpStudy\php\php-5.5.38\ext\ZendLoader.dll"

日誌報錯:

astCGI sent in stderr: "PHP message: PHP Fatal error:  Incompatible file format:  The encoded file has format major ID 7, whereas the Loader expects

 看來是這個加密工具版本的為題了:Zend Guard 7 (64-bit) ,仔細琢磨,原來我一直加密使用的PHP版本是php5.6 版本,這個前面已經說過了的,如圖所示:

在這裡我們在重新加密一次。記得這次一定要選php5.5 版本(linux 安裝的php 版本為5.5.9)

最後生成的檔案上傳到Nginx伺服器目錄,修改配置檔案

(1)vim /usr/local/nginx/conf/nginx.conf

set $root_path /home/www/ThinkPHP-Encode-License-5.5/public;
root $root_path;

(2)vim /etc/php5/fpm/php.ini

[Zend.loader]
zend_extension="/home/www/ZendGuardLoader.so"
zend_extension="/home/www/opcache.so"
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path="/home/www/ThinkPHP-Encode-License-5.5.zl"

重啟php5-fpm 和Nginx,開啟頁面檢視,已經OK

 在這裡為了測試,給一個錯誤的許可認證檔案 ThinkPHP-Encode-License-5.5-error.zl

zend_loader.license_path="/home/www/ThinkPHP-Encode-License-5.5-error.zl"

可以看出Nginx直接報錯

錯誤日誌:

[error] 7091#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 58.101.3.167, server: 127.0.0.1, 
request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:",

重新配置回原來正確的許可認證,則可以正常訪問啦

注: 每一臺伺服器的機器碼都是獨立的,如果您 是需要將 ECstore 部署在多臺伺服器上, 您需要生成多個機器碼 在windows/linux終端執行hardware.sh,獲取機器碼如圖:

指令碼檔案:hardware.sh

#!/usr/bin/env php
<?php
    function command_hardware()
    {
        if(function_exists('zend_loader_enabled') && zend_loader_enabled())
        {
            foreach (zend_get_id() as $hardware) {
                echo $hardware, "\n";
            }
        } else {
            echo 'zend guard loader not installed or not enabled!';
            exit;
        }
    }
command_hardware();

Linux 下面 ,在這裡為cli 模式,所以別忘記給cli 模式的配置檔案也安裝ZendLoader 擴充套件庫,否則報錯:zend guard loader not installed or not enabled!

windows 下面

PHP CLI 命令列 執行加密檔案可能出現的問題

加密主機號

***************針對Linux 環境 Phalcon框架擴充套件和Zend Guard Loader 擴充套件衝突的問題*******

以上測試PHP配置檔案是沒有安裝Phalcon擴充套件,一點安裝Phalcon擴充套件,啟動Nginx則會直接報錯

配置 vim /etc/php5/fpm/php.ini 新增一下內容:

[Zend.loader]
zend_extension="/usr/lib/php5/ZendGuardLoader.so"
zend_extension="/usr/lib/php5/20121212/opcache.so"
zend_loader.enable=1
zend_loader.disable_licensing=1
zend_loader.obfuscation_level_support=3

重啟 php-fmp 出現一下錯誤頁面資訊

 

Nginx錯誤日誌:"GET /info.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:"

註釋掉上面/etc/php5/fpm/php.ini 的內容,重啟php-fmp 繼續測試,可以正常顯示

 總結:如果安裝Phalcon 擴充套件則在 /etc/php5/fpm/php.ini 新增 zend_extension 擴充套件則會出現問題

 以上都是自己踩的坑啊!

-----------------------正式開始》》》》》》》》》》》》》》》》

我們看看Phalcon擴充套件檔案新增在那裡了,原來在這個資料夾下面

[email protected]:/home/www# find / -name phalcon.so
/usr/lib/php5/20121212/phalcon.so

我們複製 ZendGuardLoader.so 到/usr/lib/php5/20121212 資料夾下面

[email protected]:/home/www# cp /usr/lib/php5/ZendGuardLoader.so /usr/lib/php5/20121212/ZendGuardLoader.so
[email protected]:/home/www# cd /usr/lib/php5/20121212/
[email protected]:/usr/lib/php5/20121212# ls
curl.so  gd.so  json.so  ldap.so  mysqli.so  mysql.so  opcache.so  pdo_mysql.so  pdo.so  phalcon.so  readline.so  redis.so  ZendGuardLoader.so

當然了這是php5.5.9 和php7不一樣了,老規矩,新建檔案vim /etc/php5/mods-available/zend-loader.ini 新增以下內容

cd /etc/php5/mods-available 

vim zend-loader.ini

[zend.loader]
zend_extension=ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=2
zend_loader.license_path="/home/www/thinkphp_5-encode-5.5.zl"

切換到目錄/etc/php5/fpm/conf.d 做一個軟連線檔案(sudo ln -s 原始檔 目標檔案)

ln -s ../../mods-available/zend-loader.ini 02-zend-loader.ini

重啟php-fmp 繼續測試,nginx沒有報錯

配置檔案載入的資訊