2010-11-23 1 views
1

私はサーバAでPHPスクリプトを実行しており、15分かかると終わります。私は、Webブラウザを介してスクリプトを実行し、(いくつかのPHPコマンドが終了すると)ブロック単位でブラウザに出力を送信します。ブロックの例については以下を参照してください。このスクリプトはDB2データベースを作成するため、合計でいくつかのステップが必要です。ajaxを介してphpスクリプトからの出力をsinatra re-streamできますか?

私は、AJAXを介してサーバーBのsinatraから同じスクリプトを実行します。それはうまく動作しますが、私はPHPスクリプトが終了したら、私はそれを呼び出すようにすべてのブロック(すべてのブロック)を取得します。

は、スクリプトが(ないシナトラから)ブラウザから直接起動されたかのように、それは同じように動作しますので、シナトラ/ AJAXが道を設定することができます方法はありますか?だから、Ajaxコールが終了したときに終了しなければ、すべてのブロックの結果を見ることができます。

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 

Rubyコード(抜粋)

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を使用)でそれを行いますラインホルダー...

私は、セッション変数に文字列があるまで待っていた実行ボタンを使ってajax呼び出し(クライアントに面するjquery)に接続されたjquery UIプログレスバー(オプション)を使用しました"それを完成させ、セッション変数の内容を出力するたびに、PHP.ajaxの単一のPHPページを取得しました。

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

セッション変数アップデータ

<? 
//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']; 
?> 

オフ1オフ火災私は私が使用する実際のコードを投稿します明日

1

OKここではPHPである:

デモの場合: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; 
} 
関連する問題