PHP ile Service Bus kuyruklarını kullanma

Bu makalede, bir iş kuyruğuna ileti göndermek ve kuyruktan ileti almak için PHP uygulamaları Service Bus öğrenirsiniz.

Önemli

Şubat 2021'den itibaren PHP için Azure SDK'sı kullanımdan bırakma aşamasına girdi ve artık Microsoft tarafından resmi olarak desteklenmiyor. Daha fazla bilgi için bkz. GitHub. Bu makale kısa süre içinde kaldıracağız.

Önkoşullar

  1. Azure aboneliği. Bu öğreticiyi tamamlamak için bir Azure hesabınızın olması gerekir. MSDN abone avantajlarınızı etkinleştirebilirsiniz veya ücretsiz bir hesap için kaydolabilirsiniz.
  2. Üzerinde çalışılacak bir kuyruğuz yoksa, kuyruk oluşturmak için Azure portal kuyruğu oluşturmak için Service Bus kullanma makalesinde yer alan adımları izleyin.
    1. Kuyrukların hızlı genel Service Bus okuyun.

    2. Ad alanı Service Bus oluşturun.

    3. Bağlantı dizesini alır.

      Not

      Bu makalede PHP kullanarak Service Bus bir kuyruk oluşturacaktır.

  3. PHP için Azure SDK

PHP uygulaması oluşturma

Azure Blob hizmetine erişen bir PHP uygulaması oluşturmanın tek gereksinimi, kodunuzun içinde PHP için Azure SDK'daki sınıflara başvurmaktır. Herhangi bir geliştirme aracı kullanarak uygulama oluşturabilir veya Not Defteri.

Not

PHP yüklemenizde OpenSSL uzantısının da yüklü ve etkin olması gerekir.

Bu kılavuzda, bir PHP uygulamasından yerel olarak veya bir Azure web rolü, çalışan rolü veya web sitesi içinde çalışan kodda çağrılabilir hizmet özelliklerini kullanacağız.

Azure istemci kitaplıklarını edinin

Besteci aracılığıyla Install

  1. Projenizin kökünde composer.js adlı bir dosya oluşturun ve bu dosyaya aşağıdaki kodu ekleyin:

    {
      "require": {
        "microsoft/windowsazure": "*"
      }
    }
    
  2. Proje kökünde besteci. phar 'yi indirin.

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

    php composer.phar install
    

Service Bus'yi kullanmak için Service Bus

Kuyruk API'Service Bus kullanmak için şunları yapın:

  1. require_once deyimini kullanarak otomatik require_once bakın.
  2. Kullanabileceğiniz tüm sınıflara bakın.

Aşağıdaki örnekte autoloader dosyasının nasıl dahil olduğu ve sınıfına nasıl başvur olduğu ServicesBuilder gösterir.

Not

Bu örnekte (ve bu makaledeki diğer örneklerde) Azure için PHP İstemci Kitaplıkları'nın Composer. Kitaplıkları el ile veya BIR PEAR paketi olarak yüklemiş olursanız WindowsAzure.php otomatik yükleyici dosyasına başvurmalısınız.

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

Aşağıdaki örneklerde deyimi require_once her zaman gösterilir, ancak yalnızca örneğin yürütülecek sınıflar için gerekli olan sınıflara başvuracağız.

Bir Service Bus ayarlama

Bir istemciyi Service Bus için önce şu biçimde geçerli bir bağlantı dizesine sahip olun:

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

Burada Endpoint genellikle [yourNamespace].servicebus.windows.net biçimindedir.

Herhangi bir Azure hizmet istemcisi oluşturmak için sınıfını kullan ServicesBuilder gerekir. Seçenekleriniz şunlardır:

  • Bağlantı dizesini doğrudan bu dizeye geçin.
  • Bağlantı dizesi için birden çok dış kaynağı kontrol etmek üzere CloudConfigurationManager'ı (CCM) kullanın:
    • Varsayılan olarak, tek bir dış kaynak için destek ile birlikte gelir - ortam değişkenleri
    • sınıfını genişleterek yeni kaynaklar ConnectionStringSource ekleme

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

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;

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

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

Bir kuyruk oluşturma

Sınıf aracılığıyla kuyruklar için Service Bus işlemleri ServiceBusRestProxy gerçekleştirin. Bir ServiceBusRestProxy nesne, onu ServicesBuilder::createServiceBusService yönetmek için belirteç izinlerini kapsüller uygun bir bağlantı dizesiyle fabrika yöntemi aracılığıyla oluşturulur.

Aşağıdaki örnekte, bir hizmet ad alanı içinde adlı bir kuyruk oluşturmak için bir ve ServiceBusRestProxy ServiceBusRestProxy->createQueue çağrısının myqueue nasıl örneği MySBNamespace oluşturulacaktır:

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

Not

Belirtilen ad alanına sahip bir kuyruğun bir ad alanı içinde zaten var olup listQueues ServiceBusRestProxy oluğunu kontrol etmek için nesneler üzerinde yöntemini kullanabilirsiniz.

Kuyruğa ileti gönderme

Uygulamanız, bir Service Bus göndermek için yöntemini ServiceBusRestProxy->sendQueueMessage çağırarak. Aşağıdaki kod, daha önce hizmet ad alanı içinde oluşturulan myqueue kuyruğa ileti göndermeyi MySBNamespace gösterir.

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

