2010-06-28 4 views
0

글쎄,이 문제는 내가 다루었 던 아직 해결되지 않은 낡은 문제이기 때문에 새로운 접근 방식을 시도하고있다.PHP가 SOAP 응답을 일찍 보내겠습니까?

SOAP 응답을 일찍 보내는 방법 (스크립트 실행이 끝나기 전에)?

이러한 문제는 할당 된 시간을 완료하는 데 프로세스가 더 오래 걸리므로 30 초 전에 ACK 파일을 보내지 않으면 발생합니다.

플러시() 작동하지 않는,이 오류를 얻을 :

org.xml.sax.SAXParseException : XML 문서 구조를 시작하고 동일 법인 내에서 끝나야합니다. 플러시없이

() 나는이

org.xml.sax.SAXParseException 얻을 : 파일의 조기 종료를.

스크립트 프로세스는 완료하는 데 180 초가 걸릴 수 있으며 응답을 기다리는 서버는 시간 초과되기 전에 약 30 초 동안 만 대기합니다 (위의 오류의 원인).

이 문제를 해결할 수있는 방법에 대한 의견이 있으십니까? 여기

코드의 일부입니다 : 이것은 내가 수락하고 더 imcoming의 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 파일을 돌려 보내지 않습니다. ACK 제출 후 소켓을 닫고 처리를 계속할 수있는 방법이있어 보내는 서버에서 이러한 시간 초과 문제가 발생하지 않습니까?

답변

1

내가 아는 한 30 초 제한에 대해서는 아무 것도 할 수 없으며 스크립트가 끝나기 전에 출력이 플러시되지 않습니다. 처리 논리를 2 개로 분할 할 수 있습니까?

  1. 메시지를 받아들이는 작업을 기록하고 즉시 ACK를 보낸 다음 종료하는 "Listener"스크립트입니다.
  2. 귀하의 실제 처리 시간이 오래 걸릴 수 있습니다.

은 "수행 할 작업"(나에게 너무 유망한 pcntl_fork() 기능에 대한 의견을 확인하지만 그들은 보이지 않는) 새로 생성 된 프로세스가 될 수 또는 일부 방법은 파일이나 데이터베이스에 데이터를 저장하는 예를 들어 매 5 분마다 실행되도록 예약 된 다른 스크립트로 정기적으로 처리합니까?

어떻게하면 60 초를 절약하면 발신 메시지를 Apex의 콜 아웃으로 다시 쓸 수 있습니다. 기본적으로 SOAP 봉투를 작성하고 http 주소로 보냅니다. 그것을 방아쇠에 넣을 수 있습니다. 이 방법의 한계에 대해서는 here을 참조하십시오.


다른 고함 :

  1. 나는 세일즈 포스에 ACK 정말 "문제"를 생각하지 않습니다. 아웃 바운드 메시지는 알림입니다. Ack = true/false에서 애플리케이션의 다른 부분에 의존합니까? 그렇지 않으면 맹목적으로 ack = true를 보내는 청취자 & 일정은 실제로 갈 방법 일 수 있습니다.)
  2. 다른 queston에서 나는 기본적으로 당신의 편이 DB에 업데이트를 저장해야한다는 것을 이해했습니다. 감사 목적으로 OM을 사용하면 안된다는 것을 알았습니까? (Link, "audit"검색).
  3. PHP를 활성화하는 것이 더 간단하지 않습니까? Salesforce에 [SELECT ID, Name From Account LastModifiedDate> : lastTimeYouQueried]를 쿼리하도록 하시겠습니까? 그런 식으로 결과를 처리 할 수있는 시간이 항상 걸릴 수 있습니다 :)
1

a) (선택 사항) 실행 시간 제한을 늘리기 위해 set_time_limit()를 사용할 수 있습니다.

b) 귀하는 예를 들어, WSDL 클라이언트 객체에 시간을 증가해야합니다

$clientwsdl->setOpt('timeout', 300); // if you are using PEAR:SOAP. 

대부분의 WSDL 클래스는 타임 아웃을 정의 할 수 있습니다.

c) 아니요. SOAP을 사용하여 일찍 응답 할 수는 없으며 최소한 하나의 호출 만 사용하면됩니다. SOAP은 XML을 반환하므로 부분 XML은 일반적으로 유효하지 않습니다 (닫는 태그가 누락 됨).

30|50|70|80|20 
30|50|70|80|20 
30|50|70|80|20 
:

$fp=fopen("http://www.mysite.com/url.php","r"); 

는 XML을 사용하지 않고 열 (또는 값의 어떤 종류를 반환 url.php :

D) 대체, 당신은 URL을 읽는 예를 들어, SOAP 이외의 방법을 사용할 수 있습니다

+0

입력을 주셔서 감사합니다. setOpt()를 설정하는 데 문제가 있고 다른 fopen 메서드는 XML에서 변경할 수 없습니다. –