预处理PHP以从内置文件中删除功能

|| 我一直在阅读有关Phing和Ant的内容,我不确定这些工具中哪一个对这种情况最有用。 它很可能是调试语句等,但我将为您提供字面意义的scanario。 我们有一个免费和高级版本的可下载PHP应用程序,而不是仅包含一个隐藏在某个地方的变量,然后执行以下操作:
if($premium == true) {
   echo \'some additional functionality\';
} else {
    echo \'basic functionality\';
}
显然,然后有人可以获取源代码并更改该变量,然后爆炸-他们已经窃取了我们的代码。根据我的经验,像Ioncube之类的东西完全是笨拙的,对托管公司的支持还不够好。 我更喜欢一些..也许与此类似:
## if premium ##
echo \'some additional functionality\';
## else ##
echo \'basic functionality\';
## endif ##
然后,我将运行两个构建,一个将premium设置为true,另一个将false设置为false,这将生成两个简单的文件:
echo \'some additional functionality\';
echo \'basic functionality\';
根据传递给构建应用程序的相同条件仅包含整个文件也将非常有帮助。 我找不到解决方法,但我愿意接受其他可能的选择。 帮助会很出色, 更新 使用C预处理器很棒,看起来它可以满足我的所有需求。但是,我找不到以下三件事。 #1我需要删除生成到输出文件中的注释。以下是这些示例。
# 1 \"./index.php\"
# 1 \"<built-in>\"
# 1 \"<command-line>\"
# 1 \"./index.php\"
在您链接到的手册页中,我没有找到如何执行此操作的示例。 #2我需要使它递归地遍历每个发现的文件。当我运行当前代码时,出现错误:
../target/./folder/test.php: No such file or directory
所以基本上我有一个\'source \'文件夹,它包含一个名为\'folder \'的子文件夹,它不会重新创建该文件夹,也不会重新创建其中的文件(test.php) #3我确定这很容易-我怎样才能安全地处理.js文件和.html文件?在一个电话中,我的意思是。我认为在.jpg等文件上运行它是一个坏主意。 再次感谢!     
已邀请:
        它的技术水平很低,但是当然有C预处理程序可以完全满足您的要求。只需敲入几个makefile即可使用
find
或ѭ7call进行调用,您将获得一个简单,易于理解的解决方案,并使用可能知道的语法。 更多详情 您可能已在任何* nix主机上安装了
gcc
。否则,它将成为标准包装。一些发行版将其单独提供给
gcc
(例如Debian的cpp软件包)。 该程序有一些简单的指令; Wiki页面是一个好的开始,并且手册中包含了比您需要更多的详细信息。基本上,只需要使用
-E
选项在每个文件上调用它就可以进行宏处理,然后将输出复制到某个构建目录即可。 您可以编写单行脚本以使用find11ѭ的代码行进行查找,并引用PHP中的FULL和RESTRICTED宏,例如
#ifdef FULL
    <lines for paying customers>
