Что ж, это старая проблема, с которой я сталкивался и до сих пор не решена, поэтому пытаюсь применить новый подход.
Как я могу отправить SOAP-ответ раньше (до завершения выполнения скрипта)?
Эти проблемы возникают, когда файл ACK не отправляется до 30 секунд, поскольку процесс занимает больше времени, чем выделенное время.
flush () не работает, получите эту ошибку:
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 и продолжить обработку, чтобы у меня не возникало этих проблем с таймаутом на отправляющем сервере?