Använda Service Bus med PHP

I den här artikeln får du lära dig hur du skapar PHP-program för att skicka meddelanden till och ta emot meddelanden från en Service Bus kö.

Viktigt

Från och med februari 2021 har Azure SDK för PHP gått in i en tillbakaingsfas och stöds inte längre officiellt av Microsoft. Mer information finns i det här meddelandet på GitHub. Den här artikeln kommer snart att dras tillbaka.

Förutsättningar

  1. En Azure-prenumeration. Du behöver ett Azure-konto för att genomföra kursen. Du kan aktivera dina MSDN-prenumerantförmåner eller registrera dig för ett kostnadsfritt konto.
  2. Om du inte har någon kö att arbeta med följer du stegen i artikeln Använda Azure Portal för att skapa en Service Bus för att skapa en kö.
    1. Läs snabböversikten över Service Bus köer.

    2. Skapa ett Service Bus namnområde.

    3. Hämta anslutningssträngen.

      Anteckning

      Du skapar en kö i Service Bus med hjälp av PHP i den här artikeln.

  3. Azure SDK för PHP

Skapa ett PHP-program

Det enda kravet för att skapa ett PHP-program som har åtkomst till Azure Blob Service är att referera till klasser i Azure SDK för PHP inifrån din kod. Du kan använda alla utvecklingsverktyg för att skapa ditt program eller Anteckningar.

Anteckning

PHP-installationen måste också ha OpenSSL-tillägget installerat och aktiverat.

I den här guiden använder du tjänstfunktioner som kan anropas inifrån ett PHP-program lokalt, eller i kod som körs i en Azure-webbroll, arbetsroll eller webbplats.

Hämta Azure-klientbiblioteken

Installera via Composer

  1. Skapa en fil med namnet composer.js i roten i projektet och Lägg till följande kod i den:

    {
      "require": {
        "microsoft/windowsazure": "*"
      }
    }
    
  2. Hämta Composer. Phar i projekt roten.

  3. Öppna en kommando tolk och kör följande kommando i projekt roten

    php composer.phar install
    

Konfigurera ditt program att använda Service Bus

Om du vill Service Bus api:er för kön gör du följande:

  1. Referera till autoloader-filen med hjälp require_once instruktionen.
  2. Referera till alla klasser som du kan använda.

I följande exempel visas hur du inkluderar autoloader-filen och refererar till ServicesBuilder klassen .

Anteckning

Det här exemplet (och andra exempel i den här artikeln) förutsätter att du har installerat PHP-klientbiblioteken för Azure via Composer. Om du har installerat biblioteken manuellt eller som ett PEAR-paket måste du referera till autoloader-filen för WindowsAzure.php.

require_once 'vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;

I exemplen nedan visas alltid -instruktionen, men endast de klasser require_once som krävs för att köra exemplet refereras.

Konfigurera en Service Bus anslutning

För att instansiera Service Bus klient måste du först ha en giltig anslutningssträng i det här formatet:

Endpoint=[yourEndpoint];SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[Primary Key]

Där Endpoint vanligtvis har formatet [yourNamespace].servicebus.windows.net .

Om du vill skapa en Azure-tjänstklient måste du använda ServicesBuilder klassen . Du kan:

  • Skicka anslutningssträngen direkt till den.
  • Använd CloudConfigurationManager (CCM) för att kontrollera anslutningssträngen för flera externa källor:
    • Som standard levereras stöd för en extern källa – miljövariabler
    • Du kan lägga till nya källor genom att utöka ConnectionStringSource klassen

I exemplen som beskrivs här anges anslutningssträngen direkt.

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;

$connectionString = "Endpoint=[yourEndpoint];SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[Primary Key]";

$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

Skapa en kö

Du kan utföra hanteringsåtgärder för Service Bus köer via ServiceBusRestProxy klassen . Ett ServiceBusRestProxy -objekt konstrueras via ServicesBuilder::createServiceBusService fabriksmetoden med en lämplig anslutningssträng som kapslar in tokenbehörigheterna för att hantera det.

I följande exempel visas hur du instansierar ett ServiceBusRestProxy - och -anrop ServiceBusRestProxy->createQueue för att skapa en kö med namnet i ett myqueue MySBNamespace namnområde för tjänsten:

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\QueueInfo;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    $queueInfo = new QueueInfo("myqueue");

    // Create queue.
    $serviceBusRestProxy->createQueue($queueInfo);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Anteckning

Du kan använda metoden listQueuesServiceBusRestProxy -objekt för att kontrollera om en kö med ett angivet namn redan finns i ett namnområde.

Skicka meddelanden till en kö

Om du vill skicka ett meddelande Service Bus en kö anropar programmet ServiceBusRestProxy->sendQueueMessage metoden . Följande kod visar hur du skickar ett meddelande till kön myqueue som tidigare skapats i MySBNamespace tjänstens namnområde.

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\BrokeredMessage;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    // Create message.
    $message = new BrokeredMessage();
    $message->setBody("my message");

    // Send message.
    $serviceBusRestProxy->sendQueueMessage("myqueue", $message);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Meddelanden som skickas till (och tas emot från) Service Bus köer är instanser av klassen BrokeredMessage. BrokeredMessage-objekt har en uppsättning standardmetoder och egenskaper som används för att lagra anpassade programspecifika egenskaper och en uppsättning godtyckliga programdata.

