PHP отправляют ответ SOAP рано?

Хорошо это - старая проблема, я имел дело с и все еще никакое решение, таким образом пробуя новый подход.

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

1
задан Phill Pafford 28 June 2010 в 15:26
поделиться

2 ответа

Насколько Я знаю, что мы ничего не можем сделать с 30-секундным ограничением, и вывод не будет сброшен до завершения скрипта. Можете ли вы попробовать разделить логику обработки на 2 части?

  1. Сценарий «Listener», который принимает сообщения, регистрирует выполняемые задания и мгновенно отправляет ACK, а затем завершает работу.
  2. Фактическая обработка на вашей стороне, которая может занять больше времени.

«Работа, которую нужно сделать» может быть недавно созданным процессом (посмотрите комментарии к функции pcntl_fork () , но они мне не кажутся слишком многообещающими) или каким-то способом сохранить данные в файле или базе данных и периодически обрабатывать их другим сценарием, например, запускать его каждые 5 минут?

Если 60 секунд каким-то образом спасут вас, вы можете переписать исходящее сообщение в запрос из Apex. Обычно вы затем пишете свой собственный конверт SOAP и отправляете его на любой адрес http. Вы можете вставить его в триггер. См. здесь , чтобы узнать об ограничениях этого подхода.


Другие высказывания:

  1. Я не думаю, что ваш ACK действительно «имеет значение» для отдела продаж. Исходящие сообщения - это просто уведомления. Вы полагаетесь на Ack = true / false где-нибудь еще в своем приложении? Если нет - слушатель, который вслепую отправляет ack = true и планирует работу, действительно может быть подходящим вариантом;)
  2. Из другого квестона я понял, что вам просто нужно хранить обновления в БД на своей стороне. Вы понимаете, что не должны использовать OM для аудита, верно? ( Ссылка , ищите «аудит»).
  3. Не было бы проще сделать PHP активной стороной? сделать запрос в Salesforce для [ВЫБРАТЬ идентификатор, имя из учетной записи WHERE LastModifiedDate>: lastTimeYouQueried]? Таким образом, вы можете потратить столько времени на обработку результатов :)
1
ответ дан 2 September 2019 в 23:26
поделиться

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
1
ответ дан 2 September 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: