PHP'den Azure Depolama Tablo hizmetini veya Tablo için Azure Cosmos DB'yi kullanma

UYGULANANLAR: Tablo

Uyarı

Bu proje, yaşam döngüsünün topluluk destek aşamasındadır. Sonunda, ilişkili tüm istemci kitaplıkları kalıcı olarak kullanımdan kaldırılacaktır. Kullanımdan kaldırma ve bu projeyi kullanmanın alternatifleri hakkında daha fazla bilgi için bkz . Kullanımdan kaldırma bildirimi: Azure Depolama PHP istemci kitaplıkları.

İpucu

Bu makaledeki içerik, Azure Tablo depolama ve Tablo için Azure Cosmos DB için geçerlidir. Tablo API'si, aktarım hızı için iyileştirilmiş tablolar, genel dağıtım ve otomatik ikincil dizinler sunan bir tablo depolama için premium bir tekliftir.

Bu makalede tablo oluşturma, verilerinizi depolama ve veriler üzerinde CRUD işlemleri gerçekleştirme işlemleri gösterilir. Azure Tablo hizmetini veya Tablo için Azure Cosmos DB'yi seçin. örnekler PHP’de yazılmıştır ve Azure Depolama Tablo PHP İstemci Kitaplığını kullanır. Kapsamdaki senaryolara tablo oluşturma ve silme, tablodaki varlıkları ekleme, silme ve sorgulama dahildir.

Azure hizmet hesabı oluşturma

Azure Tablo depolama alanını veya Azure Cosmos DB'yi kullanarak tablolarla çalışabilirsiniz. Bu iki hizmetteki tablo teklifleri arasındaki farklar hakkında daha fazla bilgi edinmek için bkz. Tabloya genel bakış API'sine. Kullanacağınız hizmet için bir hesap oluşturmanız gerekir. Aşağıdaki bölümlerde hem Azure Tablo depolamanın hem de Azure Cosmos DB hesabının nasıl oluşturulacağı gösterilmektedir, ancak bunlardan yalnızca birini kullanabilirsiniz.

Azure Table Storage

Azure depolama hesabı oluşturmanın en kolay yolu Azure portal kullanmaktır. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.

Azure PowerShell veya Azure CLI kullanarak da bir Azure depolama hesabı oluşturabilirsiniz.

Şu anda bir depolama hesabı oluşturmamayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azure Depolama Öykünücüsü'ni de kullanabilirsiniz. Daha fazla bilgi için bkz. Geliştirme ve test için Azure Depolama Öykünücüsü'ni kullanma.

Tablo için Azure Cosmos DB

Tablo hesabı için Azure Cosmos DB oluşturma yönergeleri için bkz. Veritabanı hesabı oluşturma.

PHP uygulaması oluşturma

Depolama Tablosu hizmetine veya Tablo için Azure Cosmos DB'ye erişmek için bir PHP uygulaması oluşturmanın tek gereksinimi, kodunuzun içinden PHP için azure-storage-table SDK'sında sınıflara başvurmaktır. Uygulamanızı oluşturmak için Not Defteri dahil olmak üzere tüm geliştirme araçlarını kullanabilirsiniz.

Bu kılavuzda, PHP uygulamasının içinden çağrılabilen Tablo için Azure Tablo Depolama veya Azure Cosmos DB özelliklerini kullanacaksınız. Uygulama yerel olarak veya bir Azure web rolü, çalışan rolü veya web sitesi içinde çalışan kodda çalıştırılabilir.

İstemci kitaplığını alma

  1. Projenizin kökünde Composer.JSON adlı bir dosya oluşturun ve aşağıdaki kodu ekleyin:

    {
    "require": {
     "microsoft/azure-storage-table": "*"
    }
    }
    
  2. Kökünüzde composer.phar dosyasını indirin.

  3. Bir komut istemi açın ve proje kök dizininde aşağıdaki komutu yürütün:

    php composer.phar install
    

    Alternatif olarak, GitHub'da kaynak kodunu kopyalamak için Azure Depolama Tablo PHP İstemci Kitaplığına gidin.

Gerekli referansları ekleme

Depolama Tablo hizmetini ya da Azure Cosmos DB API'lerini kullanmak için:

  • require_once bildirimini kullanarak otomatik yükleme dosyasına başvurun ve
  • Kullandığınız tüm sınıflara başvurun.

Aşağıdaki örnekte otomatik yükleyici dosyasını nasıl dahil edeceğiniz TableRestProxy sınıfını nasıl dahil edeceğiniz gösterilmektedir.

require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Table\TableRestProxy;

Buradaki örneklerde deyimi require_once her zaman gösterilir, ancak yalnızca örneğin yürütülmesi için gereken sınıflara başvurulur.

