提问
提问
我要登录
|免费注册
点赞
收藏
wx-share
分享

windows下构建基于web的Blast服务

互联网

738

本篇文章主要介绍windows如何使用PHP建立PHP服务。

首先讨论一下设计思路

  • web界面,可以参考NCBI,
  • 使用Javascript增加对用户输入的校验,
  • 然后将用户输入传给PHP脚本,PHP脚本检验用户输入,
  • 并将这些输入拼成执行Blast的命令,
  • 然后传给后台执行命令,
  • 拦截Blast程序的输出,判断是否执行成功,
  • 将结果返回给用户。

代码示例(很早以前写的,供参考)

 
<?php
#准备输入文件
$seq_type=$_POST['seqType'];
$file_name=mt_rand();
$uploadfile="../temp/" . $file_name . ".fa";
$out_file="../temp/" . $file_name . ".out";
if($seq_type=="file"){
    move_uploaded_file($_FILES['seqFile']['tmp_name'],   $uploadfile);
    $upload_state=$_FILES['upfile']['error'];
}elseif($seq_type=="text"){
 $seq_text=trim($_POST['seqText']);
 if(!empty($seq_text)){
  $handle=fopen($uploadfile,'w');
  fwrite($handle,$seq_text);
  fclose($handle);
  $upload_state=0;
 }
}else{
 $url="gene_blast.php";
    echo "<script language=\"javascript\">";
    echo "location.href=\"$url\";";
    echo "alert(\"系统错误,请返回重新操作! \");";
    echo "</script>";
 exit;
}

if ($upload_state==0){
 #得到其他参数
 $seq_start=trim($_POST['from']);
 $seq_end=trim($_POST['to']);
 $db_sta=trim($_POST['database']);
 if($db_sta==1){
  $db="..\\db\\insect_rrna.fasta";
 }elseif($db_sta==0){
  $db="..\\db\\insect_mt.fasta";
 }
 $program=trim($_POST['blast_type']);
 $e_vale=trim($_POST['EXPECT']);
 $description=trim($_POST['DESCRIPTIONS']);
 $alignments=trim($_POST['ALIGNMENTS']);
 $in_file="..\\temp\\" . $file_name . ".fa";
    $out_file="..\\temp\\" . $file_name . ".out";

 $blast="..\\cgi_bin\\bin\\blastall -p $program" .
   " -e $e_vale " .
   "-v $description " .
   "-b $alignments " .
   "-d $db " .
   "-i $in_file " .
   "-o $out_file";
 #执行系统命令
 system("$blast",$sys_state);
 #echo $sys_state;
  if ($sys_state==0) {
   #echo $blast;
   $url="../temp/" . $file_name . ".out";
        echo "<script language=\"javascript\">";
        echo "location.href=\"$url\";";
        #echo "alert(\"程序出现错误,请重新开始! \");";
        echo "</script>";
  }else{
     $url="gene_blast.php";
        echo "<script language=\"javascript\">";
        echo "location.href=\"$url\";";
        echo "alert(\"程序出现错误,请重新开始! \");";
        echo "</script>";
  }
  if(file_exists($out_file)){
     #unlink($out_file);
     }
} else {
   $url="gene_blast.php";
   echo "<script language=\"javascript\">";
   echo "location.href=\"$url\";";
   echo "alert(\"输入序列有问题,请重新输入! \");";
   echo "</script>";
}
?>

问题讨论

1、时间溢出的问题

执行Blast可能需要执行很长的时间,所以调整PHP最大相应时间的参数。

2、如何传入用户比对的序列

用户可以输入,或者上传序列,这里也需要根据需要调整最大上传文件的大小,无论上从文件上传还是从输入框输入,最后都将序列内容写入统一的临时文件中,将这个临时文件传给Blast。

3、是否需要检查参数的有效性

比如核酸序列是否正确,输入的数值是否合法等等,这里的建议就是统统交给blast程序,如果出错,将错误截取,返回给用户就可以了。

4、安全性

因为命令要传给后台执行,所以对于用户输入的内容要做过滤,有关这方面得信息请参考PHP调用系统命令函数的使用说明。

5、输出结果的样式

可以通过设置Blast的参数来控制,比如输出为html格式的,详细参看作者的另一篇文章:

<font>Blast本地化:使用Blastall进行数据库比对</font>

如果你想对blast结果做分析,比如画图,构建物种分类树等,可以对结果详细描述的文章:

<font>Blast结果的详细解析</font>

还没有完

以上也就是简单的实现个基本的功能,如果考虑到使用性能 ,并发,可用性等,上面的实现方法是远远不够的,比如,

  • 一个比对要执行2个小时,用户那边就会一直处于响应状态,是出问题了?还是正常呢?八成会后退重新来过!
  • 如果几个用户同时执行比对呢?服务器很可能就瘫痪了!

所以就要考虑考虑异步执行,队列 ,由于有会涉及都另外的很多东西,这里就不多说了。大家可以留言探讨。

(责任编辑:大汉昆仑王)
提问
扫一扫
丁香实验小程序二维码
实验小助手
丁香实验公众号二维码
关注公众号
反馈
TOP
打开小程序