У меня есть скрипт php, работающий на сервере A, который занимает 15 минут, чтобы закончить. Я запускаю сценарий через веб-браузер, и он отправляет вывод в браузер блоками (как завершили некоторые команды php). Ниже приведен пример блоков. Сценарий создает базу данных DB2, и для его выполнения требуется всего несколько шагов.
Теперь я запускаю тот же скрипт из sinatra на сервере B через AJAX. Он работает нормально, но я получаю всю выходную информацию (все блоки, как я ее называю), когда скрипт php завершает работу.
Есть ли способ настроить sinatra / ajax таким образом, чтобы он работал так же, как если бы скрипт запускался непосредственно из браузера (а не из sinatra)? Поэтому я могу видеть результаты каждого блока после его завершения, а не после завершения всего вызова 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
код рубина (извлечение)
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 (2 блока)
<code>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) . "
";
if (strpos ($ output [0], 'DB20000I') === false && strpos ($ output [0], 'SQL1496W') === false && strpos ($ output [0], 'SQL1013N') == = false && strpos ($ output [0], 'SQL30061N') === false) {
echo («Не удалось деактивировать базу данных.»);
}
flush_buffers ();
$ output = array ();
$ shellOutput = exec ("sudo -su db2inst1 -S '/opt/ibm/db2/V9.7/bin/db2 удалить базу данных $ databaseName'", $ output);
echo "
Output = " . print_r($output,1) . "
";
if (strpos ($ output [0], 'DB20000I Команда DROP DATABASE выполнена успешно') === false && strpos ($ output [0], 'SQL1013N') === false && strpos ($ output [0], 'SQL30061N') === false) {
echo («Удаление базы данных не было успешным.»);
}