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 .