#endif
更新为使路径正常工作,请尝试以下操作:
#!/bin/bash
cd /.../phing/source/
find . -type f -name \'*.php\' -exec cpp -E -D FULL {} -o ../target/{} \\;
然后应将
../target/{}
扩展为
../target/./index.php
。 更新 添加了ѭ16来删除行标记(#1)。添加了一行以复制目录结构(#2)。更改文件名匹配以在html(#3)上的js上运行。
#!/bin/bash
cd /.../phing/source/
find . -type d -exec mkdir -p ../target/{} \\;
find . -type f -regex \'.*\\.(php|html|js)\' -exec cpp -E -P -D FULL {} -o ../target/{} \\;
    
        抱歉,我深究了这个话题,但是我有同样的需求,CPP方法有太多副作用供我使用。 因此,我开发了用于phing的基本预处理器过滤器,该过滤器可实现此功能:
#ifdef premium
  echo \'some additional functionality\';
#else
  echo \'basic functionality\';
#endif
该过滤器可在github上找到:https://github.com/tmuguet/PreProcessorFilter     
        我想出了一个主意,答案在被接受之前还是可以分享的。所以这里是交易: 将所有付费功能存储在单独的文件中。使用挂钩类,您可以检查并在所需位置添加功能。不包括免费版本的付费功能。您将有2个zip文件,但只有一个源。 这是一个非常简单的Hook类,可以帮助您:
Class Hook {
    var $features_enabled;
    public function __construct() {
        // Construction codes goes here.
        // You can check features files. If there is, require them once
        // if there isnt any, define a variable:
        if (file_exists(\"./features/feature1.php\")) {
            require_once \'./features/feature1.php\';

            // set this true. so we can check the features and run it
            $this->features_enabled = TRUE;
        }
        else {
            // there is no feature avaliable. So there is no need to check functions.
            $this->features_enabled = FALSE;
        }
    }

    /**
     * Check the Feature.
     *
     * @param string The feature name
     * @param array|string|... The arguments that you want to pass.
     */
    public function check($feature_name, $args = NULL) {
        // if features cannot be included on constructor, do not need to check.
        if ($this->features_enabled == FALSE)
            return;

        // if feature is a function: check it then run it
        if (function_exists($feature_name))
            $feature_name($args);

        // if feature is a Class: create it then return it.
        if (class_exists($feature_name))
            return new $feature_name($args);
    }
}
然后,您可以在代码中的任何位置检查它们。例:
$hook = new Hook();

//.... Codes goes here.

// This will check for a function of class. If there is, execute it
$hook->check(\'feature_badges\');
我知道它非常简单,需要以许多其他方式进行开发。但是,如果您可以管理它: 您将分离功能。这样,您可以创建不同的程序包。 您将通过类检查功能。即使用户看到功能名称,也没关系。因为他看不到功能的代码。     
好吧,Phing是PHP的蚂蚁。我从未使用过Phing,但我认为它已针对此类内容进行了调整。 使用Phing创建两个单独的软件包:一个高级应用程序,一个用于免费应用程序。 您也可以使用Ant,但是针对Java调整了Ant,而针对PHP调整了Phing。您可能想在Phing上使用Ant的唯一原因是,与Phing相比,Ant有更多的可用资源。但是,如果您是PHP商店,请学习使用Phing,除了在履历表上看起来不错之外,别无其他。 (\“是的,我是高级PHP开发人员。我什至知道Phing \”)。     
        您可以自己构建这样的预处理器-PHP内置了对PHP文件解析的支持:http://www.php.net/manual/en/function.token-get-all.php 我用它来构建混淆器,必须说它非常易于使用。只需打印所需的令牌,然后删除\“ ##(如果有高级## \”块)内的令牌。 更新:我猜C预处理器的主意更好。不过,请保留此答案的完整性。 :)     
        免责声明:我完全可以肯定这不是最有效的方法! - 我分为四个部分: 在
target
中克隆
source
目录结构 将and21ѭ的PHP和JS文件解析为
target
source
复制到
target
的所有jpg,gif,css等文件 从ѭ22中的所有PHP和JS文件中删除cpp调用添加的注释。 -
find ./ -type d -exec mkdir ../target/{} \\;
find ./ -regextype posix-awk -regex \"(.*.php|.*.js)\" -exec cpp -E -D COMMERCIAL {} -o ../target/{} \\;
find ./ -type f -regextype posix-extended -regex \"(.*.jpg|.*.gif|.*.png|.*.css|.*.html|.*.txt|.*.xml|.*.ttf)\" -exec cp -p --parents \"{}\" ../target \\;
cd ../target
find ./ -regextype posix-awk -regex \"(.*.php|.*.js)\" -exec sed -i ./{} -e \'s/#.*//;/^\\s*$/d\' \\;
- 就像我说的那样,我确定这不是很低效,但是我执行并爆炸了一个.sh文件-我有我的构建!     

要回复问题请先登录注册