我正忙于cakePHP中的一个项目,我需要解析几个XML文件并将相关数据插入到我的mysql数据库中。脚本插入应该插入的内容,这不是问题。例如,如果我解析一个或两个文件(大约7000-8000条记录),则没有任何问题。
解析第三个或第四个xml文件时出现问题。插入记录一分钟后,我看到数据库中成功插入了9000-10000条记录,但突然之间脚本似乎重新启动了。我注意到表中存在0条记录,它重新开始插入所有记录。所以脚本只需要很长时间才能执行。
简短摘要:
$content = simplexml_load_file($file);
/**
* Process line per line
*/
foreach ($content->product as $line) {
// create new record in products database table
$product = array();
$product['Product']['productid'] = $line->attributes()->sku_number;
$product['Product']['name'] = $line->attributes()->name;
$product['Product']['description'] = empty($line->description->long) ? $line->description->short : $line->description->long;
$product['Product']['link'] = $line->URL->product;
$product['Product']['affiliate'] = 'linkshare';
$product['Product']['price'] = $line->price->retail;
$product['Product']['brand'] = strtolower($line->brand);
$product['Product']['image'] = $line->URL->productImage;
// if not in rejectedproducts, save the new product to the database
if (!$rejectedproductModel->findByProductid($product['Product']['productid'])) {
$productModel->create();
$productModel->save($product);
}
有人有经验吗?可能是什么原因以及更多可能是解决方案:)
由于
答案 0 :(得分:0)
我将展示一些代码。 Feed的调用就是这样的 parseDirectory方法检查指定文件夹中的所有xmls,并通过调用linkshare操作并传递文件名来解析它们。
function index() {
set_time_limit(0);
#$this->updateFeeds();
App::import('Model', 'Product');
$productModel = new Product();
# truncate table products before adding new records to avoid duplicate records
$productModel->query('TRUNCATE TABLE products');
# parse all files from shareasale
#$this->__parsedirectory('feeds/shareasale');
# parse all files from linkshare
$this->__parsedirectory('feeds/linkshare');
# send mails where necessary
$this->redirect(array('controller' => 'subscriptions', 'action' => 'sendmails'));
}
function __parsedirectory($dir) {
# retrieve name affiliate out of directory
$affiliate = explode('/', $dir);
$affiliate = $affiliate[1];
$dh = opendir($dir);
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..' && !$this->__endswith($file, 'gz')) {
$this->requestAction('/parse/' . $affiliate . '/file:' . $file);
$this->Session->setFlash($affiliate . '/' . $file . ' parsed');
}
}
closedir($dh);
$this->autoRender = false;
}
答案 1 :(得分:0)
我认为问题出在这段代码中:
# truncate table products before adding new records to avoid duplicate records
$productModel->query('TRUNCATE TABLE products');
这是一种避免重复记录的糟糕方法。这应该通过对数据库的限制进行管理。话虽如此,不知何故,这段代码正在流程的中间再次运行。
这是设置为CRON还是以某种方式自动运行?如果是这样,发生的事情是前一个文件在下一个文件启动时尚未完成解析。