Como usar S3cmd em scripts PHP

O S3cmd é uma ferramenta que funciona por linha de comando e permite que você visualize o conteúdo do seu S3 Amazon, crie buckets, faça upload de arquivos e diretórios usando apenas o seu terminal. Se você não conhece a ferramenta ou deseja saber mais, clique aqui.

Na migração do conteúdo do site para o Amazon S3, resolvi usar o s3cmd para guardar o conteúdo de upload de usuários no S3. Parece ser muito fácil usar o s3cmd, afinal é só usar o shell_exec do php para executá-lo. Então se queremos executar:

s3cmd put myfile.txt s3://my-bucket/file.txt

É só colocar o comando dentro do shell_exec do php e pronto. Assim:

shell_exec( “s3cmd put myfile.txt s3://my-bucket/file.txt”);

Mas não é bem assim. O comando simplesmente não é executado. Demorei um pouco para achar a solução e a encontrei aqui. O que mais me intrigava é que eu rodava o o mesmo comando no terminal e funcionava. Também funcionava perfeitamente quando o script php era executado via linha de comando com o PHP-CLI.

O problema parece ser com o usuário. O usuário que você utiliza para rodar o s3cmd no seu terminal não é o mesmo que o apache utiliza para rodar o mesmo comando no seu script php. É bem fácil de descobrir isso. É só executar o shell_exec(“whoami”) no seu script php. Como o usuário é diferente, ele não enxerga o arquivo de configuração do s3cmd, .s3cfg, que está na sua home.

A solução que segui foi copiar o arquivo de configuração para uma pasta onde o apache pudesse acessá-la. Em seguida, alterei as permissões deste arquivo com chmod. Agora é só alterar o comando que será executado pelo shell_exec. Temos que informar ao s3cmd qual o arquivo que ele utilizará como arquivo de configuração. Além disso, é preciso alterar a env var HOME para uma string vazia pois o s3cmd dá prioridade a ela mesmo que você informe qual o arquivo de configuração que ele deve usar. Então o shell_exec fica assim:

shell_exec( “export HOME=””;s3cmd -c /caminho-absoluto-para-o-arquivo/.s3cfg myfile.txt s3://my-bucket/file.txt”);

Recomendo sempre usar paths com o caminho absoluto tanto para o arquivo de configuração como para o arquivo que você vai enviar ao S3.

Espero que esta dica seja útil.

Deixe um comentário

Este site utiliza o Akismet para reduzir spam. Fica a saber como são processados os dados dos comentários.

Site no WordPress.com.

EM CIMA ↑