Kuyruklara gönderilen (ve kuyruklardan alınan) Service Bus, BrokeredMessage sınıfının örnekleridir. BrokeredMessage nesneleri, özel uygulamaya özgü özellikleri ve rastgele uygulama verilerini tutmak için kullanılan standart yöntemler ve özellikler kümesine sahiptir.

Service Bus kuyrukları Standart katmanda en fazla 256 KB ileti boyutunu ve standart katmanda 100 MB'Premium destekler. Standart ve özel uygulama özelliklerini içeren üst bilginin maksimum dosya boyutu 64 KB olabilir. Kuyrukta tutulan ileti sayısına ilişkin bir sınır yoktur ancak kuyruk tarafından tutulan iletilerin toplam boyutu için uç sınır vardır. Kuyruk boyutu üst sınırı 5 GB'tır.

Kuyruktan ileti alma

Kuyruktan ileti almanın en iyi yolu yöntem ServiceBusRestProxy->receiveQueueMessage kullanmakdır. İletiler iki farklı modda alınabiliyor: ReceiveAndDelete ve PeekLock. PeekLock varsayılan değerdir.

ReceiveAndDelete modu kullanırken, alma tek bir işlemdir; başka bir Service Bus bir ileti için okuma isteği aldığında, iletiyi tüketiliyor olarak işaretler ve uygulamaya döndürür. ReceiveAndDelete modu, en basit modeldir ve uygulamanın hata oluştuğunda bir iletinin işlenmemesine izin verebileceği senaryolarda en iyi şekilde çalışır. Bu durumu daha iyi anlamak için müşterinin bir alma isteği bildirdiğini ve bu isteğin işlenmeden çöktüğünü varsayın. Bu Service Bus, iletiyi tüketiliyor olarak işaretlendikten sonra uygulama yeniden başlatıldığında ve iletileri yeniden tüketmaya başladığında, kilitlenmeden önce tüketilen iletiyi atlar.

Varsayılan PeekLock modunda, bir ileti almak iki aşamalı bir işlem haline gelir ve bu da eksik iletileri tolere edilemez uygulamaları desteklemeyi mümkün hale gelir. Bir Service Bus aldığında, bir sonraki tüketilen iletiyi bulur, diğer tüketicilerin bunu almalarını önlemek için kilitler ve sonra uygulamaya döndürür. Uygulama iletiyi işlemeyi tamamlandıktan (veya gelecekteki işleme için güvenilir bir şekilde depolandıktan) sonra, alınan iletiyi 'ye aktararak alma işleminin ikinci aşamasını ServiceBusRestProxy->deleteMessage tamamlar. Çağrıyı deleteMessage Service Bus, iletiyi tüketiliyor olarak işaretler ve kuyruktan kaldırır.

Aşağıdaki örnekte PeekLock modu (varsayılan mod) kullanılarak iletiyi alma ve işleme işlemi gösterir.

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

Uygulama çökmelerini ve okunmayan iletileri giderme

Service Bus, uygulamanızda gerçekleşen hataları veya ileti işlenirken oluşan zorlukları rahat bir şekilde ortadan kaldırmanıza yardımcı olmak için işlevsellik sağlar. Alıcı uygulama herhangi bir nedenle iletiyi işleyenene ise, alınan iletide unlockMessage yöntemini çağırabilirsiniz (yöntemi deleteMessage yerine). Bu, Service Bus içindeki iletinin kilidini açmanızı ve aynı tüketen uygulama veya başka bir tüketen uygulama tarafından tekrar alınabilecek hale göndermenizi sağlar.

Kuyrukta kilitlenmiş bir iletiyle ilişkili bir zaman aşımı da vardır ve uygulama kilit zaman aşımı dolmadan önce iletiyi işleyemezse (örneğin, uygulama kilitlenirse), Service Bus otomatik olarak iletinin kilidini açabilir ve yeniden alınamaz hale gelecektir.

Uygulamanın iletiyi işledikten sonra ancak istekten önce kilitlenmesi durumunda, ileti yeniden başlatıldığında uygulamaya deleteMessage yeniden teslim edilebilir. Bu genellikle En Az Bir Kez işleme olarak çağrılır; Diğer bir ifadeyle, her ileti en az bir kez işlenir, ancak bazı durumlarda aynı ileti yeniden teslim edile bir ileti olabilir. Senaryo yinelenen işlemeyi tolere edeyenese, yinelenen ileti teslimi işlemek için uygulamalara ek mantık eklemeniz önerilir. Bu genellikle ileti yöntemi kullanılarak elde edilir ve bu getMessageId yöntem teslim denemeleri arasında sabit kalır.

Not

Service Bus Explorer ile Service Bus yönetebilirsiniz. Service Bus Gezgini, kullanıcıların bir ad alanına Service Bus ve mesajlaşma varlıklarını kolay bir şekilde yönetmelerini sağlar. Araç, içeri/dışarı aktarma işlevi veya konu, kuyruk, abonelik, geçiş hizmetleri, bildirim hub'ları ve olay hub'larını test etme özelliği gibi gelişmiş özellikler sağlar.

Sonraki adımlar

Kuyrukları temel alan temel bilgileri Service Bus daha fazla bilgi için bkz. Kuyruklar, konular ve abonelikler.

Daha fazla bilgi için PHP Geliştirici Merkezi'ne de gidin.