Предварительная обработка 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 ## 

И тогда я бы запустил две сборки, один установил премиум для 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», в которой я находилась, которая содержит подпапку под названием «папка», и она не воссоздает это, ни файлы внутри нее (test.php)

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

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

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

Более детально

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

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

Вы можете написать однострочный скрипт для поиска с помощью поиска 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 

ОБНОВЛЕНИЕ Чтобы сделать дорожки работать хорошо, попробуйте это:

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

Затем ../target/{} следует развернуть на ../target/./index.php .

ОБНОВИТЬ

Добавлен -P для удаления linemarkers (# 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/{} \; 

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

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

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

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

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

Храните все оплаченные функции в отдельных файлах. С помощью класса hook вы можете проверить и добавить нужные функции. Не включайте оплаченные функции в бесплатную версию сборки. У вас будет 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 – это Ant для PHP. Я никогда не пользовался Phing, но я предполагаю, что он настроен на такие вещи.

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

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

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

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

UPDATE: Я думаю, что идея препроцессора C лучше. Однако оставить этот ответ за полноту. 🙂

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

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