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