Shell_exec () do Php e apache [fechado]

2

Estou executando uma interface 'push' do ZMQ via Ratche em um servidor Apache, que funciona muito bem na linha de comando, interagindo com o meu servidor exatamente da maneira que eu gostaria. Aqui está o código

//script1.php
<?php
echo exec('php script2.php');
?>

//script2.php
<?php
        $entryData = array(
        'category' => 'modelLmdap'
      , 'job_id'    => '1234'
      , 'text'    => ''
      , 'status'    => ''
    );
    $context = new ZMQContext();
    $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
    $socket->connect("tcp://localhost:5555");
        $socket->send(json_encode($entryData));
?>

Quando executo o script1.php, vejo um pop-up na janela do meu servidor dizendo 'pedido logado'. No entanto, se eu tentar executá-lo por meio de um navegador, recebo uma página em branco e nenhuma saída no servidor.

Eu olhei em volta, isso pode ser devido ao Apache não ser capaz de rodar na linha de comando e uma solução é adicionar o seguinte aos meus sudoers (usando o sudo visudo):

www-data ALL=NOPASSWD: ALL

Ainda nada! Uma página em branco. Eu mudei o comando para exec () e recebo este erro:

Fatal error: Class 'ZMQContext' not found in /home/username/server/qap/v2/tools/push.php on line 8

Alguma idéia?

EDIT: me perguntaram por que eu quero fazer tudo isso, que é uma questão sólida.

TL; DR Não consigo pensar em uma maneira de executar outro script php como um serviço - o curl não está funcionando localmente e o include não o corta.

Estou realizando uma série de cálculos estatísticos complexos que exigem muitos recursos e levam muito tempo para produzir qualquer resultado, resultando em problemas peculiares de execução de scripts, incluindo páginas em branco sem nenhum motivo (mesmo quando estendi o arquivo). tempo máximo de execução do script) e erros de AJAX, apesar dos tempos limite estarem no máximo. Então, estou desenvolvendo os cálculos no lado do servidor para vários processos em segundo plano diferentes, todos scripts PHP. Isso também me permite atualizar o usuário enquanto esse longo script é executado. A chamada em questão é para executar um script de 'controlador' que controla o farm de cálculo (é que a terminologia correta? Idk). O script então se comunica com um servidor Push (via ZMQ) e envia os dados para os clientes. O código original era pesado em AJAX e eu realmente não gostei de atualizar todo o conteúdo para usar websockets, então decidi usar um estilo de "push" usando o Ratchet como o servidor de soquete. Isso significa que posso fazer minha chamada AJAX original para iniciar todo o processo e a página recebe atualizações do servidor, unidirecional. Isso tem muitas vantagens, meu favorito é que a comunicação é inerentemente de mão única, o que me impede de implementar muitos recursos de segurança no servidor. Infelizmente, para que tudo isso funcione, o script Ajax precisa ser capaz de executar shell_exec os scripts de "farm", já que eles precisam ser executados como processos em segundo plano, e foi assim que corri meu problema. Eu tentei curl (), mas ele apenas pega o texto nu e include () apenas resultará em outros scripts sendo executados como parte do script ajax-ed, que anula todo o ponto. Eu acho que a longo prazo eu poderia modificar o servidor 'push' para ser totalmente duplex, permitindo que os dados iniciais sejam transmitidos da página web diretamente para um 'farm server' assíncrono (eu sei ReactPHP é capaz disso, como é nó .js), mas como um n00b para a programação do servidor socket eu achei melhor evitá-lo até que eu possa completar um modelo de trabalho.

Se houver algo que eu tenha perdido, avise-me, odeio sites inseguros tanto quanto você!

    
por A A Karim 02.07.2015 / 01:38

1 resposta

2

Ok, eu resolvi isso!

O problema foi devido ao fato de existirem diversas versões diferentes do PHP instaladas no sistema (eu portei através do sistema de um domínio de hospedagem compartilhada para o servidor privado, carregando toda a bagagem associada). O Apache estava usando o php5.4 e o ZMQ foi instalado no 5.6.

Eu renomei todas as pastas do php 5.4 para php54_old e criei um link para todas as pastas relevantes do php 5.6 (sudo ln -s / etc / php56 / etc / php54). Acredito que em conjunto com suas permissões sudo (acima) permitiu que ele funcionasse, embora eu testarei se ele funciona sem permissões de sudo quando eu implantar o site. Eu não me sinto confortável, por muitas razões, com o Apache tendo permissões de sudo - nesse ínterim, limitei as permissões sudo do Apache para executar apenas o php.

EDIT: Ah, e eu também desinstalei e reinstalei o pacote ZMQ PEAR e o wrapper zmq php.

    
por 02.07.2015 / 12:08