bağlantı dizesi ekleme

Azure depolama hesabına veya Tablo için Azure Cosmos DB hesabına bağlanabilirsiniz. Kullandığınız hesabın türüne göre bağlantı dizesi alın.

Bir Depolama Tablosu hizmeti bağlantısı ekleme

Bir Depolama Tablosu hizmet istemcisi örneği oluşturmak için öncelikle geçerli bir bağlantı dizesi olması gerekir. Depolama Tablosu hizmeti bağlantı dizesinin biçimi şöyledir:

$connectionString = "DefaultEndpointsProtocol=[http|https];AccountName=[yourAccount];AccountKey=[yourKey]"

Depolama Öykünücüsü bağlantısı ekleme

Öykünücü depolamasına erişmek için:

UseDevelopmentStorage = true

Azure Cosmos DB bağlantısını ekleme

Bir Azure Cosmos DB Tablo istemcisi oluşturmak için öncelikle geçerli bir bağlantı dizesi olması gerekir. Azure Cosmos DB bağlantı dizesi biçimi şöyledir:

$connectionString = "DefaultEndpointsProtocol=[https];AccountName=[myaccount];AccountKey=[myaccountkey];TableEndpoint=[https://myendpoint/]";

Bir Azure Tablo Depolama istemcisi veya Azure Cosmos DB istemcisi oluşturmak için TableRestProxy sınıfını kullanmanız gerekir. Şunları yapabilirsiniz:

  • Bağlantı dizesini doğrudan geçirebilirsiniz veya
  • Bağlantı dizesi için birden çok dış kaynağı denetlemek için CloudConfigurationManager'ı (CCM) kullanın:
    • Varsayılan olarak, bir dış kaynak için destek içerir (ortam değişkenleri).
    • ConnectionStringSource sınıfını genişleterek yeni kaynaklar ekleyebilirsiniz.

Burada özetlenen örnekler için bağlantı dizesi doğrudan geçirilir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;

$tableClient = TableRestProxy::createTableService($connectionString);

Bir tablo oluşturma

TableRestProxy nesnesi, createTable yöntemini içeren bir tablo oluşturmanıza olanak tanır. Bir tablo oluştururken, Tablo hizmeti zaman aşımını ayarlayabilirsiniz. Tablo hizmeti zaman aşımı hakkında daha fazla bilgi için bkz. Tablo Hizmeti İşlemleri için Zaman Aşımlarını Ayarlama.

require_once 'vendor\autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create Table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

try    {
    // Create table.
    $tableClient->createTable("mytable");
}
catch(ServiceException $e){
    $code = $e->getCode();
    $error_message = $e->getMessage();
    // Handle exception based on error codes and messages.
    // Error codes and messages can be found here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
}

Tablo adlarındaki kısıtlamalar hakkında daha fazla bilgi için bkz. Tablo Hizmeti Veri Modelini anlama.

Tabloya bir varlık ekleme

Tabloya varlık eklemek için yeni bir Entity nesnesi oluşturun ve TableRestProxy-insertEntity'ye> geçirin. Bir varlık oluşturduğunuzda ve RowKeybelirtmeniz PartitionKey gerekir. Bu varlıklar bir varlığın benzersiz tanımlayıcılarıdır ve diğer varlık özelliklerine göre daha hızlı sorgulanabilen değerlerdir. Sistem tablonun varlıklarını birden çok depolama düğümlerine otomatik olarak dağıtmak için PartitionKey kullanır. Aynı PartitionKey değerine sahip varlıklar aynı düğümde depolanır. Aynı düğümde depolanan birden çok varlık üzerindeki işlemler, farklı düğümler arasında depolanan varlıklardan daha iyi performans gösterir. RowKey, bir bölümdeki varlığın benzersiz kimliğidir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Table\Models\Entity;
use MicrosoftAzure\Storage\Table\Models\EdmType;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

$entity = new Entity();
$entity->setPartitionKey("tasksSeattle");
$entity->setRowKey("1");
$entity->addProperty("Description", null, "Take out the trash.");
$entity->addProperty("DueDate",
                        EdmType::DATETIME,
                        new DateTime("2012-11-05T08:15:00-08:00"));
$entity->addProperty("Location", EdmType::STRING, "Home");

try{
    $tableClient->insertEntity("mytable", $entity);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
}

Tablo özellikleri ve türleri hakkında bilgi için bkz. Tablo Hizmeti Veri Modelini anlama.

