Salesforce/PHP - رسالة خارجية بالجملة (SOAP) ، مشكلة الوقت - انظر التحديث رقم 2

StackOverflow https://stackoverflow.com/questions/2472746

سؤال

يمكن لـ Salesforce إرسال ما يصل إلى 100 طلب داخل رسالة صابون واحدة. أثناء إرسال هذا النوع من رسالة OoutBound للرسالة الكبيرة ، ينتهي البرنامج النصي PHP الخاص بي ، لكن SF فشل في قبول ACK المستخدمة لمسح قائمة انتظار الرسائل على جانب Salesforce من الأشياء. بالنظر إلى سجل الرسائل الخارجي (المراقبة) ، أرى جميع الرسائل في حالة معلقة مع سبب فشل التسليم "java.net.sockettimeoutexception: اقرأ توقيت الخروج". إذا انتهى البرنامج النصي الخاص بي ، فلماذا أحصل على هذا الخطأ؟

لقد جربت هذه الطرق لزيادة وقت التنفيذ على الخادم الخاص بي حيث لا يمكنني الوصول إلى جانب Salesforce:

  • set_time_limit (0) ؛ // في البرنامج النصي
  • max_execution_time = 360 ؛ الحد الأقصى لوقت التنفيذ لكل نص ، في ثوانٍ
  • max_input_time = 360 ؛ الحد الأقصى لمقدار الوقت قد ينفق كل نص على تحليل بيانات الطلب
  • Memory_limit = 32m ؛ أقصى قدر من الذاكرة قد يستهلكه البرنامج النصي

لقد استخدمت الإعدادات العالية فقط للاختبار.

أي أفكار حول سبب فشل هذا في تسليم ACK إلى Salesforce؟

فيما يلي بعض الرمز: هذه هي الطريقة التي أقبل بها وأرسل ملف ACK لطلب الصابون القادم

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

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

وظيفة الاستجابة

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); 
}

هذه في برنامج نصي عام أقوم بتضمينه في البرنامج النصي الذي يستخدم البيانات لسير عمل محدد. يمكنني معالجة حوالي 25 طلبًا (موجودًا في استجابة 1 صابون) ولكن بمجرد أن أتغلب على خطأ المهلة في قائمة انتظار Salesforce. بالنسبة لـ 50 طلبًا ، عادةً ما يأخذ برنامج PHP الخاص بي 86.77 ثانية.

هل يمكن أن يكون أباتشي؟ بي أتش بي؟

لقد اختبرت أيضًا مجرد قبول استجابة صابون 100 طلب وقبول وإرسال ACK.

لا أظهر أي أخطاء في سجل Apache ، يتم تشغيل البرنامج النصي بشكل جيد.

لقد وجدت بعض المعلومات على موقع Salesforce ولكن لا حظ. هنا الرابط.

كما أنني أستخدم مجموعة أدوات PHP 11 (من Salesforce).

منتدى آخر بمساعدة SF جيدة

شكرا على أي نظرة ثاقبة على هذا ، -فيل

تحديث:

إذا تلقيت الرسالة الواردة وطباعة الرد ، فهل يجب أن يحدث هذا أولاً بغض النظر عما إذا كنت أفعل أي شيء آخر بعد؟ أم أنها تنتظر حتى تنتهي عملي ثم طباعة الاستجابة؟

تحديث رقم 2:

حسنًا ، أعتقد أن لدي المشكلة: يستخدم PHP نهج معالجة مؤشرات الترابط الواحد ولن أرسل ملف ACK حتى يكمل مؤشر الترابط معالجته. هل هناك طريقة لجعل هذه عملية خيط Mutli؟ الموضوع رقم 1 - قبول طلب الصابون الواردة وأرسل مؤشر ترابط ACK #2 - معالجة طلب SOAP

أعلم أنه يمكنني تقسيمه إلى جدول DB أو ملف مسطح ، ولكن هل هناك طريقة لإنجاز ذلك دون القيام بذلك؟

سأحاول إغلاق المقبس بعد تقديم ACK ومواصلة المعالجة ، وعبور أصابعي أنها ستعمل.

هل كانت مفيدة؟

المحلول 5

إذن ما فعلته هو:

  1. قبول كل OBM الواردة ، تحليلهم في ديسيبل
  2. عندما يتم ذلك ركلة عملية تعمل في الخلفية (في الواقع أرسلها إلى الخلفية حتى ينتهي البرنامج النصي)
  3. إرسال ملف ACK مرة أخرى

من خلال قبول البيانات الأولية ، فإن التحليل في الحقول وإدخالها في ديسيبل سريع إلى حد ما. ثم أقوم بإصدار أمر سطر أوامر Linux يرسل أيضًا البرنامج النصي المعالجة لتشغيله في الخلفية. ثم أرسل ملف ACK إلى SF وينتهي البرنامج النصي خلال الوقت المخصص. من المرهق تقسيم عملية البرنامج النصي إلى مرحلتين منفصلتين ولكنها تعمل.

نصائح أخرى

يبدو أن الرسالة الصادرة تصل إلى المهلة. أبلغ المستخدمون الآخرون عن مهنات منخفضة تصل إلى 10 ثوان (انظر رابط المنتدى أدناه). يتم توقيت مثيل Sandbox الذي أستخدمه (CS1) بعد حوالي دقيقة واحدة ، من الاختبار. من الممكن أن تكون المهلة هي إعداد مستوى المنظمة أو المثيل الذي يتحكم فيه Salesforce.

شيئان يمكنك تجربتهما:

  1. افتح تذكرة دعم مع Salesforce لمعرفة ما إذا كان يمكنهم زيادة قيمة المهلة للرسائل الخارجية. من تجربتي ، هناك الكثير من الإعدادات التي يمكنهم تعديلها على مستوى المؤسسة - قد يكون هذا أحدها.

  2. تفريغ معالجة بياناتك ، بحيث يتم إرسال ACK على الفور إلى Salesforce. ثم ستحدث المعالجة الفعلية لبياناتك بشكل غير متزامن. بمعنى آخر. قائمة انتظار الرسائل ، موضوع منفصل ، إلخ.

بعض الموارد الأخرى التي قد تكون مفيدة:

مناقشة منتدى Salesforce ذات الصلة

وثائق المراسلة الخارجية

أعتقد أنهم مهلة الشيء الذي ينتظر أن ينتهي البرنامج النصي الخاص بك.

هناك طريقة يمكن أن تحاول إصلاح هذا.

إخراج الظرف برسالة ACK في البداية ثم قم بتدفق الشيء حتى يحصل عليه الخادم قبل انتهاء المعالجة. لا خيوط ، مجرد أولويات واضحة إعادة التفكير :)

اقرأ هذا للحصول على أفضل معلومات حول محتوى Flushing

هل أنت متأكد 100 ٪ من أن Salesforce ستنتظر مقدار الوقت الذي تحتاجه البرامج النصية الخاصة بك أيضًا؟ 80 ثانية تبدو وكأنها وقت طويل أيضًا.

إذا فشلت جميع الطلبات ، أعتقد أن Salesforce تتوقع منك تعيين Content-Type رأس مناسب ، ولكن هذا لا يبدو أنه هو الحال.

لا أعرف عن Salesforce ، ولكن إذا كنت ترغب مثال الرمز هذا وبشكل أدق ل pcntl_fork ().

NB: PCNTL هو ليس تم تمكينه افتراضيًا ولن يعمل على منصات Windows.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top