PHP'den Kuyruk Depolama'yı kullanma
İpucu
Microsoft Azure Depolama Gezgini’ni deneyin
Microsoft Azure Depolama Gezgini, Microsoft’un Windows, macOS ve Linux üzerinde Azure Depolama verileriyle görsel olarak çalışmanızı sağlayan ücretsiz ve tek başına uygulamasıdır.
Bu kılavuz, Azure Kuyruk Depolama hizmetini kullanarak yaygın senaryoları nasıl gerçekleştirebileceğinizi gösterir. Örnekler PHP için Azure Depolama istemci kitaplığından sınıflar aracılığıyla yazılır. Kapsanan senaryolar kuyruk iletilerini ekleme, göz atma, alma ve silmenin yanı sıra kuyrukları oluşturmayı ve silmeyi içerir.
Kuyruk depolama nedir?
Azure Kuyruk depolama, HTTP veya HTTPS kullanan kimlik doğrulaması yapılmış çağrılar aracılığıyla dünyanın her yerinden erişilebilen çok sayıda iletinin depolanması için bir hizmettir. Tek bir kuyruk iletisinin boyutu 64 KB’ye kadar olabilir ve bir kuyrukta, depolama hesabının toplam kapasite sınırına kadar milyonlarca ileti bulunabilir. Kuyruk depolama genellikle zaman uyumsuz olarak işlenmek üzere bir iş kapsamı oluşturmak için kullanılır.
Kuyruk hizmeti kavramları
Azure Kuyruk hizmeti aşağıdaki bileşenleri içerir:
Depolama Hesabı: Azure Depolama'ya tüm erişim bir depolama hesabı üzerinden gerçekleştirilir. Depolama hesapları hakkında daha fazla bilgi için bkz. Depolama hesabına genel bakış.
Kuyruk: Kuyrukta bir dizi ileti vardır. Tüm iletiler bir kuyrukta olmalıdır. Kuyruk adının tamamen küçük harfli olması gerektiğini unutmayın. Kuyrukların adlandırılması hakkında daha fazla bilgi için bkz. Kuyrukları ve Meta Verileri Adlandırma.
İleti: İleti, biçimi ne olursa olsun en çok 64 KB büyüklüktedir. Bir iletinin kuyrukta kalabileceği en uzun süre 7 gündür. Sürüm 2017-07-29 veya üzeri için yaşam süresi üst sınırı herhangi bir pozitif sayı veya iletinin süresinin dolmadığını belirten -1 olabilir. Bu parametre atlanırsa, varsayılan yaşam süresi yedi gündür.
URL biçimi: Kuyruklar şu URL biçimi kullanılarak adreslenebilir: http://
<storage account>
.queue.core.windows.net/<queue>
Aşağıdaki URL diyagramdaki bir kuyruğun adresini belirtir:
http://myaccount.queue.core.windows.net/incoming-orders
Azure depolama hesabı oluşturma
İlk Azure depolama hesabınızı oluşturmanın en kolay yolu Azure Portalı’nı kullanmaktır. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.
Azure PowerShell, Azure CLI veya .NET için Azure Depolama Kaynak Sağlayıcısı’nı da kullanarak Azure depolama hesabı oluşturabilirsiniz.
Şu anda Azure'da depolama hesabı oluşturmamayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azurite depolama öykünücüsü de kullanabilirsiniz. Daha fazla bilgi için bkz. Yerel Azure Depolama geliştirmesi için Azurite öykünücüsü kullanma.
PHP uygulaması oluşturma
Azure Kuyruk Depolama'ya erişen bir PHP uygulaması oluşturmak için tek gereksinim, kodunuzun içinden PHP için Azure Depolama istemci kitaplığındaki 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, yerel olarak php uygulamasında veya Azure'daki bir web uygulamasında çalışan kodda çağrılabilen Kuyruk Depolama hizmeti özelliklerini kullanacaksınız.
Azure istemci kitaplıklarını alma
Oluşturucu aracılığıyla yükleme
Projenizin kökünde adlı
composer.json
bir dosya oluşturun ve aşağıdaki kodu ekleyin:{ "require": { "microsoft/azure-storage-queue": "*" } }
Proje köküne indirin
composer.phar
.Bir komut istemi açın ve proje kökünde aşağıdaki komutu çalıştırın:
php composer.phar install
Alternatif olarak, kaynak kodu kopyalamak için GitHub'da Azure Depolama PHP istemci kitaplığına gidin.
Uygulamanızı Kuyruk Depolama'ya erişecek şekilde yapılandırma
Azure Kuyruk Depolama API'lerini kullanmak için şunları yapmanız gerekir:
- deyimini kullanarak
require_once
autoloader dosyasına başvurun. - Kullanabileceğiniz tüm sınıflara başvurun.
Aşağıdaki örnekte otomatik yükleyici dosyasının nasıl dahil olduğu ve sınıfına nasıl başvuracakları gösterilmektedir QueueRestProxy
.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
Aşağıdaki örneklerde deyimi require_once
her zaman gösterilir, ancak yalnızca örneği çalıştırmak için gereken sınıflara başvurulur.
Azure Depolama bağlantısı ayarlama
Azure Kuyruk Depolama istemcisi örneği oluşturmak için önce geçerli bir bağlantı dizesine sahip olmanız gerekir. Kuyruk Depolama bağlantı dizesinin biçimi aşağıdaki gibidir.
Canlı hizmete erişmek için:
DefaultEndpointsProtocol=[http|https];AccountName=[yourAccount];AccountKey=[yourKey]
Öykünücü depolama alanına erişmek için:
UseDevelopmentStorage=true
Azure Kuyruk Depolama istemcisi oluşturmak için sınıfını QueueRestProxy
kullanmanız gerekir. Aşağıdaki tekniklerden birini kullanabilirsiniz:
- Bağlantı dizesini doğrudan ona geçirin.
- Bağlantı dizesini depolamak için web uygulamanızda ortam değişkenlerini kullanın. Bağlantı dizelerini yapılandırmak için bkz. Azure web uygulaması yapılandırma ayarları belgesi.
Burada özetlenen örnekler için bağlantı dizesi doğrudan geçirilir.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
$queueClient = QueueRestProxy::createQueueService($connectionString);
Bir kuyruk oluşturma
QueueRestProxy
Nesnesi, yöntemini kullanarak kuyruk oluşturmanıza CreateQueue
olanak tanır. Kuyruk oluştururken kuyrukta seçenekleri ayarlayabilirsiniz, ancak bunu yapmak gerekli değildir. Bu örnekte bir kuyrukta meta verilerin nasıl ayarlanacağı gösterilmektedir.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Queue\Models\CreateQueueOptions;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
// OPTIONAL: Set queue metadata.
$createQueueOptions = new CreateQueueOptions();
$createQueueOptions->addMetaData("key1", "value1");
$createQueueOptions->addMetaData("key2", "value2");
try {
// Create queue.
$queueClient->createQueue("myqueue", $createQueueOptions);
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
Not
Meta veri anahtarları için büyük/küçük harf duyarlılığına güvenmemelisiniz. Tüm anahtarlar hizmetten küçük harfle okunur.
Kuyruğa ileti ekleme
Kuyruğa ileti eklemek için kullanın QueueRestProxy->createMessage
. yöntemi kuyruk adını, ileti metnini ve ileti seçeneklerini (isteğe bağlıdır) alır.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Queue\Models\CreateMessageOptions;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
try {
// Create message.
$queueClient->createMessage("myqueue", "Hello, World");
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
Sonraki iletiye gözatın
çağrısı QueueRestProxy->peekMessages
yaparak kuyruktan kaldırmadan kuyruğun önündeki bir veya daha fazla iletiye göz atabilirsiniz. Varsayılan olarak yöntemi peekMessage
tek bir ileti döndürür, ancak yöntemini kullanarak PeekMessagesOptions->setNumberOfMessages
bu değeri değiştirebilirsiniz.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Queue\Models\PeekMessagesOptions;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
// OPTIONAL: Set peek message options.
$message_options = new PeekMessagesOptions();
$message_options->setNumberOfMessages(1); // Default value is 1.
try {
$peekMessagesResult = $queueClient->peekMessages("myqueue", $message_options);
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
$messages = $peekMessagesResult->getQueueMessages();
// View messages.
$messageCount = count($messages);
if($messageCount <= 0){
echo "There are no messages.<br />";
}
else{
foreach($messages as $message) {
echo "Peeked message:<br />";
echo "Message Id: ".$message->getMessageId()."<br />";
echo "Date: ".date_format($message->getInsertionDate(), 'Y-m-d')."<br />";
echo "Message text: ".$message->getMessageText()."<br /><br />";
}
}
Sonraki iletiyi sıradan çıkarmak
Kodunuz iki adımda kuyruktan bir iletiyi kaldırır. İlk olarak çağrısı yaparsınız QueueRestProxy->listMessages
ve bu da iletiyi kuyruktan okuyan diğer kodlar için görünmez hale getirir. Varsayılan olarak bu ileti 30 saniye görünmez kalır. (İleti bu süre içinde silinmezse kuyrukta yeniden görünür hale gelir.) İletiyi kuyruktan kaldırmayı tamamlamak için çağrısında QueueRestProxy->deleteMessage
bulunması gerekir. bir iletiyi kaldırmanın bu iki adımlı işlemi, kodunuz donanım veya yazılım hatası nedeniyle bir iletiyi işleyemediğinde kodunuzun başka bir örneğinin aynı iletiyi alıp yeniden denemesini sağlar. İleti işlendikten hemen sonra kodunuz çağrılar deleteMessage
.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
// Get message.
$listMessagesResult = $queueClient->listMessages("myqueue");
$messages = $listMessagesResult->getQueueMessages();
$message = $messages[0];
/* ---------------------
Process message.
--------------------- */
// Get message ID and pop receipt.
$messageId = $message->getMessageId();
$popReceipt = $message->getPopReceipt();
try {
// Delete message.
$queueClient->deleteMessage("myqueue", $messageId, $popReceipt);
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
Kuyruğa alınan iletinin içeriğini değiştirme
çağrısı QueueRestProxy->updateMessage
yaparak kuyruktaki bir iletinin içeriğini yerinde değiştirebilirsiniz. Eğer ileti bir iş görevini temsil ediyorsa, bu özelliği kullanarak iş görevinin durumunu güncelleştirebilirsiniz. Aşağıdaki kod kuyruk iletisini yeni içeriklerle güncelleştirir ve görünürlük zaman aşımını 60 saniye daha uzatacak şekilde ayarlar. Bu, iletiyle ilişkili işin durumunu kaydeder ve istemciye ileti üzerinde çalışmaya devam etmesi için bir dakika daha verir. Bu tekniği, donanım veya yazılım hatası nedeniyle bir işlem adımı başarısız olursa baştan başlamak zorunda kalmadan kuyruk iletilerinde çok adımlı iş akışlarını izlemek için kullanabilirsiniz. Genellikle bir yeniden deneme sayacı tutmanı gerekir ve bir ileti n seferden daha fazla yeniden denenirse, silebilirsiniz. Bu, her işlendiğinde bir uygulama hatası tetikleyen bir iletiye karşı koruma sağlar.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Get message.
$listMessagesResult = $queueClient->listMessages("myqueue");
$messages = $listMessagesResult->getQueueMessages();
$message = $messages[0];
// Define new message properties.
$new_message_text = "New message text.";
$new_visibility_timeout = 5; // Measured in seconds.
// Get message ID and pop receipt.
$messageId = $message->getMessageId();
$popReceipt = $message->getPopReceipt();
try {
// Update message.
$queueClient->updateMessage("myqueue",
$messageId,
$popReceipt,
$new_message_text,
$new_visibility_timeout);
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
İletileri sıralamak için ek seçenekler
Kuyruktan ileti almayı özelleştirmenin iki yolu vardır. İlk olarak toplu iletiler alabilirsiniz (en fazla 32). İkincisi, kodunuzun her iletiyi tam olarak işlemesine daha fazla veya daha az zaman tanıyarak daha uzun veya daha kısa bir görünürlük zaman aşımı ayarlayabilirsiniz. Aşağıdaki kod örneği, bir çağrıda getMessages
16 ileti almak için yöntemini kullanır. Ardından bir döngü kullanarak for
her iletiyi işler. Ayrıca her ileti için görünmezlik zaman aşımı beş dakika olarak ayarlanır.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
use MicrosoftAzure\Storage\Queue\Models\ListMessagesOptions;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
// Set list message options.
$message_options = new ListMessagesOptions();
$message_options->setVisibilityTimeoutInSeconds(300);
$message_options->setNumberOfMessages(16);
// Get messages.
try{
$listMessagesResult = $queueClient->listMessages("myqueue",
$message_options);
$messages = $listMessagesResult->getQueueMessages();
foreach($messages as $message){
/* ---------------------
Process message.
--------------------- */
// Get message Id and pop receipt.
$messageId = $message->getMessageId();
$popReceipt = $message->getPopReceipt();
// Delete message.
$queueClient->deleteMessage("myqueue", $messageId, $popReceipt);
}
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
Kuyruk uzunluğunu alma
Bir kuyruktaki ileti sayısı ile ilgili bir tahmin alabilirsiniz. yöntemi kuyruk QueueRestProxy->getQueueMetadata
hakkındaki meta verileri alır.
getApproximateMessageCount
Döndürülen nesnede yönteminin çağrılması, kuyrukta kaç ileti olduğunu gösterir. Kuyruk Depolama isteğinize yanıt verdikten sonra iletiler eklenebildiği veya kaldırılabildiği için bu sayı yaklaşıktır.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
try {
// Get queue metadata.
$queue_metadata = $queueClient->getQueueMetadata("myqueue");
$approx_msg_count = $queue_metadata->getApproximateMessageCount();
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
echo $approx_msg_count;
Bir kuyruk silme
Bir kuyruğu ve içindeki tüm iletileri silmek için yöntemini çağırın QueueRestProxy->deleteQueue
.
require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;
use MicrosoftAzure\Storage\Common\Exceptions\ServiceException;
$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
// Create queue REST proxy.
$queueClient = QueueRestProxy::createQueueService($connectionString);
try {
// Delete queue.
$queueClient->deleteQueue("myqueue");
}
catch(ServiceException $e){
// Handle exception based on error codes and messages.
// Error codes and messages are here:
// https://msdn.microsoft.com/library/azure/dd179446.aspx
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
}
Sonraki adımlar
Azure Kuyruk Depolama'nın temellerini öğrendiğinize göre, daha karmaşık depolama görevleri hakkında bilgi edinmek için şu bağlantıları izleyin:
- Azure Depolama PHP istemci kitaplığı için API başvurusunu ziyaret edin
- Gelişmiş kuyruk örneğine bakın.
Daha fazla bilgi için bkz. PHP geliştirici merkezi.