A Queue Storage használata PHP-ből

Tipp

Próbálja ki a Microsoft Azure Storage Explorert

A Microsoft Azure Storage Explorer egy ingyenes, önálló alkalmazás, amelynek segítségével vizuálisan dolgozhat Azure Storage-adatokkal Windows, macOS és Linux rendszereken.

Ez az útmutató bemutatja, hogyan hajthat végre gyakori forgatókönyveket az Azure Queue Storage szolgáltatás használatával. A minták az Azure Storage PHP-hez készült ügyfélkódtárából származó osztályokon keresztül íródnak. A tárgyalt forgatókönyvek közé tartozik az üzenetsor-üzenetek beszúrása, betekintése, beolvasása és törlése, valamint az üzenetsorok létrehozása és törlése.

Mi az a Queue Storage?

Az Azure Queue Storage szolgáltatás üzenetek nagy számban történő tárolására szolgál, amelyek HTTP- vagy HTTPS-kapcsolattal, hitelesített hívásokon keresztül a világon bárhonnan elérhetők. Egyetlen üzenetsor akár 64 KB méretű is lehet, és a tárfiók maximális kapacitásán belül több millió üzenetet tartalmazhat. Az üzenetsortárat gyakran használják az aszinkron feldolgozáshoz szükséges munka hátralékának létrehozására.

Üzenetsor-szolgáltatás fogalmai

Az Azure Queue szolgáltatás a következő összetevőket tartalmazza:

Az Azure Queue szolgáltatás összetevői

  • Tárfiók: Az Azure Storage-hoz való hozzáférés egy tárfiókon keresztül történik. További információ a tárfiókokról: Tárfiókok áttekintése.

  • Üzenetsor: Az üzenetsorok üzenetek készleteit tartalmazzák. Az összes üzenetnek üzenetsorban kell lennie. Vegye figyelembe, hogy az üzenetsor neve csak kisbetűket tartalmazhat. Az üzenetsorok elnevezésével kapcsolatos információkat lásd: Naming Queues and Metadata (Üzenetsorok és metaadatok elnevezése).

  • Üzenet: Egy legfeljebb 64 KB méretű, tetszőleges méretű üzenet. Egy üzenet legfeljebb 7 napig maradhat egy üzenetsorban. A 2017-07-29-es vagy újabb verzió esetén a maximális élettartam bármilyen pozitív szám lehet, vagy -1, amely azt jelzi, hogy az üzenet nem jár le. Ha ez a paraméter nincs megadva, az alapértelmezett élettartam hét nap.

  • URL-cím formátuma: Az üzenetsorok a következő URL-címformátummal címezhetők: http://<storage account>.queue.core.windows.net/<queue>

    Az ábra egyik üzenetsora a következő URL-címmel érhető el:

    http://myaccount.queue.core.windows.net/incoming-orders

Azure-tárfiók létrehozása

Az első Azure Storage-fiók létrehozásának legegyszerűbb módja a Azure Portal használata. További tudnivalókért lásd: Create a storage account (Tárfiók létrehozása).

Ezenkívül az Azure PowerShell, az Azure CLI, illetve a .NET-keretrendszerhez készült Azure Storage erőforrás-szolgáltató használatával is létrehozhat egy Azure-tárfiókot.

Ha jelenleg nem szeretne tárfiókot létrehozni az Azure-ban, az Azurite storage emulátor használatával helyi környezetben is futtathatja és tesztelheti a kódot. További információ: Az Azurite emulátor használata helyi Azure Storage-fejlesztéshez.

PHP-alkalmazás létrehozása

Az Azure Queue Storage-hoz hozzáférő PHP-alkalmazások létrehozásának egyetlen követelménye a PHP-hez készült Azure Storage-ügyfélkódtár osztályainak hivatkozása a kódból. Az alkalmazás létrehozásához bármilyen fejlesztői eszközt (pl. Jegyzettömböt) használhat.

