windows下构建基于web的Blast服务
本篇文章主要介绍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格式的,详细参看作者的另一篇文章:
Blast本地化:使用Blastall进行数据库比对
如果你想对blast结果做分析,比如画图,构建物种分类树等,可以对结果详细描述的文章:
Blast结果的详细解析
还没有完
以上也就是简单的实现个基本的功能,如果考虑到使用性能 ,并发,可用性等,上面的实现方法是远远不够的,比如,
- 一个比对要执行2个小时,用户那边就会一直处于响应状态,是出问题了?还是正常呢?八成会后退重新来过!
- 如果几个用户同时执行比对呢?服务器很可能就瘫痪了!
所以就要考虑考虑异步执行,队列 ,由于有会涉及都另外的很多东西,这里就不多说了。大家可以留言探讨。
(责任编辑:大汉昆仑王)