Find file containing specific text on Linux, Mac OS X using command line
grep -Ril "text-to-find-here" /
Some code recipes and useful scripts.
grep -Ril "text-to-find-here" /
redis-cli -h <host> -p <port> flushall
The command will remove all data from client connected (with host and port).
You can easily generate self-signed SSL certificate for your local machine using openssl this command line tool
openssl req -x509 -nodes -days 365 -newkey rsa:1024 \
-keyout /etc/ssl/private/mylocal.key \
-out /etc/ssl/certs/mylocal.crt
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
SELECT
waiting_trx_id,
waiting_pid,
waiting_query,
blocking_trx_id,
blocking_pid,
blocking_query
FROM sys.innodb_lock_waits;
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_trx_id;
log stream --predicate '(process == "smtpd") || (process == "smtp")' --info
$obj = \Magento\Framework\App\ObjectManager::getInstance();
$fileHandler = $obj->create(\Magento\Framework\Logger\Handler\Base::class, ['fileName' => 'var/log/debug.log']);
$logger = $obj->create(\Monolog\Logger::class, [
'name' => 'save',
'handlers' => ['file' => $fileHandler],
'processors' => ['process_id' => $obj->get(\Monolog\Processor\ProcessIdProcessor::class)]
]);
$logger->info(var_export(\Magento\Framework\Debug::backtrace(1, 0, 1), 1));
Result could be found in var/log/debug.log
The following solutions helps to find duplicate image file for each product and to remove it.
Create file delete.php in Magento base directory, put the following code into the file.
<?php
include('app/Mage.php');
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ob_implicit_flush(1);
$mediaApi = Mage::getModel("catalog/product_attribute_media_api");
$_products = Mage::getModel('catalog/product')->getCollection();
$i = 0;
$total = count($_products);
$count = 0;
foreach ($_products as $_prod) {
$_product = Mage::getModel('catalog/product')->load($_prod->getId());
$_md5Values = array();
//protected base image
$baseImage = $_product->getImage();
if ($baseImage != 'no_selection') {
$filePath = Mage::getBaseDir('media') . '/catalog/product' . $baseImage;
if (file_exists($filePath)) {
$_md5Values[] = md5(file_get_contents($filePath));
}
}
$i++;
echo "processing product $i of $total " . PHP_EOL;
// Loop through product images
$_images = $_product->getMediaGalleryImages();
if ($_images) {
foreach ($_images as $_image) {
//protected base image
if ($_image->getFile() == $baseImage) {
continue;
}
$filePath = Mage::getBaseDir('media') . '/catalog/product' . $_image->getFile();
if (!file_exists($filePath)) {
continue;
}
$md5 = md5(file_get_contents($filePath));
if (in_array($md5, $_md5Values)) {
$mediaApi->remove($_product->getId(), $_image->getFile());
echo 'removed duplicate image from ' . $_product->getSku() . PHP_EOL;
$count++;
} else {
$_md5Values[] = $md5;
}
}
}
}
To launch the script just launch in terminal
>php delete.php
Or visit
http://YourWebsiteURL/delete.php
from your browser.
Thanks to Aadil for a solution.
Reindex category products index at first and then execute following sql-script.
UPDATE `catalog_category_entity_int` AS `status`
INNER JOIN `eav_attribute` AS `attr` ON `attr`.`attribute_code` = 'is_active'
AND `attr`.`entity_type_id` = 3
AND `status`.`attribute_id` = `attr`.`attribute_id`
SET `status`.`value` = IF((SELECT COUNT(`index`.`product_id`)
FROM `catalog_category_product_index` AS `index`
WHERE `index`.`category_id` = `status`.`entity_id` GROUP BY `index`.`category_id`) > 0, 1, 0)
WHERE `status`.`store_id` = 0
Magento has two attributes “Set Product As New From Date” and “Set Product As New To Date” to set a product as new. If both fields are empty the product is not new. If only “Set Product As New To Date” is set, the product will be marked as “new” from current time until “Set Product As New To Date”. And If you set only “Set Product As New From Date” attribute the product will be marked as new from that date until forever. But how to check is product “new” currently?
Unfortunately Magento doesn’t have special method for this. But in Mage_Core_Model_Locale model there is a method called isStoreDateInInterval($store, $dateFrom, $dateTo) which checks is current date in two passed dates interval. But we need additional validation two dates are not empty, otherwise that method will return true. So we can create such method in some helper class:
<?php
public function isProductNew(Mage_Catalog_Model_Product $product)
{
$newsFromDate = $product->getNewsFromDate();
$newsToDate = $product->getNewsToDate();
if (!$newsFromDate && !$newsToDate) {
return false;
}
return Mage::app()->getLocale()
->isStoreDateInInterval($product->getStoreId(), $newsFromDate, $newsToDate);
}
If you don’t have access to store’s admin panel, but you have access to a database, you can easily add new Magento admin panel user via MySQL script.
Before you launch the next script, please, be sure your password is 8 symbols length and has at least 1 digit.
LOCK TABLES `admin_role` WRITE , `admin_user` WRITE;
SET @SALT = "mr";
SET @PASS = CONCAT(MD5(CONCAT( @SALT , "password") ), CONCAT(":", @SALT ));
SELECT @EXTRA := MAX(extra) FROM admin_user WHERE extra IS NOT NULL;
INSERT INTO `admin_user` (firstname,lastname,email,username,password,created,lognum,reload_acl_flag,is_active,extra,rp_token_created_at)
VALUES ('First name','Last name','email@example.com','username',@PASS,NOW(),0,0,1,@EXTRA,NOW());
INSERT INTO `admin_role` (parent_id,tree_level,sort_order,role_type,user_id,role_name)
VALUES (1,2,0,'U',(SELECT user_id FROM admin_user WHERE username = 'username'),'First name');
UNLOCK TABLES;