Salesforce может отправить до 100 запросов в одном сообщении SOAP.При отправке этого типа запроса на сообщение Bulk 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-файл для предстоящего 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?
Я также проверил, просто принимая SOAP-ответ на 100 запросов и просто принимая и отправляя ACK, очередь очищается, поэтому я знаю, что это на моей стороне.
Я не вижу ошибок вВ журнале apache скрипт работает нормально.
Я нашел некоторую информацию на сайте Salesforce, но все равно не повезло.Вот ссылка .
Также я использую PHP Toolkit 11 (From Salesforce).
Другой форум с хорошей помощью SF
Спасибо за понимание, --Phill
ОБНОВЛЕНИЕ:
Если я получаю входящее сообщение и распечатываю ответ, должно ли это произойти первым, независимо от того, буду ли я делать что-то ещепосле?Или он ждет завершения моего процесса, а затем распечатывает ответ?
ОБНОВЛЕНИЕ № 2:
хорошо, я думаю, у меня проблема: PHP использует однопотоковый подход и не будет отправлять обратно файл ACK, пока поток не завершит свою обработку.Есть ли способ сделать это многопоточным процессом?Поток # 1 - принять входящий запрос SOAP и отправить обратно ACK Поток # 2 - обработать запрос SOAP
Я знаю, что могу разбить его на таблицу БД или простой файл, но есть ли способсделать это без этого?
Я попытаюсь закрыть сокет после отправки ACK и продолжить обработку, скрестив пальцы, это сработает.