quinta-feira, 17 de novembro de 2011

Usando o Rackspace PHP SDK


Como uma recapitulação do meu artigo anterior , CloudFiles é um serviço de armazenamento on-line para o seu conteúdo estático.


Rackspace fornece um Software Development Kit (SDK) para várias linguagens de programação. Eles armazenam suas PHP SDK no GitHub . O SDK do PHP requer PHP 5 com os seguintes módulos: cURL, FileInfo e mbstring.'



Neste tutorial, vamos revisar o uso do SDK PHP com CloudFiles. Nem todas as partes da API serão cobertos, mas você vai ter um grande começo.


Depois de baixar o SDK só é necessário os seguintes arquivos e pastas:


share /
cloudfiles.php
cloudfiles_exceptions.php
cloudfiles_http.php
Seu primeiro voo


Começando temos algumas tarefas básicas. Precisamos carregar o arquivo cloudfiles.php, autenticar com CloudFiles, e criar uma conexão usando o nosso token de autenticação.


<? Php
$ Your_username = 'jeffk' ;
$ Your_api_key = 'longrandomapikey' ;
exigem 'cloudfiles.php' ;


/ **
 * Authenticate usando seu nome de usuário nuvem Rackspace e sua chave API obtidos a partir do painel de controle
 ** /


$ Auth = nova CF_Authentication ( $ your_username , your_api_key $ );


/ **
 * Se você usar arquivos nuvem no uso do Reino Unido
11
 ** /
$ Auth = nova CF_Authentication ( $ your_username , $ your_api_key , null, UK_AUTHURL);
$ Auth -> authenticate ();


/ **
 * Agora vamos criar a conexão com o nosso exemplo CF_Authentication
 ** /
$ Connection = nova CF_Connection ( $ auth );
?>
É simples assim. Agora que estamos conectados nosso próximo passo é interagir com um recipiente.


Containers


Podemos criar, excluir, listar e abrir recipientes diferentes. Para interagir com qualquer recipiente que vamos usar o nosso objeto de conexão $ criamos acima.


Lets go através da criação de um recipiente que armazena nossos arquivos.


<? Php
/ **
 * Para criar um container, use a variável $ conexão e chamar o método create_container. Se o recipiente
 * Já existe ele irá retornar uma instância de container e não substituir o recipiente.
 ** /


$ Imagens = $ connection -> create_container ( "imagens" );
?>


Isso irá retornar um objeto de recipiente. No exemplo que nomeou $ imagens . Isso será usado para manipular o recipiente junto com todos os objetos nela. Se você precisa interagir com os objetos em um recipiente que você tem que usar o create_container método para acessá-lo. Uma vez que o recipiente já existe, ele irá retornar a instância e que não irá substituí-lo.


Agora, a exclusão de um recipiente que não é mais necessário. Nota: você não pode remover um recipiente que tem objetos (arquivos) nele. Se houver arquivos dentro dela você deve removê-los todos antes de eliminar o recipiente. No final do artigo, há um trecho para remover todos os objetos e, em seguida, apagar o container.


<? Php
/ **
 * Para excluir um recipiente de chamar o método delete_container.
 ** /
$ Connection -> delete_container ( "imagens" );
?>


Com essas ações feitas, como sobre a obtenção dos recipientes? Se você quer um leque de seus recipientes com diversas informações que você pode usar o get_containers método.


<? Php
/ **
 * Obter um conjunto de seus recipientes disponíveis e exibi-los.
 ** /


Recipientes $ = $ connection -> get_containers ();
foreach ( $ recipientes como $ container ) {
    echo 'Nome:' . container $ - nome>;
    echo "Número de objetos:" . $ container -> count ;
    echo 'Stores Bytes:' . container $ -> bytes;
}
?>


Se você quer somente os nomes dos recipientes que temos o método list_containers:


<? Php
Recipientes $ = $ connection -> list_containers ();
print_r ( $ containers ); / / Array Retorna ([0] => "images")
?>


Tornando-o disponível para o CDN


Por padrão todos os recipientes são particulares. Para torná-los disponíveis no Content Delivery Network e acessível por um url, temos de dizer a API para tornar público o recipiente. Naturalmente podemos devolvê-lo ao privado, se necessário.