TableRestProxy sınıfı, varlık eklemek için iki alternatif yöntem sunar: insertOrMergeEntity ve insertOrReplaceEntity. Bu yöntemleri kullanmak için yeni bir varlık oluşturun ve her iki yöntem için parametre olarak geçirin. Her yöntem, mevcut değilse varlığı ekler. Varlık zaten varsa, insertOrMergeEntity özellikler zaten varsa özellik değerlerini güncelleştirir ve yoksa yeni özellikler ekler; insertOrReplaceEntity ise var olan bir varlığın yerini tamamen alır. Aşağıdaki örnekte nasıl kullanılacağı insertOrMergeEntitygösterilmektedir. "tasksSeattle" ve RowKey "1" içeren PartitionKey varlık zaten yoksa, bu varlık eklenir. Ancak, zaten varsa (önceki örnekte gösterildiği gibi), DueDate özellik güncelleştirilir ve Status özellik eklenir. Description ve Location özellikleri de güncelleştirilir, ancak yerlerine geçen değerler onları gerçek anlamda değiştirmez. Bu son iki özellik örnekte gösterildiği gibi eklenmiyorsa ancak hedef varlıkta mevcutsa, mevcut değerleri değişmeden kalır.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Table\Models\Entity;
use MicrosoftAzure\Storage\Table\Models\EdmType;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

//Create new entity.
$entity = new Entity();

// PartitionKey and RowKey are required.
$entity->setPartitionKey("tasksSeattle");
$entity->setRowKey("1");

// If entity exists, existing properties are updated with new values and
// new properties are added. Missing properties are unchanged.
$entity->addProperty("Description", null, "Take out the trash.");
$entity->addProperty("DueDate", EdmType::DATETIME, new DateTime()); // Modified the DueDate field.
$entity->addProperty("Location", EdmType::STRING, "Home");
$entity->addProperty("Status", EdmType::STRING, "Complete"); // Added Status field.

