我有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中时才使用它。
我将更新这个问题,一旦我完成了这个更改和测试:)
处理一百万个文件名需要时间,但是,我认为没有理由将这些文件名(和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