Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

1. Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Tonga
Tongliose

(usa Outra)

Enviado em 04/07/2012 - 11:16h

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.


Desde já agradeço a ajuda.


  


2. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 04/07/2012 - 11:31h

Me parece que seu problema pode ser resolvido pelo próprio PHP, daria pra passar um exemplo da necessidade...


3. Em PHP demora demais.

Tonga
Tongliose

(usa Outra)

Enviado em 04/07/2012 - 13:32h

Sim, da pra se resolver pelo PHP. Inclusive atualmente está implementado em PHP, mas como eu disse, o cálculo é pesado e fica muito lento em PHP. Quando eu digo muito lento, eu quero dizer que o cálculo demora vários minutos para gerar o resultado.
Por isso uma alternativa que eu encontrei foi utilizar um programa executável. Em um programa de teste que fiz (o qual não se comunica com o PHP) consegui reduzir o tempo de processamento para segundos ao invés de minutos.
Mas agora preciso descobrir uma forma de transitar esta matriz (caminho de ida e o de volta) entre o PHP e o Executável.


4. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/07/2012 - 13:50h


Crie um shell script que mande a saída do pograma para um arquivo temporário.

Use o php para ler o resultado.

BOA SORTE!!!



5. Hummmm, Arquivo ?

Tonga
Tongliose

(usa Outra)

Enviado em 04/07/2012 - 14:16h

Hummmm, Arquivo ?
Eu gostaria de uma abordagem mais direta, sem a necessidade de recorrer a arquivos.
E quando a passagem da matriz do PHP para o executável ?
Alguma ideia ?


6. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/07/2012 - 15:45h

Tongliose escreveu:

Hummmm, Arquivo ?
Eu gostaria de uma abordagem mais direta, sem a necessidade de recorrer a arquivos.
E quando a passagem da matriz do PHP para o executável ?
Alguma ideia ?



Esse ainda está fraco. Melhore-o!


<?php
$request =@ $_REQUEST['args'];
/**
* PATH do comando a ser executado
*/
$path_cmd = '';
if( $request )
{
$args = escapeshellcmd( escapeshellarg( $foo ) );
echo system( "$path_cmd $args" );
}
else
{
echo '<h1>Sem argumentos para processar</h1>';
}
?>


<div style="margin:auto;display:table">
<form method="post" action="foo.php">
<textarea style="padding:8;width:400px;border:1px solid rgb(88,88,88)" name="args">Texto a ser processado pelo script</textarea>
<br />
<input type="submit" value="Enviar" />
</form>
</div>



Execute e veja se funcionou.

BOA SORTE!!!




7. Outra versão um pouco mais completa

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/07/2012 - 16:57h

arquivo foo.php

<?php
$diretorio = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$shell_script = $diretorio . 'script.sh';
$request =@ $_REQUEST['args'];
if( $request )
{
unset($stt);
unset($rst);
$args = escapeshellcmd( escapeshellarg( "$request" ) );
exec( "$shell_script $args", $rst, $stt );
if ( $stt == 0 )
{
echo '<div style="color:green">O resultado foi:<br />'
. file_get_contents( '/tmp/resultado.txt' )
. '</div>';
}
else
{
echo '<h1 style="color:red">DEU [*****]</h1>';
}
unset($stt);
unset($rst);
}
else
{
echo '<h1>Sem argumentos para processar</h1>';
}

?>

<div style="margin:auto;display:table">
<form method="post" action="foo.php">
Dados a serem enviados ao script:<br />
<input type="text" style="padding:8;width:400px;border:1px solid rgb(88,88,88)" name="args" />
<br />
<input type="submit" value="Enviar" />
</form>
</div>


script.sh
Salve na mesma pasta do foo.php


#!/bin/bash

function _executor()
{

# Atenção para como os parametros devem ser passados.
# Eg. executavel $@
echo $@
}

_executor $@ > '/tmp/resultado.txt'


BOA SORTE!!!


8. Poderia explicar o código ?

Tonga
Tongliose

(usa Outra)

Enviado em 04/07/2012 - 17:11h

Obrigado ronin.

Pelo que eu entendi do código, você está passando uma string como argumento para o shell.

Eu preciso passar uma Matriz 100x10.

Caso eu esteja errado e seja possível passar esta Matriz através do seu código, você poderia me explicá-lo ?

Obrigado.



9. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/07/2012 - 17:31h

NOVA VERSÃO DO foo.php

<?php
function formataSaida( array $entry = null )
{
if( $entry )
{
$rst = '<div style="color:green"><h1>O resultado foi</h1>';
foreach( $entry as $index => $dado )
{
$rst .= '<pre>' . $index . ' - ' . $dado . '</pre>';
}
}
return $rst . '</div>';
}

// Caminho para o executável que irá processar a requisição
$diretorio = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$shell_script = $diretorio . 'script.sh';

// Faça mais testes aqui
$request =@ $_REQUEST['args'];
if( $request )
{
unset($stt);
unset($rst);
$args = escapeshellcmd( escapeshellarg( "$request" ) );
// O exec é mais completo. Leia o manual
exec( "$shell_script $args", $rst, $stt );
if ( $stt == 0 )
{
echo formataSaida($rst);
}
else
{
echo '<h1 style="color:red">DEU [*****]</h1>';
}
}
else
{
echo '<h1>Ooops!!! Sem argumentos para processar</h1>';
}

?>

<div style="margin:auto;display:table">
<form method="post" action="foo.php">
Dados a serem enviados ao script:<br />
<textarea name="args" style="padding:8;width:600px;border:2px solid red"></textarea>
<br />
<input type="submit" value="Enviar Dados" />
</form>
</div>


Forneça um exemplo de entrada para o script.


10. Exemplo

Tonga
Tongliose

(usa Outra)

Enviado em 04/07/2012 - 19:49h

Segue um exemplo de Matriz 100x10 com a qual o meu código trabalharia:


$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)

);


Na verade eu não uso os labels "linha_xx" no código, eu coloquei aqui somente para facilitar o entendimento.



OBS:

1) No seu código, você continua passando uma string como argumento para o executável/shell scritp. Eu gostaria de passar a Matriz sem precisar transformá-la em string.


Dados a serem enviados ao script:<br />
<textarea name="args" style="padding:8;width:600px;border:2px solid red">


2) Pela função formataSaida eu acredito que o código supõe que você receba uma Matriz (através da variável $rst) como retorno do executável/shell script. Mas não me ficou claro como o executável/shell scritp devolveria esta Matriz.


exec( "$shell_script $args", $rst, $stt );


3) Eu procuro uma solução a onde eu não precise transformar a Matriz em string e nem trabalhar com arquivos, ou banco de dados para transitar esta Matriz entre o PHP e o Executável e nem do Executável para o PHP.


Muito Obrigado por você estar me ajudando.


11. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Tonga
Tongliose

(usa Outra)

Enviado em 10/07/2012 - 11:50h

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 (como o Ronin sugeriu), 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 Ronin e a todos pela ajuda.



12. Re: Passar Matriz do PHP para Executável e do Executável para o PHP [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 10/07/2012 - 15:06h

Boa tarde!!!

Por favor marque a melhor resposta. Isto servirá para ajudar outros membros com dúvida semelhante.

Obrigado!!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts