2017-12-21 37 views
2

죄송합니다. 게시물이 길어서 구체적이지 않으려 고 노력하고 있습니다. 차가운 융합과 lucee에서 약간의 newb입니다. 그래서 여기에 근본적인 것을 놓친다면 저를 용서해주십시오. 나는 단지 빠른 POC를하려하지만, 작동시키지 못한다.

내가하려는 것은 페이지 호출을 만들고, 웹 페이지에 쓰고 잠시 동안 잠을 자려고하는 것입니다. 하트 비트의 종류. 모든 일이 일어나고 페이지 cfm 파일이 처리를 완료 할 때까지 웹 페이지에 쓰기 만하면됩니다. 나는 지난 2 일 동안 광범위하게 보았고 수많은 항목을 시도했지만 아무 소용이 없습니다.

내 index.cfm lucee 페이지에서 새 탭을 실행하고 내 cfm 파일을 호출하는 링크가 있습니다.
<a href="./pinger2.cfm" target="_blank"><img class="ploverride" src="/assets/img/Ping.png" alt="Ping Test" width="125" height="75">
여기서 아무런 문제가 없으며 새 탭이 열리고 pinger2.cfm이 처리를 시작합니다. 내가 바라는 부분은 테이블에 거의 즉시 인쇄하여 첫 번째 호출을 출력하고, 결과를 페이지에 인쇄하고, 잠자기하고, 다음 호출을 만들어 페이지로 인쇄하는 것입니다. 걱정 마라. 누구나 단서가 있습니까? 내가 거기에있는 다른 "적은 최고의보다"사례가 확실 해요,하지만 난 그냥이 신속하고 더러운 할 노력하고있어 :cfscript 안에있는 동안 웹 페이지로 어떻게 출력합니까?

<cfscript> 
    public struct function pinger(required string url, required string verb, required numeric timeout, struct body) 
    { 
     var result = { 
      success = false, 
      errorMessage = "" 
     }; 
     var httpService = new http(); 
     httpService.setMethod(arguments.verb); 
     httpService.setUrl(arguments.url); 
     httpService.setTimeout(arguments.timeout); 
     if(arguments.verb == "post" || arguments.verb == "put") 
     { 
      httpService.addParam(type="body", value=SerializeJSON(arguments.body)); 
     } 
     try { 
      callStart = getTickCount(); 
      var resultObject = httpService.send().getPrefix(); 
      callEnd = getTickCount(); 
      callLength = (callEnd-callStart)/1000; 
      if(isDefined("resultObject.status_code") && resultObject.status_code == 200) 
      { 
       result.success = true; 
       logMessage = "Pinger took " & toString(callLength) & " seconds."; 
       outLine = "<tr><td>" & resultObject.charset & "</td><td>" & resultObject.http_version & "</td><td>" & resultObject.mimetype & "</td><td>" & resultObject.status_code & "</td><td>" & resultObject.status_text & "</td><td>" & resultObject.statuscode & "</td><td>" & logMessage & "</td></tr>"; 
       writeOutput(outLine); 
       getPageContext().getOut().flush(); 
       return result; 
      } 
      else 
      { 
       throw("Status Code returned " & resultObject.status_code); 
      } 
     } 
     catch(Any e) { 
      // something went wrong with the request 
      writeDump(e); 
      abort; 
     } 
    } 
    outLine = "<table><tr><th>charset</th> <th>http_version</th>  <th>mimetype</th>  <th>status_code</th>  <th>status_text</th>  <th>statuscode</th>  <th>time</th> </tr>"; 
    writeOutput(outLine); 
    getPageContext().getOut().flush(); 
    intCounter = 0; 
    while(intCounter LT 2) 
    { 
     theResponse = pinger(
      url = "https://www.google.com", 
      verb = "GET", 
      timeout = 5 
     ); 
     intCounter = intCounter + 1; 
     getPageContext().getOut().flush(); 
     sleep(2000); 
    } 
outLine = "</table>"; 
writeOutput(outLine); 
</cfscript> 

참고 : pinger2.cfm 파일의 코드입니다.

나는 getPageContext().getOut().flush();이 트릭을 할 것이라고 생각했지만 아무런 부에노가 아니 었습니다.

편집 : 중요한 경우 CF 버전 10,0,0,0 및 Lucee 버전 4.5.2.018을 사용하고 있습니다.

+0

버퍼의 내용을 출력 스트림으로 플러시하려면'flush; '일 뿐인'cfflush'의 cfscript 버전을 호출 할 수 있어야합니다. – andrewdixon

+0

또한 cfscript 버전의 cfscript 버전을 사용할 수 있습니다. 'cfhttp', 예. 'http url = "..."method = "...";, 등등 ... 그러나 그것은 Lucee와 ACF와는 다르다. – andrewdixon

+0

나는 그것을 또한 시도했다, 그것은 작동하지 않았다. 나는 또한 플러시; 플러시; (머리글과 본문)하지만 작동하지 않습니다. – RoryLatham

답변

2

저는 손으로 ETags를 생성하는 것과 비슷한 것을합니다 (Lucee 4.5 사용). 나는 Application.cfc에 onRequestEnd 기능에 간단한

GetPageContext().getOut().getString()

스틱. 이렇게하면 브라우저로 전송 된 것처럼 HTML 문자열이 반환됩니다.

적절한 범위 (응용 프로그램, 세션 등)에 저장할 수 있으며 나중에 사용하거나 필요한 항목을 사용할 수 있습니다. 분명히 모든 처리가 완료되어야하지만 플러시가 필요하지 않습니다. 실제로 플러싱은 행동을 바꿀 수도 있고 변경하지 않을 수도 있습니다.

+1

<분명히 모든 처리가 완료되어야합니다> @Sean Hogge, 왜 그게 사실입니까? 처리하는 동안 화면에 정보를 표시하려고합니다. 이 상황에서 가능하지 않습니까? – RoryLatham

+0

아마 가능할 수도 있지만 다른 태그가 필요할 수도 있습니다. 내가 알 수있는 한,이 메소드는 페이지가 HTML로 완전히 렌더링되고 클라이언트로 보낼 준비가 된 후에 만 ​​사용할 수 있습니다. 그 말은 곧 더 빨리 호출 할 수 있으며, 그것이 가지고있는 것을 반환 할 수 있습니다 (나는 앞에서 문서가 없습니다). 제 추측으로는 그렇게하지 않을 것입니다. 그리고 당신이하려고하는 것을 이해한다면 어떻게 든해야합니다. –