2010-11-23 5 views
1

나는 끝내기 위해 15 분이 걸리는 서버 A에서 실행되는 PHP 스크립트를 가지고있다. 나는 웹 브라우저를 통해 스크립트를 실행하고 블록으로 출력을 브라우저로 보냅니다 (일부 PHP 명령이 완료됨에 따라). 블록의 예는 아래를 참조하십시오. 스크립트는 DB2 데이터베이스를 작성하며 합계가 거의 필요하지 않습니다.아나운서를 통해 PHP 스크립트에서 sinatra 다시 스트림 출력 수 있습니까?

이제 AJAX를 통해 서버 B의 sinatra에서 동일한 스크립트를 실행합니다. 그것은 잘 작동하지만 일단 PHP 스크립트가 완료되면 출력 (전체 블록 내가 그것을 부르는) 전체를 많이 얻을.

sinatra/ajax를 설정할 수있는 방법이 있습니까? 그래서 스크립트가 sinatra가 아닌 브라우저에서 직접 시작된 것과 같은 방식으로 작동합니까? 그래서 전체 아약스 호출이 끝났을 때가 아니라면 모든 블록의 결과를 볼 수 있습니다.

HAML 파일 (추출물)

:javascript 
    function loadXMLDoc2(mode) 
    { 
    if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    xmlhttp.onreadystatechange=function() 
     { 
     document.getElementById("db2").innerHTML="<BLINK> processing</BLINK> "+mode+" procedure"; 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
     document.getElementById("db2").innerHTML=xmlhttp.responseText; 
     } 
     } 
    xmlhttp.open("GET","/ajaxdb2?mode="+mode,true); 
    xmlhttp.send(); 
    } 

%td 
     %button{:type => "button", :onclick => "loadXMLDoc2('create')"} 
     create DB2 
     %br 

루비 코드 (추출물)

get '/ajaxdb2?' do 

    execute_db2_script(params['mode'].downcase) 
end 

def execute_db2_script(mode) 

    if not (mode == 'clear') 

    db2_database = 'RATIONAL' 
    url = "http://db2express/imacs/radek/db2.rft/rationalTest.php?mode=#{mode}&database=#{db2_database}" 
uri = URI.parse(url) 
start = Time.new 

response = Net::HTTP.start(uri.host, uri.port) do |http| 
    http.open_timeout = 5 
    http.read_timeout = 1500 
    http.request_get(uri.request_uri) 
end 

stop = Time.new 

return "#{response.body} <BR>processed in #{stop - start} seconds" 
else 
    return "DB2 results" 
end 
end 

PHP 코드 샘플 (2blocks)

flush_buffers(); 

$output = array(); 
$shellOutput = exec("echo 'password' | sudo -su db2inst1 -S '/opt/ibm/db2/V9.7/bin/db2 deactivate database $databaseName'", $output); 

echo "<pre>Output = " . print_r($output,1) . "</pre>"; 
if(strpos($output[0],'DB20000I') === false && strpos($output[0],'SQL1496W') === false && strpos($output[0],'SQL1013N') === false && strpos($output[0],'SQL30061N') === false){ 
    echo("Could not deactivate database."); 
} 
flush_buffers(); 


$output = array(); 
$shellOutput = exec("sudo -su db2inst1 -S '/opt/ibm/db2/V9.7/bin/db2 drop database $databaseName'", $output); 
echo "<pre>Output = " . print_r($output,1) . "</pre>"; 
if(strpos($output[0],'DB20000I The DROP DATABASE command completed successfully') === false && strpos($output[0],'SQL1013N') === false && strpos($output[0],'SQL30061N') === false){ 
    echo("Dropping of the database was not successful."); 
} 
+0

누군가는 알고있다? – Radek

+0

PHP 스크립트와 AJAX 코드를 게시 할 수 있습니까? 또한, "브라우저를 통해 스크립트를 실행하면 블록으로 출력을 브라우저로 보냅니다"라는 것이 무슨 뜻인지 잘 모르겠습니다. PHP 스크립트가 서버에 저장되어 있다고 가정하고 클라이언트 요청에 대한 응답으로 서버가 실행합니다. – jergason

+0

@ Jergason : 거의 새로운 질문을 읽을 수 있습니다 :-) – Radek

답변

1