<? Php
/ **
 * Para tornar público um container usar a instância recipientes e chamar make_public. * Você pode opcionalmente incluir um timestamp por quanto tempo o arquivo é armazenado em cache na rede CDN. * O padrão é 86400 (1 dia)
 * Chamar esse método retorna o URI do recipiente está disponível em.
 ** /
Public_uri $ = $ imagens -> make_public ();
/ **
 * Você também pode obter a URI chamando o cdn_uri ou cdn_ssl_uri atributos
 ** /


$ Uri => $ imagens -> cdn_uri;
Https_uri $ = $ imagens -> cdn_ssl_uri;


/ **
 * Para definir um container público-privada que você pode chamar make_private. No entanto, todos os arquivos neste recipiente ainda estará disponível até o tempo de cache expira.
 ** /


$ Imagens -> make_private ();
?>
Objetos, os objetos, os objetos


Para criar um objeto temos que transitar nossa instância recipiente e usar o create_object método com o nome do arquivo. Uma vez que fizermos isso, temos que enviar o conteúdo do arquivo. Há duas maneiras de fazer isso. A maneira mais fácil é usar o load_from_filename método que ele irá reunir todas as informações para nós. A segunda maneira que especificar o arquivo eo tamanho.


<? Php
$ Avatar = $ imagens -> create_object ( 'jeffs_avatar.jpg' );
$ Avatar -> load_from_filename ( '/ home / user / photos / jeffs_avatar.jpg' );
$ File_name = '/ home / user / photos / jeffs_avatar.jpg' );
$ File_size = (float) sprintf ( "% u" , filesize ( $ file_name ));
$ Fp = open ( $ file_name , 'r' );
$ Avatar -> write ( $ fp , $ file_size );
?>


Para obter um objeto particular, podemos usar o método de vapor. Isso funciona muito bem para proteger o conteúdo. Não é apenas limitada a imagens ou, se você quiser restringir o acesso a um documento pdf para os seus membros apenas, este seria o ideal.


<? Php
$ Img = $ imagens -> get_object ( 'jeff.jpg' );
header ( 'Content-Type: " . $ img -> content_type);
$ Output = fopen ( " php: / / Saída " , "w" );
$ Img -> stream ( $ output );
fclose ( $ output );
?>


Para excluir um objeto, precisamos usar o nosso container e chamar o método delete_object.


<? Php
$ Imagens -> delete_object ( 'jeff.jpg' );
?>


Terminando. Alguns exemplos de trabalho


Aqui temos um exemplo de uma pasta para a digitalização. Jpg e enviá-las para arquivos em nuvem Rackspace.


<? Php
$ Api_username = 'jeffk' ;
$ Api_key = 'myapikey' ;
$ File_path = '/ home / user / imagens' ;
exigem 'cloudfiles.php' ;
$ Auth = nova CF_Authentication ( $ api_username , $ api_key );
$ Auth -> authenticate ();
$ Connection = nova CF_Connection ( $ auth );
$ Imagens = $ connection -> create_container ( "imagens" );
$ Url = $ imagens -> make_public ();
echo "O url é" . $ url ;


/ **
 * Agora que temos nossa conexão e acesso ao recipiente permite obter os nossos arquivos.
 ** /


se ( $ h = opendir ( $ file_path )) {


    / **
     * Acabamos de abrir o diretório e agora vamos fazer a varredura nesse diretório para todos os arquivos
     ** /
    enquanto (false! == ( $ file = readdir ( $ h ))) {

       / **
         * Agora estamos indo para obter a extensão do arquivo. Se ele corresponder "jpg", então vamos carregá-lo.
         * Caso contrário, vamos ignorá-la.
         ** /
        $ Get_extension = explode ( '.' , $ file );
        se ( $ get_extension [ count ( $ get_extension ) -1] == "jpg" ) {
]            / **
             * Vamos criar o objeto e enviá-lo para CloudFiles
             ** /
            $ Img = $ imagens -> create_object ( $ file );
            $ Img -> load_from_filename ( $ file_path . '/' . $ file ;)
            / ** Agora vamos apagar a imagem de modo que não tentar carregá-lo novamente se executar novamente o script ** /
            unset ( $ img );
        }
    }
    / **
     * Feche o manipulador para uma boa medida
     ** /
    closedir ( $ h );
}
?>
O próximo exemplo é a exclusão de um recipiente que já contenha objetos.


