Ну, это старая проблема, с которой я столкнулся, и до сих пор нет решения, поэтому пытаюсь применить новый подход.
Как я могу отправить ответ 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 и продолжить обработку, чтобы я не получил эти проблемы с таймаутом на отправляющем сервере?