try    {
    // Calling insertOrReplaceEntity, instead of insertOrMergeEntity as shown,
    // would simply replace the entity with PartitionKey "tasksSeattle" and RowKey "1".
    $tableClient->insertOrMergeEntity("mytable", $entity);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Tek bir varlık alma

TableRestProxy-getEntity> yöntemi, ve RowKeysorgusunu PartitionKey yaparak tek bir varlığı almanıza olanak tanır. Buradaki örnekte bölüm anahtarı ve satır anahtarı tasksSeattle1getEntity yöntemine geçirilir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

try    {
    $result = $tableClient->getEntity("mytable", "tasksSeattle", 1);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

$entity = $result->getEntity();

echo $entity->getPartitionKey().":".$entity->getRowKey();

Tüm varlıkları bir bölüme alma

Varlık sorguları filtreler kullanılarak oluşturulur. Daha fazla bilgi için bkz. Tabloları ve Varlıkları Sorgulama. Bölümdeki tüm varlıkları almak için filtresini PartitionKey eq partition_namekullanın. Aşağıdaki örnekte, queryEntities yöntemine bir filtre geçirerek tasksSeattle bölümündeki tüm varlıkları alma işlemi gösterilmiştir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

$filter = "PartitionKey eq 'tasksSeattle'";

try    {
    $result = $tableClient->queryEntities("mytable", $filter);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

$entities = $result->getEntities();

foreach($entities as $entity){
    echo $entity->getPartitionKey().":".$entity->getRowKey()."<br />";
}

Bir bölümdeki varlıkların alt kümesini alma

Önceki örnekte kullanılan aynı düzen, bir alt bölümdeki tüm varlıkların bir alt kümesini almak için kullanılabilir. Kullandığınız filtre, aldığınız varlıkların alt kümesini belirler. Daha fazla bilgi için bkz. Tabloları ve Varlıkları Sorgulama. Aşağıdaki örnekte, belirli ve belirtilen LocationDueDate tarihten küçük olan tüm varlıkları almak için filtrenin nasıl kullanılacağı gösterilmektedir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

$filter = "Location eq 'Office' and DueDate lt '2012-11-5'";

try    {
    $result = $tableClient->queryEntities("mytable", $filter);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

$entities = $result->getEntities();

foreach($entities as $entity){
    echo $entity->getPartitionKey().":".$entity->getRowKey()."<br />";
}

Varlık özellikleri alt kümesi alma

Bir sorgu, varlık özelliklerinin bir alt kümesini alabilir. Projeksiyon olarak adlandırılan bu teknik bant genişliğini azaltır ve özellikle büyük varlıklar için sorgu performansını artırabilir. Alınacak özelliği belirtmek için özelliğinin adını yöntemine Query->addSelectField geçirin. Daha fazla özellik eklemek için bu yöntemi birden çok kez çağırabilirsiniz. yürüttkten TableRestProxy->queryEntitiessonra, döndürülen varlıklar yalnızca seçili özelliklere sahip olur. Tablo varlıklarının bir alt kümesini döndürmek istiyorsanız, önceki sorgularda gösterildiği gibi bir filtre kullanın.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Table\Models\QueryEntitiesOptions;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

$options = new QueryEntitiesOptions();
$options->addSelectField("Description");

try    {
    $result = $tableClient->queryEntities("mytable", $options);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

// All entities in the table are returned, regardless of whether
// they have the Description field.
// To limit the results returned, use a filter.
$entities = $result->getEntities();

foreach($entities as $entity){
    $description = $entity->getProperty("Description")->getValue();
    echo $description."<br />";
}

Varlığı güncelleştirme

Varlıkta Entity-setProperty ve Entity-addProperty>> yöntemlerini kullanarak ve ardından TableRestProxy-updateEntity> çağırarak var olan bir varlığı güncelleştirebilirsiniz. Aşağıdaki örnekte bir varlık getirilir, bir özellik değiştirilir, bir başka özellik kaldırılır ve yeni bir özellik eklenir. Bir özelliğin değerini null olarak ayarlayarak özelliği kaldırabilirsiniz.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Table\Models\Entity;
use MicrosoftAzure\Storage\Table\Models\EdmType;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

$result = $tableClient->getEntity("mytable", "tasksSeattle", 1);

$entity = $result->getEntity();
$entity->setPropertyValue("DueDate", new DateTime()); //Modified DueDate.
$entity->setPropertyValue("Location", null); //Removed Location.
$entity->addProperty("Status", EdmType::STRING, "In progress"); //Added Status.

try    {
    $tableClient->updateEntity("mytable", $entity);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Bir varlığı silme

Bir varlığı silmek için tablo adını ve varlığın PartitionKey ve RowKey öğelerini TableRestProxy-deleteEntity> yöntemine geçirin.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

try    {
    // Delete entity.
    $tableClient->deleteEntity("mytable", "tasksSeattle", "2");
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Eşzamanlılık denetimleri için, DeleteEntityOptions-setEtag> yöntemini kullanarak ve DeleteEntityOptions nesnesini deleteEntity'ye dördüncü parametre olarak geçirerek silinecek bir varlığın Etag'ini ayarlayabilirsiniz.

Toplu tablo işlemleri

TableRestProxy-batch> yöntemi, tek bir istekte birden çok işlem yürütmenizi sağlar. Buradaki desen BatchRequest nesnesine işlem eklemeyi ve ardından BatchRequest nesnesini TableRestProxy-batch> yöntemine geçirmeyi içerir. Bir BatchRequest nesnesine işlem eklemek için aşağıdaki yöntemlerden herhangi birini birden çok kez çağırabilirsiniz:

Description
addInsertEntity insertEntity işlemi ekler
addUpdateEntity updateEntity işlemi ekler
addMergeEntity mergeEntity işlemi ekler
addInsertOrReplaceEntity insertOrReplaceEntity işlemi ekler
addInsertOrMergeEntity insertOrMergeEntity işlemi ekler
addDeleteEntity deleteEntity işlemi ekler

Aşağıdaki örnekte insertEntity ve deleteEntity işlemlerinin tek bir istekte nasıl yürütüleceği gösterilmektedir.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Table\Models\Entity;
use MicrosoftAzure\Storage\Table\Models\EdmType;
use MicrosoftAzure\Storage\Table\Models\BatchOperations;

// Configure a connection string for Storage Table service.
$connectionString = "DefaultEndpointsProtocol=[http|https];AccountName=[yourAccount];AccountKey=[yourKey]"

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

// Create list of batch operation.
$operations = new BatchOperations();

$entity1 = new Entity();
$entity1->setPartitionKey("tasksSeattle");
$entity1->setRowKey("2");
$entity1->addProperty("Description", null, "Clean roof gutters.");
$entity1->addProperty("DueDate",
                        EdmType::DATETIME,
                        new DateTime("2012-11-05T08:15:00-08:00"));
$entity1->addProperty("Location", EdmType::STRING, "Home");

// Add operation to list of batch operations.
$operations->addInsertEntity("mytable", $entity1);

// Add operation to list of batch operations.
$operations->addDeleteEntity("mytable", "tasksSeattle", "1");

try    {
    $tableClient->batch($operations);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Toplu tablo işlemleri hakkında daha fazla bilgi için bkz. Varlık Grup işlemleri gerçekleştirme.

Bir tablo silme

Son olarak, tabloyu silmek için tablo adını TableRestProxy-deleteTable> yöntemine geçirin.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Table\TableRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;

// Create table REST proxy.
$tableClient = TableRestProxy::createTableService($connectionString);

try    {
    // Delete table.
    $tableClient->deleteTable("mytable");
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://learn.microsoft.com/rest/api/storageservices/Table-Service-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}