Acho que a coisa a fazer é que o php
/ python
retorne os dados diretamente, em vez de apache
. Seu código pode fazer a mesma coisa que apache
faz. Na minha experiência, isso é muito melhor do que abrir outro diretório e / ou usar sudo
ou alterar as permissões de arquivo para apache
, etc.
Se o programa produzir o arquivo grande mais rápido que a conexão com a Internet, você poderá transmitir os dados diretamente do seu programa, o que elimina o arquivo de dados extra e o código para gerenciá-lo e os mecanismos para lembrá-lo.
Esta resposta no Stack Overflow mostra como o código funciona em php
. link .
Para programas que serão chamados dessa maneira, elimine todas as saídas stderr
stream e certifique-se de que o código de retorno do processo python reflita com precisão o sucesso ou a falha do processo.
Os exemplos abaixo mostram as chamadas popen()
que você usaria no cenário de exemplo acima de stackoverflow. Eu prefixei exec 2>/dev/null;
no comando shell. Isso garante que nenhuma saída vá para o erro padrão, mesmo a partir do próprio shell, porque ter dados chegando em stderr
e stdout
pode ser uma fonte de impasses com popen()
.
Se você quiser baixar o arquivo do disco para o seu usuário:
$fp = popen('exec 2>/dev/null; sudo -u theuser cat yourfile.zip', 'r');
Se você deseja baixar os dados do processo ativo:
$fp = popen('exec 2>/dev/null; sudo yourpythonscript arg argN', 'r');
Essas linhas de comando são comandos shell e precisam ser citadas apropriadamente para meta-caracteres do shell.
No segundo método, o servidor começaria a enviar os dados imediatamente. Quando o usuário envia com sucesso o formulário, ele vê imediatamente uma caixa de diálogo "salvar como" no navegador. Assim que o usuário seleciona o arquivo de saída, seu script php
transmite os dados diretamente através do fio e para o arquivo remoto.
O script python
deve imprimir somente os dados zip na saída padrão e retornar um código de saída que represente com precisão o sucesso ou a falha do processo zip. Em python
, o script deve gravar a saída em sys.stdout
, por exemplo zf = ZipFile(sys.stdout, ...
.
É fundamental chamar pclose()
e verificar o valor de retorno , porque essa será a única maneira de saber se o zip foi bem-sucedido ou não. Se pclose()
retornar algo diferente de 0, algo está errado.
Como o arquivo é tratado pelo cliente depende das configurações desses response headers
e de outros: content-type:
, content-encoding:
e content-disposition:
Consulte: link , veja as informações de response-header
e entity-header
.