18 Июнь, 2018

Проблемы с установкой node-sass [РЕШЕНО]

Итак, сегодня столкнулся с неожиданной проблемой во время установки зависимостей на сервере для одного из проектов. Привычно набрал npm i и увидел как после продолжительных мучений процесс установки крашнулся показав мне трейс из ошибок.

В трейсе присутствовали строчки:

g++: internal compiler error: killed (program cc1plus)

make: *** [Release/obj.target/libsass/src/libsass/src/ast.o] Error 4

Я не сразу догадался в чем дело и сперва пытался подоткнуть некоторые зависимости для сборки sass (libsass-dev, gcc, g++) и попробовал заюзать yarn. Последний показал себя не с лучшей стороны затянув процесс установки раза в два дольше чем npm и при этом показав менее понятный лог ошибок :thinking:

В итоге я догадался что процесс компиляции прерывается из-за нехватки памяти на сервере (1Gb RAM). Проблему решил включением swap'а.

Лучше после установки убрать swap.

dd if=/dev/zero of=/swapfile bs=4096 count=512k

mkswap /swapfile

swapon /swapfile

Создал себе временно своп на 2 гигабайта и все корректно и довольно быстро установилось.

09 Октябрь, 2017

Joomla 3.5 и Virtuemart - отправка письма покупателю сразу после покупки

По какой-то причине разработчики Virtuemart решили что письмо покупателю сразу после сделанного заказа отправлять не нужно. Письма шлются только после смены статуса заказа администратором магазина в админке. Да, это немного странное решение и как я понял не настраиваемое из коробки.

Так как решать вопрос надо было быстро то не обошлось без вмешательства в код Virtuemart:

administrator/components/com_virtuemart/models/orders.php

                // Send the email
                //$res = shopFunctionsF::renderMail('invoice', $order['details']['BT']->email, $vars, null,$vars['doVendor'],$this->useDefaultEmailOrderStatus);
                $sendMail = false;
                if(!$this->useDefaultEmailOrderStatus and isset($vars['newOrderData']['customer_notified']) and $vars['newOrderData']['customer_notified']==1){
                        $sendMail = true;
                } else {
                        $orderstatusForShopperEmail = VmConfig::get('email_os_s',array('U','C','S','R','X'));
                        if(!is_array($orderstatusForShopperEmail)) $orderstatusForShopperEmail = array($orderstatusForShopperEmail);

                        //TODO: Фикс для того чтобы письма отправлялись покупателю сразу после заказа
                        $orderstatusForShopperEmail[] = 'P';

                        if ( in_array((string) $vars['orderDetails']['details']['BT']->order_status,$orderstatusForShopperEmail) ){
                                $sendMail = true;
                                vmdebug('renderMail by default orderstati');
                        }
                }

Решение в виде одной строки сразу после коммента. Это мы добавляем статус "Pending" в список статусов при которых письма отправляются.

Вот и все)

15 Май, 2017

Bitrix debug

1) Отключаем в .htaccess auto_prepend_file /bitrix/modules/security/tools/start.php

2) Включаем логи в Битрикс /bitrix/.settings.php

  'exception_handling' =>
  array (
    'value' =>
    array (
      'debug' => true,
      'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE & ~E_DEPRECATED,
      'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING,
      'ignore_silence' => true,
      'assertion_throws_exception' => false,
      'assertion_error_type' => 256,
      'log' => array (
        'settings' => array (
          'file' => 'bitrix/modules/error.log',
          'log_size' => 1000000,
        ),
    ),
    ),
    'readonly' => true,
  ),

3) Или в php.ini

display_errors display_startup_errors error_log

4) Отладка выгрузки 1С

init.php

AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content)
{
    if (strpos($_SERVER['REQUEST_URI'],'/bitrix/admin/1c_exchange.php')!==false) {
        $codabra = date("Y-m-d H:i:s")."\n";
        $codabra.= $content."\n";
        $codabra.= $_SERVER['REQUEST_URI']."\n";
        $codabra.= "------------------------------\n";
        file_put_contents($_SERVER["DOCUMENT_ROOT"].'/schmex.log', $codabra, FILE_APPEND);
    }
}
09 Март, 2017

Полезности по MySQL

Пишу сюда некоторые запросы чтобы быстро скопипастить их в случае чего:

Получить 10 таблиц из всех БД на сервере с самым большим количеством записей

SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES ORDER BY TABLE_ROWS DESC LIMIT 10;

Получить 10 самых объемных таблиц из всех БД на сервере в мегабайтах

SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) `Size in MB` FROM information_schema.TABLES ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC LIMIT 10;

Получить 10 таблиц из БД dbname с самым большим количеством записей

SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname' ORDER BY TABLE_ROWS DESC LIMIT 10;

Получить 10 самых объемных таблиц из БД dbname в мегабайтах

SELECT TABLE_NAME, TABLE_ROWS, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) `Size in MB` FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname' ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC LIMIT 10;
17 Февраль, 2017

Авторизуемся без пароля в Cocpit CMS

Всем привет!

Нередко возникает такая ситуация когда пароль от админки сайта забыт, но при этом есть FTP/SSH или еще какой-либо другой доступ к файлам CMS.

Итак, тут все очень просто

Открываем файл cockpit/modules/core/Auth/bootstrap.php и закомменчиваем 20 строчку:

Cocpit CMS Authorize without password

И авторизуемся под необходимым пользователем с ЛЮБЫМ паролем. После того как войдете не забудьте расскомментировать строчку обратно иначе на сайт сможет зайти кто угодно.

03 Август, 2016

Добавляем страницы ошибок в Cockpit CMS

Привет! Как ни странно в официальной документации данной CMS, а также в документации роутера Lime который по умолчанию идет в комплекте с ней отсутствуют упоминания о том как добавить корректные обработчики страниц 404 и 500. Ответ нашелся в одном из issue на гитхабе посвященном вообще другому вопросу =)

Итак, чтобы все заработало перед маршрутами добавляем вот этот обработчик:

$app = new Lime\App();

$app->on("after", function() {
        switch($this->response->status){
            case "404":
                $this->response->body = $this->render(__DIR__."/views/404.php");
                break;
            case "500":
                $this->response->body = $this->render(__DIR__."/views/500.php");
                break;
        }
    });

$app->bind('/', function () use ($app) {

Как вы видите тут тоже кроется небольшой баг который мы обходим прописыванием абсолютного пути к вьюшкам. Вот и все, теперь все работает =)

Home← Старые записи