PHP code example of zepgram / module-multi-threading
1. Go to this page and download the library: Download zepgram/module-multi-threading library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
zepgram / module-multi-threading example snippets
composer nto module:enable Zepgram_MultiThreading
bin/magento setup:upgrade
use Zepgram\MultiThreading\Model\ForkedSearchResultProcessor;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
class MyAwesomeClass
{
/** @var ForkedSearchResultProcessor */
private $forkedSearchResultProcessor;
/** @var ProductRepositoryInterface */
private $productRepository;
public function __construct(
ForkedSearchResultProcessor $forkedSearchResultProcessor,
ProductRepositoryInterface $productRepository,
SearchCriteriaBuilder $searchCriteriaBuilder
) {
$this->forkedSearchResultProcessor = $forkedSearchResultProcessor;
$this->productRepository = $productRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
}
$searchCriteria = $this->searchCriteriaBuilder->create();
$productRepository = $this->productRepository;
$callback = function ($item) {
$item->getData();
// do your business logic here
};
$this->forkedSearchResultProcessor->process(
$searchCriteria,
$productRepository,
$callback,
$pageSize = 1000,
$maxChildrenProcess = 10,
$isIdempotent = true
);
}
use Zepgram\MultiThreading\Model\ForkedCollectionProcessor;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
class MyAwesomeClass
{
/** @var ForkedCollectionProcessor */
private $forkedCollectionProcessor;
public function __construct(
ForkedCollectionProcessor $forkedCollectionProcessor,
CollectionFactory $collectionFactory
) {
$this->forkedCollectionProcessor = $forkedCollectionProcessor;
$this->collectionFactory = $collectionFactory;
}
$collection = $this->collectionFactory->create();
$callback = function ($item) {
$item->getData();
// do your business logic here
};
$this->forkedCollectionProcessor->process(
$searchCriteria,
$productRepository,
$callback,
$pageSize = 1000,
$maxChildrenProcess = 10,
$isIdempotent = true
);
}
use Zepgram\MultiThreading\Model\ForkedArrayProcessor;
class MyAwesomeClass
{
/** @var ForkedArrayProcessor */
private $forkedArrayProcessor;
public function __construct(ForkedArrayProcessor $forkedArrayProcessor)
{
$this->forkedArrayProcessor = $forkedArrayProcessor;
}
$array = [1,2,3,4,5,...];
$callback = function ($item) {
echo $item;
// do your business logic here
};
$this->forkedArrayProcessor->process(
$array,
$callback,
$pageSize = 2,
$maxChildrenProcess = 2
);
}
use Zepgram\MultiThreading\Model\Dimension\ParallelStoreProcessor;
use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
class MyAwesomeClass
{
/** @var ParallelStoreProcessor */
private $parallelStoreProcessor;
/** @var CollectionFactory */
private $collectionFactory;
public function __construct(
ParallelStoreProcessor $parallelStoreProcessor,
CollectionFactory $collectionFactory
) {
$this->parallelStoreProcessor = $parallelStoreProcessor;
$this->collectionFactory = $collectionFactory;
}
$array = [1,2,3,4,5,...];
$callback = function (StoreInterface $store) {
// retrieve data from database foreach stores (do not load the collection !)
$collection = $this->collectionFactory->create();
$collection->addFieldToFilter('type_id', 'simple')
->addFieldToSelect(['sku', 'description', 'created_at'])
->setStoreId($store->getId())
->addStoreFilter($store->getId())
->distinct(true);
// handle pagination system to avoid memory leak
$currentPage = 1;
$pageSize = 1000;
$collection->setPageSize($pageSize);
$totalPages = $collection->getLastPageNumber();
while ($currentPage <= $totalPages) {
$collection->clear();
$collection->setCurPage($currentPage);
foreach ($collection->getItems() as $product) {
// do your business logic here
}
$currentPage++;
}
};
// your collection will be processed foreach store by a dedicated child process
$this->parallelStoreProcessor->process(
$callback,
$maxChildrenProcess = null,
$onlyActiveStores = true,
$withDefaultStore = false
);
}
bin/magento thread:processor <command_name> [--timeout=<timeout>] [--iterations=<iterations>] [--environment=<environment>] [--progress]