I made a simple script which sets the QTY of certain products based on a CSV.
It all works perfectly excepting the fact that it takes around 3 seconds for each product to be saved.
What could I do to optimize it’s saving speed?
use MagentoFrameworkAppBootstrap;
include('../app/bootstrap.php');
$bootstrap = Bootstrap::create(BP, $_SERVER);
$_objectManager = $bootstrap->getObjectManager();
$state = $_objectManager->get('MagentoFrameworkAppState');
$state->setAreaCode('adminhtml');
//list of products to check
$csvFile = file('data.csv');
$data = [];
$i=0;
foreach ($csvFile as $line) {
$i++;
$products[str_getcsv($line,';')[1]] = str_getcsv($line,';')[3];
}
echo sprintf('Loaded stock for '.$i.' products'."n");
echo "Starting...n";
$_zeroQtyProducts = $_objectManager->create('MagentoCatalogModelResourceModelProductCollection')->addAttributeToFilter('name', array('like' => '%special%'));
$_stockState = $_objectManager->get('MagentoCatalogInventoryApiStockStateInterface');
$_stockRegistry = $_objectManager->get('MagentoCatalogInventoryApiStockRegistryInterface');
//if any products found
if ($_zeroQtyProducts) {
echo sprintf("Found %s product(s)n", count($_zeroQtyProducts));
foreach ($_zeroQtyProducts as $_product) {
$_stock = $_stockState->getStockQty($_product->getId(), $_product->getStore()->getWebsiteId());
$_sku = $_product->getSku();
$prodname=$special_var;
if (isset($products[$prodname])) {
$_stockItem = $_stockRegistry->getStockItem($_product->getId());
$_stockItem->setData('is_in_stock', 1); //set updated data as your requirement
$_stockItem->setData('qty', $products[$prodname]); //set updated quantity
$_stockItem->save(); //save stock of item
$_product->save();
echo sprintf("Product qty updated to: %s for ".$_sku."n", $products[$prodname]);
} else {
echo sprintf('Can't find stock for product ' . $prodname . ' -- ' . $_sku."n");
}
}
}
}
} else {
echo sprintf("0 Products found with provided SKU's.n");
}