Venho hoje posta a técnica desenvolvida por mim para utilizar processo distribuído, multi-servidores, e simulação de multi-thread totalmente em PHP.
Como todo desenvolvedor web sabe, o carregamento da um página é estrutural se tratando de serve layer, isso pois o conteúdo que é enviado para o usuário é todo processado no servidor primeiro, porém existe uma forma de facilitar esse processamento simulando um multi-thread com o PHP, isso é possivel e hoje é utilizando no projeto em que trabalho. Vamos analisar a ideia:
1. Inicialmente vamos pensar que o PHP nada mais é que uma linguagem que é interpretada por um aplicativo que no Windows tem o nome de php.exe, e fica localizado na pasta da instalação do PHP.
2. Quando um usuário faz uma requisição HTTP o Apache ou qualquer outro servidor web identifica qual a extensão do arquivo, sendo .php, .php4, .php5, .sphp ou coisa do tipo(definidos no htacess ou nas configurações do servidor), o servidor web então chama o php.exe, enviando o conteudo pelo parâmetro -f, e depois retornando o HTML já processado, este processo ocorre toda vez que há uma requisição por POST ou GET, estão resumindo, toda vez que enviamos um formulário, clicamos em um link ou acessamos um site e solicitamos Ajax, é feito este processo.
3. Cada vez que o servidor web passa o arquivo pelo PHP vários comandos são interpretados e executados no sistema operacional por meio de bibliotecas e comandos de baixo nível, por isso na instalação do PHP é criada a pasta 'ext', está é a pasta que contem todas as dll para funcionamento do MySql, PDO, Zip, OpenSSL, resumindo é possivel usar qualquer biblioteca juntamente com o PHP, basta sabe fazer a configuração corretamente.
4. O mais importante, o PHP pode ser executado diretamente pelo CMD(Linha de comando), para isso é necessário digitar a pasta aonde esta localizado o arquivo e -f com o nome do arquivo que desejamos executar, porem exite um problema, ao fazer isso perdemos acesso a variáveis de ambiente como $_GET, $_POST, mas ainda sim é possivel passar parâmetros para essa aplicação e resgatá-las no PHP por meio da variável $argv
Primeiro etapa para consegui fazer um sistema distribuído é a classe thread, disponível no arquivo anexo no final do post, esta incrível classe tem o poder de fazer requisições para si mesmo e para outros arquivo em runtime, além disso ele consegui retorna o resultado, eu fiz alguma alterações nesta classe para atender minhas necessidade e a classe que utilizo hoje esta disponível no arquivo multi-thread simulate.zip.
O arquivo que contem a classe original também tem um arquivo teste que demonstra a utilização simples da classe, um outro script importante para utilizar multi-servidores é o arquivo que criei com nome de Exec.php disponível no segunda arquivo abaixo, ele verifica qual sistema operacional está em uso no servidor e executa um comando CMD por meio da função exec e shell_exec para iniciar um 'thread' ou finalizar um, no caso é possivel também finalizar todos os processos iniciados por meio da função killallthreads. Para usuários de Windows é necessário configurar o caminho do arquivo php.exe no arquivo exec.php, caso não o script não irá funcionar.
Internamente ainda tenho uma função para criação da thread(segue abaixo), no caso a variável $host seque a url do script remoto, $link é o caminho para o arquivo exec.php, $exe é o nome do arquivo php que deseja iniciar e $args são parâmetros a serem passadas para o arquivo. Exemplo de chamada open_thread("127.0.0.1", "/thread/", "/thread/processos/soma.php", "1 5");, no caso eu quero chamar um arquivo php de soma, aonde teoricamente ele recebe 2 parametros, faz a soma e retorna o resultado, o arquivo esta na minha maquina local, na pasta /thread/ deve estar o arquivo exec.php, e o arquivo soma deve esta em /thread/processos, é claro que em tarefas tão simples não é necessário utilizar multi-thread.
function open_thread($host, $link, $exe, $args){
$tmp_thread = new Thread($host, 80, $link . "exec.php");
$tmp_thread->setFunc("createthread", array($exe." ".$args));
$tmp_thread->start();
}
Este modelo é totalmente novo e não há nada parecido, falo isso pois fiquei mais de 2 meses procurando, e é muito útil para serviços de extrema complexabilidade que demoraria muito tempo para ser feito, a vantagem de utilizar o PHP pra isso é o tempo de resposta que é excelente, e sua mobilidade por ser uma linguagem altamente modular, fora isso ter a possibilidade de controlar tarefas pesadas por meio de uma interface WEB sem necessidade de usa Java ou Flash.
Pergunta
André H. Ferreira
Venho hoje posta a técnica desenvolvida por mim para utilizar processo distribuído, multi-servidores, e simulação de multi-thread totalmente em PHP.
Como todo desenvolvedor web sabe, o carregamento da um página é estrutural se tratando de serve layer, isso pois o conteúdo que é enviado para o usuário é todo processado no servidor primeiro, porém existe uma forma de facilitar esse processamento simulando um multi-thread com o PHP, isso é possivel e hoje é utilizando no projeto em que trabalho. Vamos analisar a ideia:
1. Inicialmente vamos pensar que o PHP nada mais é que uma linguagem que é interpretada por um aplicativo que no Windows tem o nome de php.exe, e fica localizado na pasta da instalação do PHP.
2. Quando um usuário faz uma requisição HTTP o Apache ou qualquer outro servidor web identifica qual a extensão do arquivo, sendo .php, .php4, .php5, .sphp ou coisa do tipo(definidos no htacess ou nas configurações do servidor), o servidor web então chama o php.exe, enviando o conteudo pelo parâmetro -f, e depois retornando o HTML já processado, este processo ocorre toda vez que há uma requisição por POST ou GET, estão resumindo, toda vez que enviamos um formulário, clicamos em um link ou acessamos um site e solicitamos Ajax, é feito este processo.
3. Cada vez que o servidor web passa o arquivo pelo PHP vários comandos são interpretados e executados no sistema operacional por meio de bibliotecas e comandos de baixo nível, por isso na instalação do PHP é criada a pasta 'ext', está é a pasta que contem todas as dll para funcionamento do MySql, PDO, Zip, OpenSSL, resumindo é possivel usar qualquer biblioteca juntamente com o PHP, basta sabe fazer a configuração corretamente.
4. O mais importante, o PHP pode ser executado diretamente pelo CMD(Linha de comando), para isso é necessário digitar a pasta aonde esta localizado o arquivo e -f com o nome do arquivo que desejamos executar, porem exite um problema, ao fazer isso perdemos acesso a variáveis de ambiente como $_GET, $_POST, mas ainda sim é possivel passar parâmetros para essa aplicação e resgatá-las no PHP por meio da variável $argv
Primeiro etapa para consegui fazer um sistema distribuído é a classe thread, disponível no arquivo anexo no final do post, esta incrível classe tem o poder de fazer requisições para si mesmo e para outros arquivo em runtime, além disso ele consegui retorna o resultado, eu fiz alguma alterações nesta classe para atender minhas necessidade e a classe que utilizo hoje esta disponível no arquivo multi-thread simulate.zip.
O arquivo que contem a classe original também tem um arquivo teste que demonstra a utilização simples da classe, um outro script importante para utilizar multi-servidores é o arquivo que criei com nome de Exec.php disponível no segunda arquivo abaixo, ele verifica qual sistema operacional está em uso no servidor e executa um comando CMD por meio da função exec e shell_exec para iniciar um 'thread' ou finalizar um, no caso é possivel também finalizar todos os processos iniciados por meio da função killallthreads. Para usuários de Windows é necessário configurar o caminho do arquivo php.exe no arquivo exec.php, caso não o script não irá funcionar.
Internamente ainda tenho uma função para criação da thread(segue abaixo), no caso a variável $host seque a url do script remoto, $link é o caminho para o arquivo exec.php, $exe é o nome do arquivo php que deseja iniciar e $args são parâmetros a serem passadas para o arquivo. Exemplo de chamada open_thread("127.0.0.1", "/thread/", "/thread/processos/soma.php", "1 5");, no caso eu quero chamar um arquivo php de soma, aonde teoricamente ele recebe 2 parametros, faz a soma e retorna o resultado, o arquivo esta na minha maquina local, na pasta /thread/ deve estar o arquivo exec.php, e o arquivo soma deve esta em /thread/processos, é claro que em tarefas tão simples não é necessário utilizar multi-thread.
Este modelo é totalmente novo e não há nada parecido, falo isso pois fiquei mais de 2 meses procurando, e é muito útil para serviços de extrema complexabilidade que demoraria muito tempo para ser feito, a vantagem de utilizar o PHP pra isso é o tempo de resposta que é excelente, e sua mobilidade por ser uma linguagem altamente modular, fora isso ter a possibilidade de controlar tarefas pesadas por meio de uma interface WEB sem necessidade de usa Java ou Flash.
Classe Thread original - PHP Classes ou Skydriver
Classe thread alterada e arquivo Exec -Skydriver
Espero que tenham gostado
Para mais artigos relacionados a performance, programação e SEO acesse http://vivendonaweb.blogspot.com
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.