6

私はPhingとAntについて読んでいますが、どちらのツールがこのシナリオに最も役立つかはわかりません。

簡単にデバッグステートメントなどになる可能性がありますが、文字通りのスキャンリオを紹介します。

ダウンロード可能なPHPアプリの無料のプレミアムバージョンがあり、どこかに隠された変数だけを含めてから次のことを行うのではありません。

if($premium == true) {
   echo 'some additional functionality';
} else {
    echo 'basic functionality';
}

明らかに、誰かがソースを取得してその変数を変更し、強打する可能性があります-彼らは私たちのコードを盗んだのです。そして、Ioncubeなどのようなものは私の経験ではまったく扱いにくく、ホスティング会社のサポートは十分ではありません。

私は何かを好むでしょう..おそらくこれに似ています:

## if premium ##
echo 'some additional functionality';
## else ##
echo 'basic functionality';
## endif ##

次に、2つのビルドを実行します。1つはプレミアムをtrueに設定し、もう1つはfalseに設定します。これにより、次の2つのファイルが生成されます。

echo 'some additional functionality';

echo 'basic functionality';

また、ビルドアプリに渡された同じ条件に基づいて、ファイル全体のみを含めることができると非常に役立ちます。

これを行う方法を見つけることはできませんが、可能であれば別のアイデアを受け入れることができます。

ヘルプは素晴らしいでしょう、

アップデート

Cプリプロセッサの使用は素晴らしく、必要なすべてを実行しているように見えます。しかし、次の3つの方法がわかりません。

#1出力ファイルに生成されたコメントを削除する必要があります。以下はそれらの例です。

# 1 "./index.php"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "./index.php"

リンク先のマニュアルページで、これを行う方法の例を見つけられませんでした。

#2検出されたすべてのファイルを再帰的に処理する必要があります。現在のコードを実行すると、エラーが発生します。../target/./folder/test.php: No such file or directory

つまり、基本的には、自分がいる「ソース」フォルダーがあり、「フォルダー」というサブフォルダーが含まれていますが、それもその中のファイルも再作成されません(test.php)

#3これは簡単だと確信しています-安全のために.jsファイルとおそらく.htmlを処理するにはどうすればよいですか?一言で言えば、私は意味します。.jpgなどのファイルで実行するのは悪い考えだと思います。

再度、感謝します!

4

6 に答える 6

4

このトピックを掘り下げて申し訳ありませんが、私には同じニーズがあり、CPPアプローチには私の使用にはあまりにも多くの副作用がありました。

そこで、私はそのトリックを実行するphing用の基本的なプリプロセッサフ​​ィルターを開発しました。

#ifdef premium
  echo 'some additional functionality';
#else
  echo 'basic functionality';
#endif

フィルタはgithubで入手できます:https ://github.com/tmuguet/PreProcessorFilter

于 2012-11-28T20:56:32.423 に答える
1

私はこれが受け入れられる前に答えを思いついたが、とにかくそれを共有したい。だからここに取引があります:

有料の機能はすべて別のファイルに保存します。フッククラスを使用すると、必要な機能を確認して追加できます。ビルドの無料バージョンに有料機能を含めないでください。2つのzipファイルがありますが、1つのソースがあります。

これがあなたを助けるかもしれない非常に単純なフッククラスです:

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');

私はそれが非常に単純であり、他の多くの方法で開発する必要があることを知っています。しかし、あなたがそれを管理できるなら:

  • 機能を分離します。このようにして、さまざまなパッケージを作成できます。
  • クラスで機能を確認します。ユーザーが機能名を見ても構いません。彼は機能のコードを見ることができないからです。
于 2011-05-27T22:47:44.323 に答える
0

それはかなりローテクですが、もちろんあなたが望むことを正確に実行するCプリプロセッサがあります。findいくつかのmakefileを叩いて、またはで呼び出すだけで、grep -Rおそらく知っている構文を使用した、シンプルで理解しやすいソリューションが得られます。

より詳しく

おそらくgcc、*nixホストにすでにインストールされています。それ以外の場合は、標準パッケージになります。一部のディストリビューションでは、toに個別に提供していますgcc(Debianのcppパッケージなど)。

プログラムにはいくつかの簡単な指示があります。wikiページは良いスタートであり、マニュアルには必要以上の詳細があります。基本的に-Eは、マクロ処理を実行するオプションを指定して各ファイルで呼び出し、出力をビルドディレクトリにコピーするだけです。

ワンライナースクリプトを記述してfind <proj dir> -type f -name '*.php' -exec cpp -E -D <FULL or RESTRICTED> {} -o <build dir>/{} \;、PHPのFULLおよびRESTRICTEDマクロの行に沿ってfindを使用して、次のように参照できます。

#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

アップデート

-Pラインマーカーを削除するために追加されました(#1)。ディレクトリ構造をコピーする行を追加しました(#2)。html上のjsで実行するようにファイル名の一致を変更しました(#3)。

#!/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/{} \;
于 2011-05-27T14:15:34.923 に答える
0

ええと、PhingはPHPのAntです。私はPhingを使ったことがありませんが、このようなものに合わせて調整されていると思います。

Phingを使用して、2つの別個のパッケージを作成します。1つはプレミアムアプリ用、もう1つは無料アプリ用です。

Antも使用できますが、AntはJava用に調整されており、PhingはPHP用に調整されています。Ant over Phingを使用する唯一の理由は、AntがPhingよりもはるかに多くのリソースを利用できることです。ただし、PHPショップの場合は、履歴書で見栄えがする以外に、Phingの使用方法を学んでください。(「はい、私は上級PHP開発者です。Phingも知っています」)。

于 2011-05-27T14:55:13.643 に答える
0

このようなプリプロセッサを自分で構築することもできます-PHPには、PHPファイルの解析に対するサポートが組み込まれています:http ://www.php.net/manual/en/function.token-get-all.php

私はそれを使って難読化ツールを作成しましたが、非常に使いやすいと言わざるを得ません。必要なトークンを印刷し、「##ifpremium##」ブロック内にあるトークンを削除するだけです。

更新:Cプリプロセッサのアイデアの方が優れていると思います。ただし、完全を期すためにこの回答を残しておきます。:)

于 2011-05-30T10:27:23.270 に答える
0

免責事項:これがこれを行うための最も効率的な方法ではないと完全に確信しています!

-

私はこれを4つの部分で行います:

  • sourceのディレクトリ構造のクローンを作成しますtarget
  • PHPファイルとJSファイルをからに解析しsourceますtarget
  • すべてのjpg、gif、cssなどのファイルをからsourceにコピーしますtarget
  • cpp呼び出しによって追加されたコメントをすべてのPHPおよびJSファイルから削除しますtarget

-

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ファイルが1つあります-ビルドがあります!

于 2011-06-02T14:36:52.253 に答える