当前位置: 首页 > 知识库问答 >
问题:

我的获取文件名和查找新文件的脚本能更快吗?

白宏义
2023-03-14

我有FTP访问%1目录的权限,该目录保存供应商所有产品的所有映像。1产品具有多个图像:尺寸的变化和产品显示的变化。

没有“列表”(XML、CSV、数据库..)通过它我能够知道“什么是新的”。目前,我看到的唯一方法是获取所有文件名,并将它们与我的DB中的文件名进行比较。

最后一次检查发现该目录中有998.283个文件。1产品有多个变体,没有关于它们如何命名的文档。

我对文件名进行了初始抓取,将它们与我的产品进行了比较,并将它们的文件名和日期修改(从文件)后保存在“图像”数据库表中。

接下来就是查“新”了。

我现在做的是:

// get the file list /
foreach ($this->getFilenamesFromFtp() as $key => $image_data) {
  // I extract data from filenames (product code, size, variation number, extension..) so I can store them in table and later use that as reference (ie. I want to use only large images of variation, not all sizes 
  $data=self::extractDataFromImage($image_data);
  // checking if filename already exists in DB images
  // if there is DB entry (TRUE) it will do nothing, and if there is none it will continue with insertion in DB
  if($this->checkForFilenameInDb($data['filename'])){
  }
  else{
    $export_codes=$this->export->getProductIds();
    // check if product code is in export table - that is do we really need this image
    if($this->functions->in_array_r($data['product_code'],$export_codes)){
      self::insertImageDataInDb($data);
    } // end if                     
  } // end if check if filename is already in DB
} // end foreach

我的方法getFileNamesFromFTP()如下所示:

$filenames = array();
$i=1;
$ftp = $this->getFtpConfiguration();

// set up basic connection
$conn_id = ftp_ssl_connect($ftp['host']);

// login with username and password
$login_result = ftp_login($conn_id, $ftp['username'], $ftp['pass']);

ftp_set_option($conn_id, FTP_USEPASVADDRESS, false);
$mode = ftp_pasv($conn_id, TRUE);
ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 180);

//Login OK ?
if ((!$conn_id) || (!$login_result) || (!$mode)) { //  || (!$mode)
   die("FTP connection has failed !");
}
else{
  // I get all filenames and store them in array
  $files=ftp_nlist($conn_id, ".");
  // I count the number of files in array = the number of files on FTP 
  $nofiles=count($files);
  foreach($files as $filename){
  // the limit I implemented while developing or testing, but in production (current mode) it has to run without limit
  if(self::LIMIT>0 && $i==self::LIMIT){ //!empty(self::LIMIT) &&    
      break;
    }
    else{
      // I get date modified from from file
      $date_modified = ftp_mdtm($conn_id, $filename);
      
      // I create new array for filenames and date modified so I  can return it and store it in DB
      $filenames[]= array(
         "filename" => $filename,
         "date_modified" => $date_modified
      );
    } // end if LIMIT empty
    $i++;
  } // end foreach
  // close the connection
  ftp_close($conn_id);
  return $filenames;
}

问题是脚本需要很长的时间。到目前为止,我检测到的最长时间是在GetFileNamesFromFTP()中创建数组时:

      $filenames[]= array(
         "filename" => $filename,
         "date_modified" => $date_modified
      );

该部分到目前为止持续了4小时,但仍未完成。

在写这篇文章的时候,我有一个想法,从一开始就删除“date modified”,并且以后只有在我计划将该映像存储在DB中时才使用它。

我将更新这个问题,一旦我完成了这个更改和测试:)

共有1个答案

淳于博
2023-03-14

处理一百万个文件名需要时间,但是,我认为没有理由将这些文件名(和date_modified)存储在数组中,为什么不直接处理一个文件名呢?

同样,与其完全处理一个文件名,为什么不先将其存储在数据库表中呢?然后您可以在稍后进行真正的处理。通过将任务一分为二,检索和处理,它变得更加灵活。例如,如果要更改处理,则不需要进行新的检索。

 类似资料:
  • 问题内容: 如果我有PHP脚本,如何从该脚本内部获取文件名? 另外,给定表单脚本的名称,我如何仅提取“ jquery.js”部分? 问题答案: 只需使用PHP魔术常数 即可获取当前文件名。 但是似乎您想要没有的部分。所以… 一个更通用的文件扩展名去除器如下所示… 如您所料,使用标准的字符串库函数要快得多。

  • 问题内容: 我很确定答案是否定的,但是我想我还是会问。 如果我的站点引用了名为“ whatever.js”的脚本,是否可以从该脚本中获取“ whatever.js”?喜欢: 麻烦多于依赖检查所值得的,但是这真是麻烦。 问题答案: var scripts = document.getElementsByTagName(‘script’); var lastScript = scripts[scrip

  • 问题内容: 我在解析Mac上的别名链接时遇到问题。我正在检查文件是否是别名,然后我想接收原始路径。相反,我只得到一个文件ID。安莉的想法? 编辑: 两个答案都是正确的!我之所以选择mklement0的答案,是因为最初没有说明该代码必须在10.9上运行,从而使其更加灵活 问题答案: 这是 在OS X 10.9上也可以 使用的 实现 : 注意: 与vadian的解决方案不同,即使对于 非 别名文件,这

  • 问题内容: 如何确定脚本本身内部的Bash脚本文件的名称? 就像我的脚本在文件中一样,那么我如何在不进行硬编码的情况下显示“您正在运行runme.sh”消息呢? 问题答案: 要通读通常不是您想要的符号链接1(您通常不希望这样使用户感到困惑),请尝试: 海事组织,这将产生令人困惑的输出。“我运行了foo.sh,但这是说我正在运行bar.sh !?一定是bug!” 此外,具有不同名称的符号链接的目的之

  • 问题内容: 如何从给定的文件路径字符串获取文件名? 例如,如果我有一个文件路径字符串为 我想得到返回结果 谢谢您的帮助。 问题答案: 目标C 迅速

  • 测试数据 # linecache_data.py import os import tempfile lorem = '''Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus eget elit. In posuere mi non risus. Mauris id quam posuere lectus soll