지금 집에 있고 코드는 작동하지만 로그 파일로 출력을 파이프하거나 (popen) 로그 파일이 늘어남에 따라/세션을 사용하여 로그 파일을 표시하여 수행합니다 라인 홀더 ...

나는 세션 변수에 문자열이있을 때까지 기다렸다가 exec를 시작한 go 버튼으로 ajax 호출 (클라이언트를 향한 jquery에서)에 연결된 jquery UI 진행 막대 (선택 사항)를 사용했습니다. "완료되면 세션 변수의 내용을 호출 할 때마다 PHP.ajax가 페이지 하나를 출력하도록 PHP $를 하나 갖게되었습니다. 나는 실제 코드를 게시합니다

<? 
//session getter for the $.ajax call will continue til its saying "complete" 
session_start(); 
//code to go to the log.log or read the popen output 
echo $_SESSION['latestline']; 
?> 

세션 변수 갱신

<? 
session_start(); 
$_SESSION['latestline']="starting"; 
exec("somelongjobmultiline >c:\temp\log.log"); 
?> 

오프

하나 떨어져 화재 내가 사용하는 내일이 PHP에 여기

1

확인 :

데모 : C : \ Temp \ sleep.bat를 만들고이 줄에 5 초가 걸리므로 r을 폴링합니다. esults - C라는 파일이 없습니다 있는지 확인하십시오 당신이 원하는 위치 \ 임시 \의 info.log

다음
@echo. > C:\Temp\info.log 
@echo working start > C:\Temp\info.log 
@ping 123.45.67.89 -n 1 -w 1000 > nul 
@echo working 1 second > C:\Temp\info.log 
@ping 123.45.67.89 -n 1 -w 1000 > nul 
@echo working 2 seconds > C:\Temp\info.log 
@ping 123.45.67.89 -n 1 -w 1000 > nul 
@echo working 3 seconds > C:\Temp\info.log 
@ping 123.45.67.89 -n 1 -w 1000 > nul 
@echo working 4 seconds > C:\Temp\info.log 
@ping 123.45.67.89 -n 1 -w 1000 > nul 
@echo done (after 5) > C:\Temp\info.log 

의 index.php, launchprocess.php, getprocessstatus.php,있는 style.css가 있지만, 동일한 폴더

에서

index.php를

<?php 
    //index.php 
    session_start(); 
    $_SESSION['out']=""; 

    echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n"; 
    echo "<html>\n"; 
    echo "<head>\n"; 
    echo " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n"; 
    echo " <title>Demo</title> \n"; 
    echo "\n"; 
    echo " <link rel=\"stylesheet\" href=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css\" media=\"screen\" />\n"; 
    echo " <script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js\"></script>\n"; 
    echo " <script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js\"></script>\n"; 
    echo " \n"; 
    echo " <link rel=\"stylesheet\" href=\"style.css\" media=\"screen\" />\n"; 

    echo "<script>\n"; 
    echo " $(document).ready(function(){\n"; 
    echo "  \n"; 
    echo "  $('#go').click(function(){\n"; 
    echo "   $.ajax({\n"; 
    echo "    cache: false,\n"; 
    echo "    type: 'post',\n"; 
    echo "    url: 'launchprocess.php',\n"; 
    echo "    beforeSend: start_display()\n"; 
    echo "   });\n"; 
    echo "  });\n"; 
    echo "  \n"; 
    echo " });\n"; 
    echo "\n"; 
    echo " var interval='';\n"; 
    echo " var counter=1;\n"; 
    echo "  \n"; 
    echo " function start_display() {\n"; 
    echo "  $(\".button\").val(\"...hold on a minute\"); \n"; 
    echo "  $(\".button\").attr(\"disabled\", true); \n"; 
    echo "  if (interval==\"\") {\n"; 
    echo "   interval=window.setInterval(\"display()\",200);\n"; 
    echo "  } else {\n"; 
    echo "   stop_display();\n"; 
    echo "  }\n"; 
    echo " }\n"; 
    echo "\n"; 
    echo " function stop_display() {\n"; 
    echo "  $(\".button\").val(\"Click to go!\"); \n"; 
    echo "  $(\".button\").attr(\"disabled\", false); \n"; 
    echo "  if (interval!=\"\") {\n"; 
    echo "   window.clearInterval(interval);\n"; 
    echo "   interval=\"\";\n"; 
    echo "  }\n"; 
    echo " }\n"; 
    echo "\n"; 
    echo " function display() {\n"; 
    echo "  counter ++; \n"; 
    echo "  if (counter=='100') {\n"; 
    echo "   stop_display();\n"; 
    echo "   $('#text').html('Timeout');\n"; 
    echo "  }\n"; 
    echo "  $.ajax({\n"; 
    echo "   cache: false,\n"; 
    echo "   type: 'get',\n"; 
    echo "   url: 'getprocessstatus.php',\n"; 
    echo "   success: function(response) {\n"; 
    echo "    $('#text').html(response);\n"; 
    echo "    if (response=='100' || response =='done' || response =='complete') {\n"; 
    echo "     stop_display();\n"; 
    echo "     $('#text').html('Done!');\n"; 
    echo "    }\n"; 
    echo "   }\n"; 
    echo "  });\n"; 
    echo " }\n"; 
    echo " \n"; 
    echo "</script>\n"; 

    echo "\n"; 
    echo "</head>\n"; 
    echo "<body>\n"; 
    echo "\n"; 
    echo "<div id=\"step\">\n"; 
    echo "  <h1>Run Demo</h1>\n"; 
    echo "  <input type=\"button\" value=\"Click to go!\" class=\"button green\" id=\"go\">\n"; 
    echo "  <div id=\"text\"></div>\n"; 
    echo "</div>\n"; 
    echo "\n"; 
    echo "</body>\n"; 
    echo "</html>\n"; 
