用于 magmi 导入的 Cron 作业
Posted
技术标签:
【中文标题】用于 magmi 导入的 Cron 作业【英文标题】:Cron job for magmi import 【发布时间】:2012-11-28 14:00:50 【问题描述】:您好,我正在尝试将产品导入到我的 magento 中。 我只是在临时的基础上完成了所有工作,但现在我需要一个 cron。
理想情况下,我想使用 wget,因为这是最直接的。
所以我正在使用 wget "http://www.xxxxxx.com/magmi/web/magmi_run.php?profile=default&mode=xcreate&engine=magmi_productimportengine:Magmi_ProductImportEngine" -O /dev/null
但是我遇到了这个错误消息的问题 已发送 HTTP 请求,正在等待响应...在标头中读取错误(对等方重置连接)。 Coming up - 尝试了 20 次然后放弃。
谁能告诉我可能是什么问题? 谢谢 理查德
【问题讨论】:
【参考方案1】:我建议使用Magmi CLI Interface 来处理正在运行的 cron 作业(因为 HTTP 连接可能有超时等)。
我会在你的 cron 作业上运行以下命令:
php /path/to/magmi/cli/magmi.cli.php -mode=create
您可以通过参考此处的文档来定义自定义配置文件和模式: http://sourceforge.net/apps/mediawiki/magmi/index.php?title=Magmi_command_line
【讨论】:
谢谢,我刚试过,但得到了这个错误 PHP 注意:未定义的偏移量:-1 in /var/www/vhosts/deal-buster.co.uk/httpdocs/magmi/inc/magmi_engine.php在第 211 行启动:执行数据源查找... PHP 致命错误:在 /var/www/vhosts/deal-buster.co.uk/httpdocs/magmi/engines/ 中的非对象上调用成员函数 getRecordsCount() magmi_productimportengine.php 第 1309 行 我认为这是我的错误网址 - 现在似乎没问题 - 感谢您聆听老手!【参考方案2】:我刚刚为 Magento 创建了一个扩展,允许您通过 Magento 的 cron 运行 Magmi。这也许能帮到你
在这里免费下载 -> https://github.com/cameraki/Magento-Magmi-Via-Cron-Extension/
有道理我在这里发布代码以防链接脱机,所以在这里。 ps,由于我在 github 上制作了带有扩展名的自述文件,因此我在底部添加了此信息以帮助您入门。
app/code/local/Oli/Magmi/Cron.php
<?php
/**
* Created by PhpStorm.
* User: Oli
* Date: 02/11/2017
* Time: 17:05
*/
/* Change importer to the name of your Magmi directory */
require_once(Mage::getBaseDir() . "/importer/plugins/inc/magmi_datasource.php");
require_once(Mage::getBaseDir() . "/importer/integration/inc/productimport_datapump.php");
class Oli_Magmi_Cron
const LOG_DIRECTORY = "oli-extensions.log";
public function runMagmi()
try
$directory = Mage::getBaseDir('var') . '/import/';
$magmiCsvFile = $directory . 'magmiUploadReady.csv';
if(!file_exists($magmiCsvFile))
throw new Exception('CSV file for Magmi to upload cant be found.');
catch (Exception $e)
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Could not load todays magmiupload file. It must not have run today. This script will now stop: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
die();
$productArray = $this->csvToArray($magmiCsvFile);
$indexes = 'catalog_product_attribute,catalog_product_price,cataloginventory_stock';
$mode = 'update';
$profile = 'cronUpdatePrices';
try
$this->import($productArray, $mode, $profile);
catch (Exception $e)
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === There was an issue importing the products: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
try
$this->reindex($indexes);
catch (Exception $e)
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === There is a problem with the reindex function: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
/* log that it actually ran */
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Has finished running";
Mage::log($message, null, self::LOG_DIRECTORY);
public function csvToArray($filename)
$productArray = array_map('str_getcsv', file($filename));
array_shift($productArray);
$newProductArray = array();
/* Customise the item array index's to match the file you are importing */
foreach ($productArray as $key => $item)
$newProductArray[$key]['sku'] = $item[0];
$newProductArray[$key]['buy_price'] = $item[1];
$newProductArray[$key]['price'] = $item[2];
$newProductArray[$key]['store'] = $item[3];
$newProductArray[$key]['price_updated'] = $item[4];
$newProductArray[$key]['amazon_euros'] = $item[5];
$newProductArray[$key]['amazon_dollars'] = $item[6];
$newProductArray[$key]['qty'] = $item[7];
$newProductArray[$key]['is_in_stock'] = $item[8];
return $newProductArray;
private function import($items, $mode, $profile)
if (count($items) > 0)
try
$dp = new Magmi_ProductImport_DataPump();
$dp->beginImportSession($profile, $mode);
foreach ($items as $item)
$dp->ingest($item);
$dp->endImportSession();
catch (Exception $e)
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Seems to be an issue with the import function: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
private function reindex($string)
/** @var $indexer Mage_Index_Model_Indexer */
$indexer = Mage::getModel('index/indexer');
$processes = array();
if ($string == 'all')
$processes = $indexer->getProcessesCollection();
else
$codes = explode(',', $string);
foreach ($codes as $code)
$process = $indexer->getProcessByCode(trim($code));
if ($process)
$processes[] = $process;
/** @var $process Mage_Index_Model_Process */
foreach ($processes as $process)
$process->reindexEverything();
app/code/local/Oli/Magmi/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Oli_Magmi>
<version>0.0.1</version>
</Oli_Magmi>
</modules>
<global>
<models>
<oli_magmi>
<class>Oli_Magmi</class>
</oli_magmi>
</models>
</global>
<crontab>
<jobs>
<update_prices_via_magmi>
<schedule>
<cron_expr>30 3 * * 2</cron_expr>
</schedule>
<run>
<model>oli_magmi/cron::runMagmi</model>
</run>
</update_prices_via_magmi>
</jobs>
</crontab>
</config>
app/etc/modules/Oli_Magmi.xml
<?xml version="1.0"?>
<config>
<modules>
<Oli_Magmi>
<active>true</active>
<codePool>local</codePool>
</Oli_Magmi>
</modules>
</config>
Magento Magmi 通过 Cron 扩展
Magento 扩展通过 Magento 的 cron 从 CSV 文件运行 Magmi
注意:这仅在您拥有 Magmi (Magento Mass Importer) 时才有效
这是做什么的?
Magmi 允许您快速批量更改产品。它的速度很快,因为它直接导入数据库。因此请谨慎使用 Magmi,并在导入前备份数据库。
此扩展允许您使用 Magento 的 cron 自动运行 Magmi。非常适合每天自动更新产品定价,或每周一次批量更改库存水平。
我可以直接使用吗?
您需要确保您的服务器上有 Magmi。那么:
在 app/code/local/Oli/Magmi/Cron.php 的第 10 和 11 行更改 “/importer/....” 到 Magmi 安装的位置。例如, “/magmi/....” 在 app/code/local/Oli/Magmi/Cron.php 的第 23 行更改 $magmiCsvFil 成为您从中导入的 CVS 文件的地址。一旦您 改变了这一点,改变第 66 行周围的行来映射列 从 CSV 文件到数组。的钥匙 $newProductArray[$key]['...'] 应该匹配你的属性 变化。例如,如果您想更新库存水平,您将使用 $newProductArray[$key]['qty'] 因为 'qty' 是 Magento 的股票 水平是。自定义
在 app/code/local/Oli/Magmi/Cron.php 的第 36 行设置了哪个 要重新索引的 Magento 设置。我添加的是: 目录产品属性目录产品价格 cataloginventory_stock 您可能想要添加更多或更改这些。 在 app/code/local/Oli/Magmi/Cron.php 的第 37 行,这是 Magmi 模式。 "create" 创建和更新项目,"update" 仅更新,"xcreate" 仅创建。 在 app/code/local/Oli/Magmi/Cron.php 的第 38 行将其更改为匹配 您在 Magmi 中创建的配置文件的名称。您可以使用 'default' 如果你想使用默认配置文件但是这是 值得一看,因为您想确保 On the Fly 索引是 关闭,因为此扩展重新索引您的 magento 商店 结束。如果您使用具有 On the Fly 索引的配置文件,它将 每个产品后重新索引,占用大量服务器负载 原因。更多信息 您可以在此处找到有关 Magmi DataDump API 的更多信息 -> http://wiki.magmi.org/index.php/Magmi_Datapump_API
【讨论】:
【参考方案3】:在某些情况下,我必须从 Magento cron 作业运行 Magmi,所以我有这样的事情:
/**
* Includes Magmi files
*/
protected function _includeMagmi()
$magentoBaseDir = Mage::getBaseDir();
require_once($magentoBaseDir . DS . 'magmi' . DS . 'inc' . DS . 'magmi_defs.php');
require_once($magentoBaseDir . DS . 'magmi' . DS . 'integration' . DS . 'inc' . DS . 'magmi_datapump.php');
/**
* Runs Magmi to update/create for specified data
*
* @param string $profile Magmi import profile (@see magmi/conf/
* @param string $mode
* @param array $data
*/
protected function _runMagmiImport($profile, $mode, array $data)
$this->_includeMagmi();
$logger = Mage::getModel('mario/magmi_logger');
/** @var Magmi_ProductImport_DataPump $dataPump */
$dataPump = Magmi_DataPumpFactory::getDataPumpInstance('productimport');
$dataPump->beginImportSession($profile, $mode, $logger);
foreach ($data as $update)
$dataPump->ingest($update);
$dataPump->endImportSession();
return $logger;
【讨论】:
以上是关于用于 magmi 导入的 Cron 作业的主要内容,如果未能解决你的问题,请参考以下文章