Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tonga

Passar Matriz do PHP para Executável e do Executável para o PHP

Recommended Posts

Bom dia a todos.

 

Eu tenho uma matriz 100x10 em uma página PHP, e preciso realizar um cálculo de probabilidades com esta matriz.

Só que este cálculo é pesado e se torna inviável realiza-lo com o próprio PHP.

Portanto passei este cálculo para um programa desenvolvido em C/C++ (Linux).

O sistema deverá funcionar da seguinte forma:

O PHP envia a matriz 100x10 para o programa, este programa realiza o cálculo e devolve ao PHP uma matriz que também é 100x10.

A minha dúvida é justamente como passar a matriz do PHP para o executável, e como receber a resposta do executável.

 

 

Dúvida:

Posso passar a matriz através do comando exec() por exemplo ?

Como faço para o meu executável receber esta matriz ? Ele receberá através dos argumentos ? Se receber será criado automaticamente um argumento para cada posição da matriz ? Ou tem como receber a matriz inteira através de um único argumento ?

E para devolver ao PHP ? Como o executável iria fazer para devolver uma matriz 100x10 ao PHP ?

 

 

Desculpa se já existe alguma resposta para isso, mas eu pesquisei e não achei nada que respondesse á estas perguntas, somente exemplos simples da utilização dos comandos php para chamar executáveis.

 

Segue um exemplo da Matriz que preciso passar do PHP para o Executável. Uma Matriz no mesmo formato deve ser devolvida do Executável para o PHP.

 

$Matriz = array(
                    'linha_00'=> array(10, 20,  12,  30, 65,  7,  129, 932, 71,  0),
                    'linha_01'=> array(27, 620, 192, 15, 214, 4,  201, 82,  75,  8),
                    'linha_02'=> array(4,  201, 82,  75, 87,  62, 14,  20,  12,  1),
                    'linha_03'=> array(38, 222, 2,   35, 87,  2,  14,  85,  129, 932),
                                   .
                                   .
                                   .
                                   .
                    'linha_99'=> array(87, 2,   14,  85, 192, 15, 214, 4,   13,  98)

                 );

 

 

Desde já agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa, mas não entendi.

 

um meio viável e criar uma extensão

 

veja o aplicativo "swig":

http://www.swig.org/Doc1.3/Php.html

 

 

caso queira se aprofundar, procure os livros:

Extending and Embedding PHP

Building Custom PHP Extensions

 

 

 

veja também o "hiphop-for-php"

http://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/

 

é um "conversor" de PHP para C, desevolvimento pelos engenheiros PHP do facebook

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vamos lá:

 

Problema enviado: passar dados de uma aplicação para outra por linha de comando.

Solução Proposta: JSON

 

Procurando um pouquinho no Google, você cai no site http://www.json.org/ que tem excelentes referências.

Passando isso para linha de comando, com o comando EXEC que você mesmo mencionou:

Do PHP para outra aplicação:

 

$matrizEmJson = json_encode($matrizBemGrandeEmPHP);
exec('c:\minha\outra\aplicacao.exe ' . $matrizEmJson);

 

Veja que ela foi passada como argumento na chamada (argv).

Assim sendo, usando como referência o site (e sugestão citada no primeiro post), é só você pegar esta string enviada para o C++ e transformar em objeto/matriz nativa do C++ e usar.

 

A mesma coisa seria do C++ para o PHP. No site que passei, tem bibliotecas que fazem a conversão de objetos em C++ para JSON.

 

Não conheço C++, mas deve ter uma forma de chamar um executável por dentro dele.

 

Logo, você chamaria a linha de comando, passando o executável do PHP, com o script a ser executado E a string em JSON.

 

C:\caminho\do\php.exe c:\caminho\do\arquivo.php string_em_json

 

Dentro do PHP, você decodifica ela com json_decode.

 

if(!empty($argv) && !empty($argv[1])){
  $matrizBemGrande = json_decode($argv[1]);
}

 

@braços e fique com Deus!

 

nota: tomei duas qualificações negativas tentando ajudar... é o tipo de coisa que desanima na hora de ajudar :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

sockets são uma boa forma de comunicação inter-processos. A API de sockets Unix do C e do PHP são bem semelhantes e fáceis de usar

 

a solução ideal depende do propósito, do tempo de execução desse programa em C e outros fatores. Os sockets, assim como a solução em JSON sugerida, exigem que os dois processos estejam sendo executados. Talvez não seja essa a sua intenção. Caso queira encerrar o processo PHP enquanto o C é executado, precisará salvar em algum lugar, como arquivo ou banco de dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

nota: tomei duas qualificações negativas tentando ajudar... é o tipo de coisa que desanima na hora de ajudar :(

 

Bom dia.

Eu fui uma das pessoas que o negativou.

Desculpa, mas de uma olhada na sua primeira resposta. Você não disse absolutamente nada. Simplesmente colocou uma sigla.

Me desculpa mas isto não é uma resposta, simplesmente está poluindo o tópico.

Não seja sucinto em suas repostas. O objetivo dos tópicos não é que você resolva o problema pra quem o criou, mas sim que você mostre o caminho para o qual a pessoa deve ir.

Tenha sempre isto em mente na hora de responder um tópico.

Se você tivesse ao menos colocado algo do tipo "Procura no google por JSON", eu até teria considerado como uma resposta útil.

 

Mas veja pelo lado positivo, as negativações o fizeram escrever uma resposta muito boa (a qual eu recomendei =D).

 

 

Dúvida:

Posso passar a matriz através do comando exec() por exemplo ?

Como faço para o meu executável receber esta matriz ? Ele receberá através dos argumentos ? Se receber será criado automaticamente um argumento para cada posição da matriz ? Ou tem como receber a matriz inteira através de um único argumento ?

E para devolver ao PHP ? Como o executável iria fazer para devolver uma matriz 100x10 ao PHP ?

 

 

 

 

Bom dia Pessoal.

 

Eu fiz uma pesquisa mais profunda no feriado sobre este assunto, inclusive verificando as sugestões aqui fornecidas, e cheguei a conclusão de que para esta situação a melhor solução seria trafegar as informações através de arquivo, ou de banco de dados.

Ou seja:

 

Arquivo

1) Dentro do PHP transformar as informações da matriz em caracteres e colocá-los em um arquivo de texto.

2) Chamar o executável.

3) O Executável lê as informações do arquivo texto, as processa, devolve o resultado (uma outra matriz) para o arquivo texto e é finalizado.

4) O PHP lê a matriz, já processada, que está armazenada no arquivo texto.

 

 

 

Banco de Dados

1) Dentro do PHP envia a matriz para o banco de dados.

2) Chamar o executável.

3) O Executável lê a matriz que está armazenada no banco de dados, a processa, devolve o resultado (uma outra matriz) para o banco de dados e é finalizado.

4) O PHP lê a matriz, já processada, que está armazenada no banco de dados.

 

 

Por que escolhi estas soluções ?

Porque não envolve alterações no PHP (extensões), o processo (manipulação de banco de dados e arquivos de texto) é simples e de conhecimento geral (facilita a manutenção do código), fácil de se implementar e fácil de se portar.

 

 

Muito Obrigado a todos pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.