Salesforce / PHP - Toplu Giden mesaj (SOAP), Zaman aşımı sorunu - güncelleme # 2 bakın

5 Cevap java

Salesforce 1 SABUN mesajın içinde 100 istekleri gönderebilirsiniz. Toplu Ooutbound bu tür bir ileti gönderirken benim PHP komut dosyası yürütülmesi tamamlandığında ancak SF ACK şeylerin Salesforce tarafında mesajı kuyruğunu temizlemek için kullanılan kabul başarısız isteyin. Giden mesajı log (izleme) bakarak ben Teslim Arıza Nedeni ile bekleyen bir devlet tüm iletileri görmek "java.net.SocketTimeoutException: Okuma aşımına uğradı". Benim komut yürütme bitmiş varsa, neden bu hatayı alıyorum?

Ben Salesforce tarafında erişimi yok gibi benim sunucuda yürütme süresini artırmak için bu yöntemleri denedi:

  • set_time_limit (0); / / Komut
  • max_execution_time = 360; Saniye içinde her komut Maksimum yürütme zamanı,
  • max_input_time = 360; Her komut isteği verileri ayrıştırma harcayabileceğiniz zaman maksimum miktarı
  • memory_limit = 32M; Bir komut dosyası tüketebilir azami bellek miktarını

Ben sadece test için yüksek ayarları kullandım.

Herhangi bir bu geri Salesforce ACK teslim başarısız neden olarak düşünce?

Here is some of the code: This is how I accept and send the ACK file for the imcoming SOAP request

$data = 'php://input';
$content = file_get_contents($data);

if($content) {
    respond('true');
} else {
    respond('false');
}

Cevap fonksiyonu

function respond($tf) {
    $ACK = <<<ACK
<?xml version = "1.0" encoding = "utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <notifications xmlns="http://soap.sforce.com/2005/09/outbound">
            <Ack>$tf</Ack>
        </notifications>
    </soapenv:Body>
</soapenv:Envelope>
ACK;

    print trim($ACK); 
}

Bunlar, belirli bir iş akışı için verileri kullanan komut dosyası içeren genel bir komut vardır. Ben Salesforce kuyrukta zaman aşımı hatası alıyorum üzerine gitmek keresinde yaklaşık 25 istekleri (1 SOAP yanıt That) ama işleyebilir. 50 istekleri için genellikle benim PHP komut dosyası 86.77 saniye sürer.

O Apache olabilir mi? PHP?

Ben de sadece 100 istek SOAP yanıtı kabul ve sadece kabul ve ACK sıra temizler göndererek test ettik, bu yüzden şeyler benim tarafımda olduğunu biliyorum.

Ben apache günlüğünde hataları göstermek, senaryo iyi çalışır.

Ben Salesforce sitedeki bazı bilgiler, ancak hala şans buldum. İşte the link.

Ayrıca ben (Salesforce itibaren) PHP Toolkit 11 kullanıyorum.

Other forum with good SF help

Thanks for any insight into this, --Phill

GÜNCELLEME:

Ben gelen mesajı almak ve yanıtı yazdırmak Eğer ben sonra başka bir şey yaparsanız, bu ilk bağımsız gerçekleşmesi gerekir? Benim süreci tamamlamak ve daha sonra yanıtı yazdırmak için ya da beklemek nedir?

GÜNCELLEME 2:

okay I think I have the problem: PHP uses the single thread processing approach and will not send back the ACK file until the thread has completed it's processing. Is there a way to make this a mutli thread process? Thread #1 - accept the incoming SOAP request and send back the ACK Thread #2 - Process the SOAP request

Ben DB tablo veya düz dosya gibi bölmek olabileceğini biliyorum, ama bu yapmadan bunu gerçekleştirmek için bir yol var?

Ben ACK sunulmasından sonra yuva kapatın ve işleme devam, bu iş olacak benim parmak geçmeye denemek için gidiyorum.

5 Cevap

Peki ne yaptık olduğunu:

  1. DB onları ayrıştırmak, gelen tüm OBM en kabul
  2. Bu arka planda çalışan bir sürecin tekme yapıldığında (Aslında ben bu kadar komut sona erebilir arka göndermek)
  3. ACK dosyayı geri gönder

Sadece ham verileri kabul alanlara ayrıştırma ve DB takarak oldukça hızlıdır. Sonra da arka planda çalıştırmak için işleme komut göndermek bir Linux komut satırı komutu. Sonra sf ACK dosya göndermek ve komut dosyası ayrılan süre içinde biter. Bu iki ayrı etap halinde komut sürecini bölmek için hantal ama çalışıyor.

Giden mesajı aşımı vuruyor gibi geliyor. Diğer kullanıcılar, 10 saniye (aşağıdaki bağlantıya bakınız forum) gibi düşük zaman aşımı bildirilmiştir. I (CS1) kullanan Sandbox örnek benim test, yaklaşık 1 dakika sonra aşımına uğruyor. Bu zaman aşımı, bir kuruluş veya Salesforce kontrol ettiğini örnek seviyesi ayarı olduğunu mümkündür.

Eğer deneyebilirsiniz iki şey:

  1. Open a support ticket with Salesforce to see if they can increase the timeout value for outbound messages. From my experience, there are lot of settings that they can modify on the organization level - this might be one of them.

  2. Offload processing of your data, so that the ACK is sent immediately back to Salesforce. Then the actual processing of your data will take place asynchronously. ie. Message queue, separate thread, etc.

Yararlı olabilecek bazı diğer kaynaklar:

related Salesforce forum discussion

Outbound messaging documentation

Ben Sizin komut bitirmek için bekleyen şeyi zaman aşımı düşünüyorum.

Bunu düzeltmek için deneyebilirsiniz bir yolu var.

Bu işlem sonunda önce kendi sunucu bunu alır, böylece daha sonra çıkış başında bildirim mesajı ile zarf ve bir şey yıkayın. Hayır diş, yeniden düşünmek sadece düz öncelikleri :)

read this for best info on flushing content

Salesforce sizin komut çalıştırmak çok ihtiyaç süreyi bekleyeceği% 100 emin misin? 80 saniye bana çok loong süre gibi görünebilir.

Tüm istekleri başarısız olursa ben Salesforce uygun şekilde Content-Type başlığı ayarlamak için beklediğini tahmin ediyorum, ama bu durum görünmüyor.

Ben Salesforce hakkında bilmiyorum, ama PHP ile bazı çoklu yapmak istiyorsanız this code example bir göz atın ve daha doğrusu pcntl_fork() olmaları gerekmektedir.

NB: PCNTL not varsayılan olarak etkin ve Windows platformlarında çalışacak etmeyecek.