Предварительная обработка PHP для удаления функциональности из встроенных файлов - PullRequest
6 голосов
/ 27 мая 2011

Я читал о 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 ##

Итогда я запускаю две сборки, одну устанавливающую премиум на true, а другую на false, которая генерирует два файла просто:

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

Так что в основном у меня есть папка 'source', в которой я нахожусь, которая содержит подпапку с именем 'folder', и она не воссоздаетни файлы внутри него (test.php)

# 3 Я уверен, что это легко - как я могу заставить его обрабатывать файлы .js и, вероятно, .html простобыть в безопасности?Я имею в виду один звонок.Я предполагаю, что запускать его на .jpg и т. Д. И т. Д. - плохая идея.

Еще раз спасибо!

Ответы [ 6 ]

4 голосов
/ 29 ноября 2012

Извините, что выкопал эту тему, но у меня была такая же потребность, и подход CPP имел слишком много побочных эффектов для моего использования.

Итак, я разработал базовый фильтр препроцессора для phing, который делает свое дело:

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

Фильтр доступен на github: https://github.com/tmuguet/PreProcessorFilter

1 голос
/ 28 мая 2011

Я пришел к идее, ответ до того, как он принят, но я все равно хочу поделиться им. Итак, вот сделка:

Храните все оплаченные функции в отдельных файлах. С помощью класса ловушек вы можете проверять и добавлять функции в нужное вам место. Не включайте платные функции в бесплатную версию сборки. У вас будет 2 архива, но один источник.

Вот очень простой класс 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');

Я знаю, что это очень просто и нужно развиваться многими другими способами. Но если вам удастся это сделать:

  • Вы будете отделять функции. Таким образом, вы можете создавать различные пакеты.
  • Вы проверите функции с классом. Даже если пользователь видит имя функции, это не имеет значения. Потому что он не может видеть код функции.
0 голосов
/ 02 июня 2011

Отказ от ответственности: я абсолютно уверен, что это не самый эффективный способ сделать это!

-

Я делаю это в 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, который я выполняю и ударил - у меня есть мои сборки!

0 голосов
/ 30 мая 2011

Вы можете просто создать такой препроцессор самостоятельно - в PHP есть встроенная поддержка парсинга PHP-файлов: http://www.php.net/manual/en/function.token-get-all.php

Я использовал его для создания обфускатора и должен сказать, что им очень легко пользоваться. Просто распечатайте нужные токены и удалите токены, которые находятся в блоках "## if premium ##".

ОБНОВЛЕНИЕ: Я думаю, что идея препроцессора C лучше. Оставляя этот ответ для полноты, хотя. :)

0 голосов
/ 27 мая 2011

Ну, Phing - это муравей для PHP. Я никогда не использовал Phing, но я предполагаю, что он настроен на такие вещи.

Используйте Phing для создания двух отдельных пакетов: одного премиум-приложения и одного для бесплатного приложения.

Вы также можете использовать Ant, но Ant настроен на Java, а Phing настроен на PHP. Единственная причина, по которой вы можете захотеть использовать Ant поверх Phing, заключается в том, что Ant предоставляет гораздо больше ресурсов, чем Phing. Но, если вы являетесь PHP-магазином, научитесь использовать Phing, если только по резюме это выглядит красиво. ( «Да, я старший разработчик PHP. Я даже знаю Phing» ).

0 голосов
/ 27 мая 2011

Это довольно низкотехнологичный, но, конечно, есть препроцессор C, который делает именно то, что вы хотите;просто наберите пару make-файлов, чтобы вызвать его с помощью find или grep -R, и вы получите простое и понятное решение с синтаксисом, который вы, вероятно, знаете.

Подробнее

Возможно, вы уже установили gcc на любой хост * nix.В противном случае это будет стандартный пакет.Некоторые дистрибутивы предоставляют его отдельно для gcc (например, пакет cpp Debian).

Программа имеет несколько простых инструкций; вики-страница - хорошее начало, а руководство содержит больше деталей, чем вам нужно.По сути, это вопрос вызова его для каждого файла с опцией -E, просто чтобы выполнить обработку макроса, а затем скопировать вывод некоторого каталога сборки.

Вы можете написать однострочный скрипт для этогос помощью find, вдоль строк find <proj dir> -type f -name '*.php' -exec cpp -E -D <FULL or RESTRICTED> {} -o <build dir>/{} \; и ссылки на макросы FULL и RESTRICTED в вашем PHP, например

#ifdef FULL
    <lines for paying customers>
#endif

UPDATE Чтобы пути работали хорошо, попробуйте это:

#!/bin/bash
cd /.../phing/source/
find . -type f -name '*.php' -exec cpp -E -D FULL {} -o ../target/{} \;

Затем ../target/{} следует расширить до ../target/./index.php.

ОБНОВЛЕНИЕ

Добавлено -P для удаления маркеров строки (#1).Добавлена ​​строка для копирования структуры каталогов (# 2).Изменено совпадение имени файла для запуска на js на html (# 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/{} \;
...