Ebben az útmutatóban a Queue Storage szolgáltatás olyan funkcióit fogja használni, amelyek meghívhatók helyileg egy PHP-alkalmazásban, vagy egy azure-beli webalkalmazásban futó kódban.

Az Azure-ügyfélkódtárak lekérése

Telepítés zeneszerzővel

  1. Hozzon létre egy nevű composer.json fájlt a projekt gyökerében, és adja hozzá a következő kódot:

    {
      "require": {
        "microsoft/azure-storage-queue": "*"
      }
    }
    
  2. Töltse le composer.phar a projekt gyökerét.

  3. Nyisson meg egy parancssort, és futtassa a következő parancsot a projektgyökérben:

    php composer.phar install
    

Másik lehetőségként lépjen az Azure Storage PHP-ügyfélkódtárra a GitHubon a forráskód klónozásához.

Az alkalmazás konfigurálása a Queue Storage eléréséhez

Az Azure Queue Storage API-jának használatához a következőket kell elvégeznie:

  1. Hivatkozzon az autoloader fájlra az require_once utasítás használatával.
  2. Hivatkozzon az esetlegesen használt osztályokra.

Az alábbi példa bemutatja, hogyan lehet belefoglalni az autoloader fájlt, és hivatkozni az osztályra QueueRestProxy .

require_once 'vendor/autoload.php';
use MicrosoftAzure\Storage\Queue\QueueRestProxy;

Az alábbi példákban az require_once utasítás mindig megjelenik, de csak a példa futtatásához szükséges osztályokra hivatkozunk.

Azure Storage-kapcsolat beállítása

Az Azure Queue Storage-ügyfél példányosításához először érvényes kapcsolati sztring kell rendelkeznie. A Queue Storage kapcsolati sztring formátuma a következő.

Élő szolgáltatáshoz való hozzáféréshez:

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

Az emulátortároló eléréséhez:

UseDevelopmentStorage=true

Azure Queue Storage-ügyfél létrehozásához az QueueRestProxy osztályt kell használnia. Az alábbi technikák egyikét használhatja:

  • Adja át a kapcsolati sztring közvetlenül neki.
  • Használja a környezeti változókat a webalkalmazásban a kapcsolati sztring tárolásához. A kapcsolati sztringek konfigurálásához tekintse meg az Azure-webalkalmazás konfigurációs beállításainak dokumentumát.

Az itt ismertetett példák esetében a kapcsolati sztringet közvetlenül továbbítjuk.

require_once 'vendor/autoload.php';

use MicrosoftAzure\Storage\Queue\QueueRestProxy;

$connectionString = "DefaultEndpointsProtocol=http;AccountName=<accountNameHere>;AccountKey=<accountKeyHere>";
$queueClient = QueueRestProxy::createQueueService($connectionString);

Üzenetsor létrehozása

Az QueueRestProxy objektumok segítségével a metódussal létrehozhat egy üzenetsort CreateQueue . Üzenetsor létrehozásakor megadhatja az üzenetsor beállításait, de erre nincs szükség. Ez a példa bemutatja, hogyan állíthat be metaadatokat egy üzenetsoron.

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 />";
}

Megjegyzés

A metaadatkulcsok esetében ne támaszkodjon a kis- és nagybetűk érzékenységére. A szolgáltatás minden kulcsát kisbetűvel olvassa be a rendszer.

Üzenet hozzáadása üzenetsorhoz

Üzenet üzenetsorhoz való hozzáadásához használja a következőt QueueRestProxy->createMessage: . A metódus felveszi az üzenetsor nevét, az üzenet szövegét és az üzenet beállításait (amelyek nem kötelezőek).

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 />";
}

Betekintés a következő üzenetbe

Az üzenetsor elején egy vagy több üzenetre is betekinthet anélkül, hogy eltávolítaná őket az üzenetsorból a hívással QueueRestProxy->peekMessages. Alapértelmezés szerint a peekMessage metódus egyetlen üzenetet ad vissza, de ezt az értéket a PeekMessagesOptions->setNumberOfMessages metódus használatával módosíthatja.

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 />";
    }
}

