【发布时间】:2011-05-14 19:40:15
【问题描述】:
我在服务器 A 上运行了一个 php 脚本,大约需要 15 分钟才能完成。我通过网络浏览器运行脚本,它以块的形式向浏览器发送输出(一些 php 命令完成)。请参阅下面的块示例。该脚本创建 DB2 数据库,总共需要几个步骤。
现在我通过 AJAX 从服务器 B 上的 sinatra 运行相同的脚本。它工作正常,但是一旦 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
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 代码示例(2 块)
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.");
}
【问题讨论】:
-
您能发布您的 PHP 脚本和 AJAX 代码吗?另外,我不确定“通过浏览器运行脚本并将输出以块的形式发送到浏览器”是什么意思。我假设 PHP 脚本存储在您的服务器上,因此由服务器运行以响应客户端请求。
-
@Jergason:您几乎可以阅读新问题 :-)
-
有人知道怎么做吗?