Service Bus har stöd för en maximal meddelandestorlek på 256 kB på standardnivån och 100 MB på Premium nivån. Rubriken, som inkluderar standardprogramegenskaperna och de anpassade programegenskaperna, kan ha en maximal storlek på 64 kB. Det finns ingen gräns för antalet meddelanden som kan finnas i en kö men det finns ett tak för den totala storleken för de meddelanden som ligger i en kö. Den här övre gränsen för köstorleken är 5 GB.

Ta emot meddelanden från en kö

Det bästa sättet att ta emot meddelanden från en kö är att använda en ServiceBusRestProxy->receiveQueueMessage metod. Meddelanden kan tas emot i två olika lägen: ReceiveAndDelete och PeekLock. PeekLock är standard.

När du använder läget ReceiveAndDelete är mottagning en engångsåtgärd. Det innebär att när Service Bus tar emot en läsbegäran för ett meddelande i en kö, markerar det meddelandet som förbrukat och returnerar det till programmet. Läget ReceiveAndDelete är den enklaste modellen och fungerar bäst för scenarier där ett program kan tolerera icke-bearbetning av ett meddelande om ett fel inträffar. För att förstå detta kan du föreställa dig ett scenario där konsumenten utfärdar en receive-begäran och sedan kraschar innan den kan bearbeta denna begäran. Eftersom Service Bus har markerat meddelandet som förbrukat kommer programmet att ha missat meddelandet som förbrukades innan kraschen när programmet startas om och börjar använda meddelanden igen.

I standardläget PeekLock blir mottagandet av ett meddelande en åtgärd i två steg, vilket gör det möjligt att stödja program som inte tolererar att meddelanden saknas. När Service Bus tar emot en begäran hittar den nästa meddelande som ska användas, låser det för att hindra andra användare från att ta emot den och returnerar det sedan till programmet. När programmet har slutfört bearbetningen av meddelandet (eller lagrar det på ett tillförlitligt sätt för framtida bearbetning) slutför det andra steget i mottagningsprocessen genom att skicka det mottagna meddelandet till ServiceBusRestProxy->deleteMessage . När Service Bus ser deleteMessage anropet markeras meddelandet som förbrukat och tas bort från kön.

I följande exempel visas hur du tar emot och bearbetar ett meddelande med PeekLock-läget (standardläget).

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\ReceiveMessageOptions;

// Create Service Bus REST proxy.
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);

try    {
    // Set the receive mode to PeekLock (default is ReceiveAndDelete).
    $options = new ReceiveMessageOptions();
    $options->setPeekLock();

    // Receive message.
    $message = $serviceBusRestProxy->receiveQueueMessage("myqueue", $options);
    echo "Body: ".$message->getBody()."<br />";
    echo "MessageID: ".$message->getMessageId()."<br />";

    /*---------------------------
        Process message here.
    ----------------------------*/

    // Delete message. Not necessary if peek lock is not set.
    echo "Message deleted.<br />";
    $serviceBusRestProxy->deleteMessage($message);
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here:
    // https://docs.microsoft.com/rest/api/storageservices/Common-REST-API-Error-Codes
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}

Hantera programkrascher och oläsbara meddelanden

Service Bus innehåller funktioner som hjälper dig att återställa fel i programmet eller lösa problem med bearbetning av meddelanden på ett snyggt sätt. Om ett mottagarprogram av någon anledning inte kan bearbeta meddelandet kan det anropa metoden för det mottagna unlockMessage meddelandet (i stället för deleteMessage metoden ). Detta gör att Service Bus låser upp meddelandet i kön och gör det tillgängligt att tas emot igen, antingen av samma användningsprogram eller av ett annat användningsprogram.

Det finns också en tidsgräns som är associerad med ett meddelande som är låst i kön, och om programmet inte kan bearbeta meddelandet innan tidsgränsen för låsning upphör att gälla (till exempel om programmet kraschar) kommer Service Bus att låsa upp meddelandet automatiskt och göra det tillgängligt för att kunna tas emot igen.

Om programmet kraschar efter att meddelandet har bearbetats men innan begäran utfärdas, skickas meddelandet vidare till programmet när deleteMessage det startas om. Detta kallas ofta för bearbetning minst en gång. Det innebär att varje meddelande bearbetas minst en gång, men i vissa situationer kan samma meddelande levereras igen. Om scenariot inte tolererar duplicerad bearbetning rekommenderar vi att du lägger till ytterligare logik i program för att hantera duplicerad meddelandeleverans. Detta uppnås ofta med hjälp av getMessageId metoden för meddelandet, som är konstant under leveransförsök.

Anteckning

Du kan hantera Service Bus resurser med Service Bus Explorer. Med Service Bus Explorer kan användarna ansluta till en Service Bus och administrera meddelandeentiteter på ett enkelt sätt. Verktyget innehåller avancerade funktioner som import/export-funktioner eller möjligheten att testa ämne, köer, prenumerationer, vidarebefordranstjänster, meddelandehubbbar och händelsehubbbar.

Nästa steg

Nu när du har lärt dig grunderna för hur Service Bus köer, se Köer, ämnen och prenumerationer för mer information.

Mer information finns också i PHP Developer Center.