A következő üzenet kivétele az üzenetsorból

A kód két lépésben távolít el egy üzenetet az üzenetsorból. Először hívja meg QueueRestProxy->listMessagesa () elemet, amely láthatatlanná teszi az üzenetet az üzenetsorból beolvasott többi kód számára. Alapértelmezés szerint az üzenet 30 másodpercig marad láthatatlan. (Ha az üzenet nem törlődik ebben az időszakban, az ismét láthatóvá válik az üzenetsoron.) Az üzenet üzenetsorból való eltávolításának befejezéséhez meg kell hívnia a következőt QueueRestProxy->deleteMessage: . Az üzenet eltávolításának kétlépéses folyamata biztosítja, hogy ha a kód hardver- vagy szoftverhiba miatt nem tudja feldolgozni az üzenetet, a kód egy másik példánya is megkaphatja ugyanazt az üzenetet, és újra próbálkozhat. A kód közvetlenül az üzenet feldolgozása után hív 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 />";
}

Üzenetsorban található üzenet tartalmának módosítása

Az üzenetsoron belüli üzenet tartalmát a hívásával QueueRestProxy->updateMessagemódosíthatja. Ha az üzenet munkafeladatot jelöl, ezzel a funkcióval frissítheti a munkafeladat állapotát. Az alábbi kód új tartalommal frissíti az üzenetsor üzenetét, és a láthatóság időtúllépését további 60 másodpercre állítja. Ez menti az üzenethez társított munka állapotát, és egy percet ad az ügyfélnek, hogy folytassa az üzeneten végzett munkát. Ezzel a technikával nyomon követheti a többlépéses munkafolyamatokat az üzenetsor-üzeneteken anélkül, hogy az elejétől kezdve újra kellene kezdenie, ha egy feldolgozási lépés hardver- vagy szoftverhiba miatt meghiúsul. A rendszer általában nyilván tartja az újrapróbálkozások számát, és ha az üzenettel n alkalomnál többször próbálkoznak, akkor törlődik. Ez védelmet biztosít az ellen, hogy egy üzenetet minden feldolgozásakor kiváltson egy alkalmazáshibát.

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 />";
}

További lehetőségek az üzenetek törléséhez

Kétféleképpen szabhatja testre az üzenetsorból történő üzenetlekérést. Az első lehetőség az üzenetkötegek (legfeljebb 32) lekérése. Másodszor beállíthat egy hosszabb vagy rövidebb láthatósági időtúllépést, így a kód többé-kevésbé időtúllépést biztosít az egyes üzenetek teljes feldolgozásához. Az alábbi példakód a getMessages metódust használja 16 üzenet lekérésére egy hívásban. Ezután egy hurok használatával for dolgozza fel az egyes üzeneteket. Mindemellett a láthatatlansági időkorlátot minden üzenethez öt percre állítja be.

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 />";
}

Üzenetsor hosszának lekérése

Megbecsülheti egy üzenetsorban található üzenetek számát. A QueueRestProxy->getQueueMetadata metódus lekéri az üzenetsor metaadatait. A metódus meghívása getApproximateMessageCount a visszaadott objektumon megadja, hogy hány üzenet található az üzenetsorban. A szám csak hozzávetőleges, mert az üzenetek hozzáadhatók vagy eltávolíthatók, miután a Queue Storage válaszolt a kérésére.

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;

Üzenetsor törlése

Ha törölni szeretne egy üzenetsort és az abban lévő összes üzenetet, hívja meg a metódust 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 />";
}

Következő lépések

Most, hogy megismerte az Azure Queue Storage alapjait, kövesse az alábbi hivatkozásokat az összetettebb tárolási feladatok megismeréséhez:

További információ: PHP fejlesztői központ.