Salesforce может отправлять до 100 запросов внутри 1 сообщения SOAP. При отправке запроса типа Bulk Ooutbound мой PHP-скрипт завершает выполнение, но SF не может принять ACK, используемый для очистки очереди сообщений на стороне Salesforce. Глядя на журнал исходящих сообщений (мониторинг), я вижу все сообщения в ожидающем состоянии с причиной отказа поставки «java.net.SocketTimeoutException: Read timed out». Если мой скрипт завершил выполнение, почему я получаю эту ошибку?
Я пробовал эти методы, чтобы увеличить время выполнения на моем сервере, поскольку у меня нет доступа на стороне Salesforce:
Я использовал высокие настройки только для тестирования.
Любые мысли о том, почему это приводит к отказу в доставке 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.
Две вещи, которые вы могли бы попробовать:
Откройте билет поддержки с Salesforce, чтобы узнать, могут ли они увеличить значение таймаута для исходящих сообщений. По моему опыту, существует множество настроек, которые они могут изменять на уровне организации – это может быть один из них.
Выгрузите обработку ваших данных, чтобы ACK сразу отправляется в Salesforce. Тогда фактическая обработка ваших данных будет происходить асинхронно. то есть. Очередь сообщений, отдельный поток и т. Д.
Некоторые другие ресурсы, которые могут быть полезны:
обсуждение форума Salesforce
Документация по исходящим сообщениям
Я думаю, что они тайм-аут, ожидающий завершения вашего сценария.
Есть способ, которым вы могли бы исправить это.
Выведите конверт с сообщением ack в начале, а затем промойте предмет, чтобы его сервер получил его до завершения обработки. Нет нитей, просто приоритеты переосмысления 🙂
прочитайте это для получения наилучшей информации по смыву содержимого
Вы на 100% уверены, что Salesforce будет ждать времени, в течение которого ваши скрипты тоже будут работать? 80 секунд кажутся мне слишком долго.
Если все запросы не удались, я бы предположил, что Salesforce ожидает, что вы правильно установите заголовок Content-Type
, но это, похоже, не так.
Я не знаю о Salesforce, но если вы хотите сделать многопоточность с PHP, вы должны взглянуть на этот пример кода и точнее на pcntl_fork () .
NB: pcntl не включен по умолчанию и не будет работать на платформах Windows.
Так что я сделал:
Просто принимая необработанные данные, разбор по полям и вставка их в БД происходит довольно быстро. Затем я выдаю команду командной строки Linux, которая также отправляет сценарий обработки в фоновом режиме. Затем я отправляю файл ACK в SF, и скрипт заканчивается в течение отведенного времени. Это громоздко разделить процесс скрипта на два отдельных этапа, но он работает.