Preprocessamento de PHP para remover funcionalidades de arquivos incorporados

Eu tenho lido sobre Phing e Ant e não tenho certeza de qual, se também, essas ferramentas são mais úteis para esse cenário.

Poderia facilmente ser declarações de debugging etc, mas eu vou lhe dar o nosso scanario literal.

Temos uma versão gratuita e premium de um aplicativo PHP para download e, ao invés de include apenas uma variável escondida em algum lugar e, em seguida, fazer:

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

Obviamente, alguém poderia então tirar a fonte e mudar essa variável, e bang – eles roubaram nosso código. E algo como o Ioncube, etc, é totalmente incomum na minha experiência e o apoio às empresas de hospedagem não é suficientemente bom.

Preferiria algo … talvez parecido com isso:

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

E então eu executaria duas compilações, uma configuração de premium para true e uma para false, o que geraria dois arquivos de simplesmente:

 echo 'some additional functionality'; 

e

 echo 'basic functionality'; 

Também seria muito útil poder include apenas arquivos inteiros com base nessa mesma condição passada para o aplicativo de compilation.

Não consigo encontrar uma maneira de fazer isso, mas estou aberto a quaisquer idéias alternativas, se possível.

A ajuda seria excelente

ATUALIZAR

Usar o préprocessador C é ótimo e parece que ele faz tudo o que preciso. No entanto, não consigo encontrar como fazer as seguintes 3 coisas.

# 1 Preciso remover os comentários gerados nos arquivos de saída. Abaixo está um exemplo disso.

 # 1 "./index.php" # 1 "" # 1 "" # 1 "./index.php" 

Não encontrei um exemplo de como fazer isso na página do manual que você me ligou.

# 2 Preciso fazer de forma recursiva todo arquivo descoberto. Quando eu executo meu código atual, recebo um erro: ../target/./folder/test.php: No such file or directory

Então, basicamente, tenho minha pasta “fonte” na qual estou inserido, que contém uma subpasta chamada ‘pasta’ e não a recria, nem os arquivos dentro dela (test.php)

# 3 Tenho certeza de que isso é fácil – como posso obtê-lo para processar arquivos .js e, provavelmente, .html apenas para estar seguro também? Em uma binding, quero dizer. Eu suponho executá-lo em arquivos .jpg etc etc é uma má idéia …

Obrigado novamente!

É muito pouco tecnológico, mas há, claro, o préprocessador C que faz exatamente o que você deseja; Apenas bang em alguns makefiles para chamá-lo com find ou grep -R e você obtém uma solução simples e fácil de entender com a syntax que você provavelmente conhece.

Mais detalhes

Provavelmente, o gcc já está instalado em qualquer host * nix. Caso contrário, será um pacote padrão. Algumas distribuições fornecem separadamente para o gcc (como o pacote cpp do Debian).

O programa possui algumas instruções simples; A página wiki é um bom começo e o manual tem mais detalhes do que você precisa. Basicamente, é uma questão de chamá-lo em cada arquivo com a opção -E apenas para fazer o processamento de macro e, em seguida, copiando o diretório de saída de criação.

Você pode escrever um script one-liner para fazer isso com find, junto das linhas de find -type f -name '*.php' -exec cpp -E -D {} -o /{} \; e faça referência às macros COMPLETAS e RESTRINGIDAS no seu PHP, como

 #ifdef FULL  #endif 

ATUALIZAÇÃO Para que os caminhos funcionem bem, experimente isso:

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

Então ../target/{} deve ser expandido para ../target/./index.php .

ATUALIZAR

Adicionado -P para remover os linemarkers (# 1). Adicionado uma linha para copiar a estrutura do diretório (# 2). Alterou o nome do arquivo para executar no js no 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/{} \; 

Desculpe por desenterrar este tópico, mas tive a mesma necessidade e a abordagem CPP teve muitos efeitos colaterais para o meu uso.

Então eu desenvolvi um filtro básico de pré-processador para phing que faz o truque:

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

O filtro está disponível no github: https://github.com/tmuguet/PreProcessorFilter

Eu vi uma idéia, a resposta antes disso é aceita, mas eu quero compartilhá-lo de qualquer maneira. Então, aqui está o negócio:

Armazene todos os resources pagos em arquivos separados. Com uma class de gancho, você pode verificar e adicionar os resources onde deseja. Não inclua os resources pagos na versão gratuita da compilation. Você terá 2 arquivos zip, mas uma fonte.

Aqui é uma class de Hook muito simples que pode ajudá-lo:

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

Então você pode verificá-los em qualquer lugar em seu código. Exemplo:

 $hook = new Hook(); //.... Codes goes here. // This will check for a function of class. If there is, execute it $hook->check('feature_badges'); 

Eu sei que é muito simples e precisa se desenvolver de muitas outras maneiras. Mas se você pode gerenciá-lo:

  • Você irá separar os resources. Desta forma, você pode criar diferentes pacotes.
  • Você verificará os resources com a class. Mesmo que o usuário veja o nome do recurso, não importa. Porque ele não pode ver o código do recurso.

Bem, Phing é o Ant for PHP. Nunca usei o Phing, mas suponho que esteja sintonizado com coisas assim.

Use Phing para criar dois pacotes separados: um aplicativo premium e um para o aplicativo gratuito.

Você também pode usar Ant, mas Ant é sintonizado para Java, enquanto o Phing está sintonizado para o PHP. A única razão pela qual você quer usar o Ant sobre o Phing é que há muito mais resources disponíveis para Ant que Phing. Mas, se você é uma loja de PHP, aprenda a usar o Phing se for nada além do que parece bom em um currículo. ( “Sim, eu sou desenvolvedor PHP sênior. Eu até conheço Phing” ).

Você poderia apenas criar esse pré-processador sozinho – o PHP possui suporte embutido para a análise de arquivos PHP: http://www.php.net/manual/en/function.token-get-all.php

Eu usei isso para criar um ofuscador e devo dizer que é muito fácil de usar. Apenas imprima os tokens que deseja e remova os tokens que estão dentro dos blocos “## if premium ##”.

UPDATE: Acho que a ideia do préprocessador C é melhor. Saindo dessa resposta para completar. 🙂

Disclaimer: Estou totalmente seguro de que esta não é a maneira mais eficiente de fazer isso!

Eu faço isso em 4 partes:

  • Clone a estrutura do diretório de source no target
  • Analise os arquivos PHP e JS da source para o target
  • Copie sobre todos os arquivos jpg, gif, css, etc. da source para o target
  • Remova os comentários adicionados pela chamada cpp de todos os arquivos PHP e JS no 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' \; 

Como eu disse, tenho certeza de que isso não é extremamente ineficiente, mas que existe um arquivo .sh que eu executei e que eu bang – Eu tenho minhas compilações!

    Intereting Posts