2013-05-21 140 views
1

如何优化clamav cl_scanfile使其更快?平均而言,扫描文件大约需要15-20秒。因此,如果以一种形式存在2个上传字段,则需要将近40秒或更长时间,这将导致php最大执行时间错误。clamav cl_scanfile需要很长时间才能完成

我宁愿不改变php的执行时间。

有没有办法做到这一点?

我的代码将是这样的:

function upload() { 
... 
     // Checking element type based on element id. 
     // if element type == file, check the file type. Based on the result, halt (redirect to failure) or continue 
     foreach ($this->_controller->data['FormSubmission'] as $elementId => $fieldValue) { 
... 
... 
         //Checking The File for Virus 
         $retcode = cl_scanfile($fieldValue["tmp_name"], $virus_name); 

         //if Virus not found 
         if ($retcode != CL_VIRUS) { 
          //Check Directory if uploadPath is not a directory, make it 
          if (!is_dir($uploadPath)) { 
           mkdir($uploadPath, 0777, TRUE); 
          } 

          //filename 
          $now = date('Ymd-His'); 
          $fileName = $now . '-' . $elementId . $fieldValue["name"]; 

          $fullFilePath = $uploadPath . '/' . $fileName; 
          $uploading = move_uploaded_file($fieldValue["tmp_name"], $fullFilePath); 
          // change the value to uploadPath for ul/dl 
          $this->_controller->data["FormSubmission"][$elementId] = $fullFilePath; 
         } else { 
          //If Virus found, don't upload anything 
          $this->_controller->data["FormSubmission"][$elementId] = ""; 
         } 

回答

0

我不认为自己是在蛤AV方面的专家,但我的理解是,有没有什么办法可以优化呼吁每个文件,除非你能消除一些签名数据库(在很多情况下你不能)。例如,如果您知道该文件永远不会在Windows系统上使用,则可以消除Windows签名数据库,从而节省大量时间。尽管如此,请注意这一点,因为它可能会适得其反。尽管更改PHP超时值可能更可取,但我同意您不应该这样做。

Clam AV使用多线程守护进程,但是,您可能要优化的另一件事是同时运行每个文件扫描(多线程或多处理)。这对于少量的大文件没有多大帮助,但是对于大量的小文件可能会产生很大的影响。这是我会采取的方法。有a great post on PHPlens covering parallel processing in PHP。您也可以使用an open source Pthread library for PHP。它在Github上用户Krakjoe下可用。

0

Ubuntu默认的ClamAV(命令和apt-get安装calmav)附带MPI-编译,以便加快与东西:

sudo mpirun -np $(grep -c ^processor /proc/cpuinfo) clamscan -r --bell -r /

仍需要一段时间,但给它一个镜头

1

了通过添加
clamav.load_db_on_startup=1/etc/php5/mods-available/clamav.ini

extension=clamav.so 
[clamav] 
clamav.dbpath="/usr/local/share/clamav" 
clamav.load_db_on_startup=1 
clamav.maxreclevel=16 
clamav.maxfiles=10000 
clamav.maxfilesize=26214400 
clamav.maxscansize=104857600 
clamav.keeptmp=0 
clamav.tmpdir="/tmp" 
时间下降1/

大约需要7-8秒,具体取决于文件大小。

http://php-clamav.sourceforge.net/parameters.php#load_db_on_startup

相关问题