Salesforce / PHP – массовое исходящее сообщение (SOAP), проблема с тайм-аутом – см. Обновление # 2

Salesforce может отправлять до 100 запросов внутри 1 сообщения SOAP. При отправке запроса типа Bulk Ooutbound мой PHP-скрипт завершает выполнение, но SF не может принять ACK, используемый для очистки очереди сообщений на стороне Salesforce. Глядя на журнал исходящих сообщений (мониторинг), я вижу все сообщения в ожидающем состоянии с причиной отказа поставки «java.net.SocketTimeoutException: Read timed out». Если мой скрипт завершил выполнение, почему я получаю эту ошибку?

Я пробовал эти методы, чтобы увеличить время выполнения на моем сервере, поскольку у меня нет доступа на стороне Salesforce:

  • set_time_limit (0); // в скрипте
  • max_execution_time = 360; Максимальное время выполнения каждого скрипта в секундах
  • max_input_time = 360; Максимальный период времени, в течение которого каждый сценарий может тратить данные запроса синтаксического анализа
  • memory_limit = 32M; Максимальный объем памяти, который может использовать сценарий

Я использовал высокие настройки только для тестирования.

Любые мысли о том, почему это приводит к отказу в доставке ACK обратно в Salesforce?

Вот некоторые из кода: Вот как я принимаю и отправляю ACK-файл для входящего запроса SOAP

$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 SOAP-ответе), но как только я перейду, я получаю ошибку тайм-аута в очереди Salesforce. для 50 запросов обычно берет мой PHP-скрипт 86.77 секунд.

Может быть, это Apache? PHP?

Я также протестировал только прием ответа на 100 запросов SOAP и просто принятие и отправку ACK, когда очередь очищается, поэтому я знаю, что это на моей стороне вещей.

Я не вижу ошибок в журнале apache, сценарий работает нормально.

Я нашел некоторую информацию на сайте Salesforce, но до сих пор не повезло. Вот ссылка .

Также я использую PHP Toolkit 11 (From Salesforce).

Другие форумы

Спасибо за любое понимание этого, –Phill

ОБНОВИТЬ:

Если я получу входящее сообщение и распечатаю ответ, должно ли это произойти первым, независимо от того, сделаю ли я что-нибудь еще после? Или он ждет завершения моего процесса, а затем распечатает ответ?

ОБНОВЛЕНИЕ # 2:

хорошо, я думаю, что у меня есть проблема: PHP использует один подход к обработке потоков и не отправит обратно ACK-файл, пока поток не завершит его обработку. Есть ли способ сделать это чересстрочным процессом? Тема №1 – принять входящий запрос SOAP и отправить обратно ACK Thread # 2 – Обработать запрос SOAP

Я знаю, что могу разбить его как таблицу DB или плоский файл, но есть ли способ сделать это, не делая этого?

Я попытаюсь закрыть сокет после подачи ACK и продолжить обработку, перейдя по пальцам, это сработает.

Похоже, исходящее сообщение попадает в таймаут. Другие пользователи сообщают о тайм-аутах всего за 10 секунд (см. Ссылку на форум ниже). Экземпляр песочницы, который я использую (cs1), отключается через 1 минуту после моего тестирования. Возможно, что тайм-аут – это уровень организации или уровня экземпляра, который контролирует Salesforce.

Две вещи, которые вы могли бы попробовать:

  1. Откройте билет поддержки с Salesforce, чтобы узнать, могут ли они увеличить значение таймаута для исходящих сообщений. По моему опыту, существует множество настроек, которые они могут изменять на уровне организации – это может быть один из них.

  2. Выгрузите обработку ваших данных, чтобы ACK сразу отправляется в Salesforce. Тогда фактическая обработка ваших данных будет происходить асинхронно. то есть. Очередь сообщений, отдельный поток и т. Д.

Некоторые другие ресурсы, которые могут быть полезны:

обсуждение форума Salesforce

Документация по исходящим сообщениям

Я думаю, что они тайм-аут, ожидающий завершения вашего сценария.

Есть способ, которым вы могли бы исправить это.

Выведите конверт с сообщением ack в начале, а затем промойте предмет, чтобы его сервер получил его до завершения обработки. Нет нитей, просто приоритеты переосмысления 🙂

прочитайте это для получения наилучшей информации по смыву содержимого

Вы на 100% уверены, что Salesforce будет ждать времени, в течение которого ваши скрипты тоже будут работать? 80 секунд кажутся мне слишком долго.

Если все запросы не удались, я бы предположил, что Salesforce ожидает, что вы правильно установите заголовок Content-Type , но это, похоже, не так.

Я не знаю о Salesforce, но если вы хотите сделать многопоточность с PHP, вы должны взглянуть на этот пример кода и точнее на pcntl_fork () .

NB: pcntl не включен по умолчанию и не будет работать на платформах Windows.

Так что я сделал:

  1. Принять все входящие OBM, проанализировать их в БД
  2. Когда это делается, удалите процесс, который работает в фоновом режиме (на самом деле я отправляю его на задний план, чтобы сценарий мог закончиться)
  3. Отправить ACK-файл обратно

Просто принимая необработанные данные, разбор по полям и вставка их в БД происходит довольно быстро. Затем я выдаю команду командной строки Linux, которая также отправляет сценарий обработки в фоновом режиме. Затем я отправляю файл ACK в SF, и скрипт заканчивается в течение отведенного времени. Это громоздко разделить процесс скрипта на два отдельных этапа, но он работает.