?> 

launchprocess.php

<?php 
    // file: launchprocess.php 
    session_start(); 

    function command($cmd){ 
     session_start(); 
     $_SESSION['out'] = ""; 
     session_commit(); 

     session_write_close(); 
     exec($cmd,$out); 
     session_commit(); 

     foreach($out as $line){ 
      if ($line) $store .= $line . "<br>"; 
     }  
    } 

    session_start();  
    $_SESSION['out'] = "setting up"; 
    session_commit(); 

    command("C:\\Temp\\Sleep.bat"); 

    session_start();  
    $_SESSION['out'] = "done"; 
    session_commit(); 
?> 

getprocessstatus.PHP

<?php 
    // file: getprocessstatus.php 
    session_start(); 

    if ($_SESSION['out']) echo $_SESSION['out']; 
    else { 
     $filename = "C:\\Temp\\info.log"; 
     if (is_file($filename)){ 
      $handle = fopen($filename, "r"); 
      echo fread($handle, filesize($filename)); 
      fclose($handle); 
     } 
     else{ 
      echo "no file"; 
     } 
    } 
?> 

있는 style.css

body { 
     margin: 100px 0 0 200px; 
} 

h1 { 
    font-family: calibri, arial; 
    font-weight: bold; 
} 

div { 
    font-family: calibri, arial; 
    font-weight: bold; 
} 

#response { 
    width: 500px; 
    height: 20px; 
    backgorund: #fff; 
    background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f1f1), to(#fff)); 
    background: -moz-linear-gradient(top, #f1f1f1, #fff); 
    border: 1px solid #ccc; 
    border-radius: 2px; 
    -moz-border-radius: 2px; 
    margin: 0 0 20px 0; 
    display: none; 
} 
#response div { 
    height: 100%; 
    width: 0; 
    border: none; 
    background: #84D700; 
    -moz-box-shadow: 2px 0 5px #ccc; 
    -webkit-box-shadow: 2px 0 5px #ccc; 
    box-shadow: 2px 0 5px #ccc; 
} 
#loader { 
    vertical-align: middle; 
    margin: 0 10px 0 0; 
    display: none; 
} 

.button { 
    font-family: calibri, arial; 
    font-weight: bold; 
    color: white; 
    font-size: 18px; 
    padding:7px; 
    -moz-border-radius: 5px; 
    border-radius: 5px; 
    width: 220px; 
} 

.green { 
    background-color: #9BBB59; 
    border: solid 3px #71893F; 
} 

.purple { 
    background-color: #8064A2; 
    border: solid 3px #5C4776; 
} 

.blue { 
    background-color: #4F81BD; 
    border: solid 3px #385D8A; 
} 

.cyan { 
    background-color: #4BACC6; 
    border: solid 3px #357D91; 
} 
관련 문제