Хорошо это - старая проблема, я имел дело с и все еще никакое решение, таким образом пробуя новый подход.
Как я могу отправить th ответ SOAP рано (Прежде чем выполнение сценария закончится)?
Этими проблемами является причина, когда файл ACK не отправляется перед 30 секундами, поскольку процесс занимает больше времени для завершения затем выделенного времени.
сброс () не работа, получите эту ошибку:
org.xml.sax. SAXParseException: структуры документа XML должны запуститься и закончиться в том же объекте.
без сброса () я получаю это
org.xml.sax. SAXParseException: Преждевременный конец файла.
Процесс сценария может поглощение, которого 180 секунд для завершения и сервер, ожидающий ответа только, ожидают в течение приблизительно 30 секунд прежде, чем привести к таймауту (Которые вызывают вышеупомянутую ошибку).
какие-либо мысли относительно того, как я могу зафиксировать это?
Вот часть кода: Это - то, как я принимаю и отправляю файл 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);
}
PHP использует единственный подход обработки потока и не передаст файл ACK обратно, пока поток не завершился, она обрабатывает. Там некоторый путь состоит в том, чтобы закрыть сокет после представления ACK и продолжить обработку, таким образом, я не получаю эти проблемы тайм-аута о передающем сервере?
Насколько Я знаю, что мы ничего не можем сделать с 30-секундным ограничением, и вывод не будет сброшен до завершения скрипта. Можете ли вы попробовать разделить логику обработки на 2 части?
«Работа, которую нужно сделать» может быть недавно созданным процессом (посмотрите комментарии к функции pcntl_fork () , но они мне не кажутся слишком многообещающими) или каким-то способом сохранить данные в файле или базе данных и периодически обрабатывать их другим сценарием, например, запускать его каждые 5 минут?
Если 60 секунд каким-то образом спасут вас, вы можете переписать исходящее сообщение в запрос из Apex. Обычно вы затем пишете свой собственный конверт SOAP и отправляете его на любой адрес http. Вы можете вставить его в триггер. См. здесь , чтобы узнать об ограничениях этого подхода.
Другие высказывания:
a) (необязательно) вы можете использовать set_time_limit () для увеличения временного лимита времени выполнения.
б) Вы должны увеличить время для клиентского объекта wsdl, например:
$clientwsdl->setOpt('timeout', 300); // if you are using PEAR:SOAP.
Большинство классов wsdl позволяют определять время ожидания.
c) и нет, вы не можете ответить раньше, используя SOAP, по крайней мере, используя один вызов. Учтите, что SOAP возвращает XML, поэтому частичный XML обычно недействителен (в нем отсутствует закрывающий тег).
d) В качестве альтернативы, вы можете использовать другой метод, кроме SOAP, например чтение URL:
$fp=fopen("http://www.mysite.com/url.php","r");
, где url.php возвращает столбцы (или какое-либо значение без использования xml:
30|50|70|80|20
30|50|70|80|20
30|50|70|80|20