<? Php
Objetos $ = $ imagens -> list_objects ();
se ( count ( $ objetos )> 0) {
    foreach ( $ objetos como $ o ) {
        $ Imagens -> delete_object ( $ o );
    }
}
$ Connection -> delete_container ( "imagens" );
?>


O que eu forneci aqui foram alguns exemplos básicos. Algumas coisas que você pode adicionar estão retornando a url para os objetos, tratamento de erros, ou mesmo ter certeza que há um ou mais objetos à espera de ser carregado antes de ligar.


Adicional Precisa Saber


Se você receber um erro como pode ser visto abaixo, você precisa atualizar seus certificados de ca, consulte o manual ou OS host para obtê-los atualizados. Depois que eu testada com sucesso em meu ambiente de desenvolvimento eu tive este problema na produção.
* Sobre a connect () para lon.auth.api.rackspacecloud.com porta 443
* Tentando 212.64.148.13 ... * Conectado
* Ligado ao lon.auth.api.rackspacecloud.com (212.64.148.13) 443
* Definida com sucesso certificado verificar locais:
* CAfile: / etc / pki / tls / certs / ca-bundle.crt
Capath: none
* Problema de certificado SSL, verifique se o certificado CA é OK. Detalhes:
erro: 14090086: rotinas SSL: SSL3_GET_SERVER_CERTIFICATE: certificado de verificação não
* Fechando a conexão # 0


PHP Fatal error: 'InvalidResponseException "excepção Uncaught com a mensagem" resposta inesperada ():' in / usr / share / php / cloudfiles / cloudfiles.php: 212


Rastreamento de pilha:


# 0 / var / www / html / cloudtest.php (18): CF_Authentication-> authenticate ()
# 1 {main}
jogado in / usr / share / php / cloudfiles / cloudfiles.php na linha 212


Erro fatal: "InvalidResponseException" excepção Uncaught com a mensagem "resposta inesperada (): 'in / usr / share / php / cloudfiles / cloudfiles.php: 21
Rackspace, próxima usa exceções quando ocorrem erros. Envolvendo o seu código em blocos try {} catch () {} irá permitir que você obtenha a mensagem de erro em vez de uma "exceção Uncaught ...." Abaixo você pode ver as classes de exceção diferentes que usam e que só estender a classe Exception desde por php.


classe SyntaxException estende Exception {}
classe AuthenticationException estende Exception {}
classe InvalidResponseException estende Exception {}
classe NonEmptyContainerException estende Exception {}
classe NoSuchObjectException estende Exception {}
classe NoSuchContainerException estende Exception {}
classe NoSuchAccountException estende Exception {}
classe MisMatchedChecksumException estende Exception {}
classe IOException estende Exception {}
classe CDNNotEnabledException estende Exception {}
classe BadContentTypeException estende Exception {}
classe InvalidUTF8Exception estende Exception {}


classe ConnectionNotOpenException estende Exception {}
Se você fosse para tentar remover um recipiente que ainda tinha objetos nele, o kit de desenvolvimento de software iria lançar uma exceção NonEmptyContainerException que você tem que assistir.


<? Php
/ **
* Tente executar o código
** /
try {
    $ Connection -> delete_container ( "imagens" );
}
/ **
* Se não foi uma exceção lançada, pegá-lo e exibir a mensagem
** /
catch (NonEmptyContainerException $ e ) {
    echo $ e -> getMessage ();
}
Se o nosso container não estava vazia ele iria mostrar "Container deve estar vazio antes de removê-lo". Se você não pegar o erro que iria fornecer uma saída, tais como:


Erro fatal: "NonEmptyContainerException" excepção Uncaught com a mensagem "Container deve estar vazio antes de removê-lo." in / Users / kreitje / Desenvolvimento / teste / cloudfiles.php: 560 Stack trace: # 0 / Users / kreitje / Desenvolvimento / teste / index.php (25): CF_Connection-> delete_container ('imagens') # 1 {main} jogado em / Users / kreitje / Desenvolvimento / teste / cloudfiles.php na linha 560
Se desenvolver uma aplicação que os clientes interagem com você vai querer pegar qualquer exceção. Às vezes o erro que é exibida mostra informações sensíveis. Acima, você pode ver onde meus arquivos são armazenados. Dependendo do erro, é possível que as suas credenciais de API pode ser exibido na página do browser.

Nenhum comentário :

Postar um comentário

Total de visualizações de página