• Как записать base64 в таблицу?

    @d-sem
    Если возникла необходимость заполнять базу данных файлами, то возможно, что базы данных тут не нужны.
    Сохраняйте ссылки на файлы.
    Ответ написан
    Комментировать
  • Какой Object pool стоит использовать в Rust?

    bingo347
    @bingo347
    Crazy on performance...
    меня очень смущает постоянно выделять буффер

    Конкретно в данном примере буффер выделяется на стеке, то есть на его выделение не тратится ровным счетом ничего, так как стек и так уже выделен при запуске потока.
    Есть конечно копеечные затраты ресурсов на заполнение буфера нулями. И если в буффер гарантированно сначала идет запись, как в данном случае, то это в принципе можно обойти:
    use std::mem::MaybeUninit;
    let mut buffer = unsafe {
        #[allow(invalid_value)]
        MaybeUninit::<[_; 1024]>::uninit().assume_init()
    };
    Но я бы так не делал. Во-первых чистота кода не стоит этих копеек производительности, а во-вторых немного накосячите с чтением и будет UB.
    Ответ написан
    3 комментария
  • Битрикс генерирует очень много трафика, куда копать?

    @paqquete Автор вопроса
    Ну, собственно да, по словам инженерной поддержки это скорее всего и был диск, запросил способы управлять таким поведением, если будет что-то - закину сюда
    Ответ написан
    Комментировать
  • Как настроить push&pull WebSocket RTC на ВМ Битрикс 24 с обратным проксированием nginx?

    @sevnet Автор вопроса
    Системный аналитик, бизнес-консультант
    Всё таки сам разобрался, с двадцать второй попытки всё взлетело.
    4hRoelc.png
    4hRodMd.png
    Сначала про нюансы и проблемы, с которыми столкнулся конкретно я.
    1. На Б24 ВМ в моём случае порты 8010:8015,9010,9011 прослушивались не на localhost (127.0.0.1), а на IP локальной сети (сетевого интерфейса). Поэтому в моём случае необходимо было добавить в цепочку INPUT iptables правила (на Б24 ВМ):
    iptables -I INPUT -p tcp --match multiport --dport 8010:8015 -j ACCEPT
    iptables -I INPUT -p tcp --match multiport --dport 9010:9011 -j ACCEPT

    Для того чтобы проверить, какие порты и на каких интерфейсах прослушиваем ВМ Б24 вводим:
    netstat -ntulp
    2. Вот в этой инструкции от Б24 всё прекрасно, кроме одного, но очень существенного момента. В ней указывается, что необходимо скачать на реверс-прокси вот этот файл bx/settings/rtc-im_settings.conf и включить его в секцию http nginx.conf. Если сделать так как сказано, у нас в данном файле окажется следующая настройка:
    upstream nodejs_sub {
      ip_hash;
      keepalive 1024;
      server push:8010;
      server push:8011;
      server push:8012;
      server push:8013;
      server push:8014;
      server push:8015;
    }
    upstream nodejs_pub {
      ip_hash;
      keepalive 1024;
      server push:9010;
      server push:9011;
    }

    и даже если вы подмените переменную push на реальный IP ВМ Б24, у вас реверс-прокси в директиве
    location ~* ^/bitrix/subws/ {
        access_log off;
        proxy_pass http://nodejs_sub;
        ...

    будет передавать весть трафик не на 443й порт ВМ Б24, который слушает nginx ВМ Б24, а напрямую на порты push-server'а ВМ Б24, а тот в свою очередь ожидает этот трафик от nginx ВМ Б24, поэтому так работать не будет. Сам по себе push-server это модуль разработки Б24, никаких исчерпывающий инструкций по его работе в интернет просто не существует, поэтому пытаться его настроить на получение трафика от реверс-прокси гиблая идея на корню.
    Следовательно действовать согласно инструкции от Б24 можно и нужно, но в указанной выше части, нужно пропустить обе директивы upstream nodejs_sub в файле bx/settings/rtc-im_settings.conf, оставить надо только обе директивы map.
    3. В этом посте на форуме Б24 в предложенном конфиге для реверс-прокси nginx есть параметр
    proxy_set_header Authorization "" ;
    есть его применить, у вас навсегда разлогинится мобильное приложение, и даже при указании верного пароля вы не сможете залогиниться в него обратно.
    4. Ни где (ни в инструкция ни на форуме Б24) не указано, что необходимо привести в соответствие в директиве http nginx.conf реверс прокси ряд параметров, которые содержатся в аналогичной директиве ВМ Б24. А это логично и соответственно необходимо для корректной работы.

    В итоге вот сборка 100% работающая (быстро и без сбоев) из моих конфигов для реверс-прокси nginx:
    1. Обновляем Nginx на реверс прокси, минимум до такой же версии как и на ВМ Б24, в моём случае это была версия 1.20.2, которая уже содержала необходимые пакеты nginx-extras, необходимые для передачи специальных заголовков websocket.
    2. Настройки реверс-прокси nginx.
    В nginx.conf в директиву http добавляем параметры из nginx.conf ВМ Б24 (у меня они собраны в bx/bx_general_proxy_settings.conf) и директивы map из файла bx/settings/rtc-im_settings.conf:
    include bx/settings/rtc-im_settings.conf;
            include bx/bx_general_proxy_settings.conf;

    bx/bx_general_proxy_settings.conf
    proxy_connect_timeout           300;
            proxy_send_timeout              300;
            proxy_read_timeout              300;
            proxy_buffer_size               64k;
            proxy_buffers                   8 256k;
            proxy_busy_buffers_size         256k;
            proxy_temp_file_write_size      10m;
    
            gzip                            on;
            gzip_proxied                    any;
            gzip_static                     on;
            gzip_http_version               1.0;
            gzip_types                      application/x-javascript application/javascript text/css;
    
            default_type application/force-download;
    
            tcp_nopush                      on;
            tcp_nodelay                     on;
    
            client_max_body_size            1024m;
            client_body_buffer_size         4m;

    bx/settings/rtc-im_settings.conf
    log_format simple '$time_local $status $request';
    
    # if connection ti not set
    map $http_upgrade $connection_upgrade {
      default upgrade;
      '' 'close';
    }
    
    map $http_upgrade  $replace_upgrade {
      default $http_upgrade;
      ''      "websocket";

    Конфиг для DNS Б24:
    server {
        listen       80;
        if ($host = {DNS name}) {
            return 301 https://$host$request_uri;
        } # managed by Certbot
    }
    server {
            listen       443 ssl;
            server_name {DNS name} www.{DNS name};
            access_log /var/www/httpd-logs/{DNS name}.access.log;
            error_log /var/www/httpd-logs/{DNS name}.error.log notice;
            ssl_certificate /etc/letsencrypt/live/{DNS name}/fullchain.pem; # managed by Certbot
            ssl_certificate_key /etc/letsencrypt/live/{DNS name}.su/privkey.pem; # managed by Certbot
            ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
            ssl_prefer_server_ciphers on;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
            location / {
    
                    proxy_ignore_client_abort on;
                    proxy_pass https://{IP VM B24}:443;
                    proxy_redirect https://{IP VM B24}:443 /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-Port $server_port;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header HTTPS YES;
    
                # for Push&Pull
                location /bitrix/subws/ {
                    access_log off;
                    proxy_max_temp_file_size 0;
                    proxy_read_timeout  43800;
                    proxy_http_version 1.1;
                    proxy_pass https://{IP VM B24}:443;
                    proxy_set_header Upgrade $replace_upgrade;
                    proxy_set_header Connection $connection_upgrade;
                    proxy_redirect https://{IP VM B24}:443 /;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-Port $server_port;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header HTTPS YES;
                }
                location /bitrix/sub/ {
                    access_log off;
                    rewrite ^/bitrix/sub/(.*)$ /bitrix/subws/$1 break;
                    proxy_pass https://{IP VM B24}:443;
                    proxy_max_temp_file_size 0;
                    proxy_read_timeout  43800;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-Port $server_port;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header HTTPS YES;
                }
    
                location /bitrix/rest/ {
                    access_log off;
                    proxy_pass https://{IP VM B24}:443;
                    proxy_max_temp_file_size 0;
                    proxy_read_timeout  43800;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-Port $server_port;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header HTTPS YES;
                }
             }

    Для перечитывания конфигов используем
    nginx -s reload
    Для тестирования
    nginx -t
    Для перезагрузки
    systemctl restart nginx
    На ВМ Б24 не забываем включить модуль real_ip в BitrixVM – создаем конфигурационный файл bx/settings/real_ip.conf:
    set_real_ip_from {IP revers-proxy};
    real_ip_header X-Forwarded-For;

    3. ОБЯЗАТЕЛЬНО копируем SSL сертификат и ключ c реверс-прокси на ВМ Б24 и прописываем его в bx/conf/ssl.conf. Без него - не работает! И этого ни в одной инструкции не было! При этом с реверс-прокси, мы весь трафик отправляем на https 443й порт ВМ Б24.
    4. Если всё равно не работает переустановите Push-server на ВМ Б24:
    4hRqc87.png
    4hRqebM.png
    4hRqhdx.png
    Ответ написан
    Комментировать
  • Как из родителя запустить метод в ребенке Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    через ref:

    <button @click="$refs.child.someMethod()">call child method</button>
    <child-component ref="child"></child-component>
    Ответ написан
    2 комментария
  • Как простым языком объяснить человеку, зачем делать дизайн сайта в Figma, а не в Битрикс?

    @roman_vo
    Как объяснить человеку, что ездить на велосипеде удобнее, чем на велосипедном шлеме?
    Ответ написан
    Комментировать
  • Как объединить многомерные массивы?

    VlasenkoFedor
    @VlasenkoFedor
    Программист: php, js, go
    print_r(array_replace_recursive($array_1, $array_2, $array_3));
    Ответ написан
    Комментировать
  • Как сохранить значения из лога за последние два дня?

    grep "$(date -d "-2day" +"%b %d")\|$(date -d "-1day" +"%b %d")\|$(date -d +"%b %d")"  $ipfw/ipfw.log >> $ipfw/reject_log_2d
    Ответ написан
    1 комментарий
  • Обязательно ли программисту работать в команде для развития?

    Прокачаться можно, тут дело времени и склада ума, но как по мне, лучше (уже имея некую базу) пойти работать джуниором в команду и чем жёстче будут наставники - тем лучше :)

    PS ничто не мешает найти единомышленников и организовать командную работу вне офиса.
    Главное желание! :)
    Ответ написан
    1 комментарий
  • Можно ли вывести названия всех компонентов на странице и пути к ним?

    Попробуйте методы
    getCurrentIncludedComponent()
    getComponentStack()

    у CMain ($APPLICATION)

    Если не сработает, то всегда можете включить режим отладки, и все компоненты будут подсвечены

    5a38c9b4b0579361538558.png5a38caba06f60831337227.png5a38cac22c6ac892954309.png
    Ответ написан
    Комментировать
  • Как определить что находишься на детальной странице каталога?

    в component_epilog записывайте в глобальную переменную или свойство страницы нужный флажок
    Ответ написан
    1 комментарий
  • Как исправить ошибку [[2006] MySQL server has gone away]?

    2ord
    @2ord
    Если чисто сетевых проблем на уровне инфраструктуры нет, то тогда
    https://matomo.org/faq/troubleshooting/faq_183/
    Ответ написан
    1 комментарий
  • Битрикс, как узнать адрес детальной страницы?

    смотрите
    1) настройки компонента news
    2) файл urlrewrite.php
    3) настройки инфоблока
    Ответ написан
    4 комментария
  • Объединение 3х таблиц и выборка данных без дублирования?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    SELECT `m`.`name`, `m`.`phone`, IFNULL(`t`.`cities`, '')
      FROM (
        SELECT `mc`.`manager_id` AS `manager_id`, 
               GROUP_CONCAT(`c`.`name`) AS `cities`
          FROM `manager_cities` AS `mc`
          JOIN `cities` AS `c` ON `c`.`kladr_id` = `mc`.`kladr_id`
          GROUP BY `mc`.`manager_id`
      ) AS `t`
      RIGHT JOIN `managers` AS `m` ON `m`.`manager_id` = `t`.`manager_id`
    Ответ написан
    1 комментарий
  • Как запустить фоновый php?

    frost18
    @frost18
    Программист PHP
    1) Ваш вариант на аяксе, проблема в том что сессия заблокируется, и вы не перейдете на другие страницы пока скрипт не завершит выполнение, тут можно вызвать session_write_close(); но все же это костыльный вариант, но рабочий.
    2) Если у вас апач стоит, то вы можете сделать так:
    echo 'ok';
    
    set_time_limit(0);
    ignore_user_abort(true);
    header("Connection: close");
    ob_flush();
    flush();
    
    sleep(10);
    file_put_contents('test.txt', 'success');

    Но на хостинге у меня так не прокатило, т.к там apache+nginx, а он заголовок Connection не пропускает, ставит свой "keep-alive"
    3) Вариант который мне подошел. Мне нужно было при оформлении заказа делать тяжелые операции (рассылка почты, отправка в CRM, логи и .п), но при этом результат этих операции не важен.
    public function isWin(){
    	return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
    }
    public function backgroundProcess($command){
    	if(!$this->isWin()){
    		$command = $command.' > /dev/null &';
    	}
    	$result = exec($command);
    	return $result;
    }

    Работает на linux, суть в том что к команде в конце добавляется "&" в конце, что запускает новый процесс.
    $obj->backgroundProcess('php /path../bg.php');

    P.S Вообще это все исключительные ситуации, PHP не должен работать в асинхронном режиме. Может вам лучше при каждом заходе на страницу делать записи в БД. А затем настроить планировщик задач CRON который будет выполнять ваш скрипт по этим записям.
    Ответ написан
    1 комментарий
  • Почему не появляются данные в бд?

    @Quark_rgb
    isset($_POST['submit']) Есть
    а в button нету name="submit"
    <button type="submit" name="submit" class="btn"></button>
    Ответ написан
    2 комментария
  • Как получить путь указанный в хлебной крошке?

    Rema1ns
    @Rema1ns
    и так сойдет
    В битриксе нет понятия основная категория или не основная, есть уровни вложенности.

    Если цепочка сформирована то можно получить массив элементов из $APPLICATION->arAdditionalChain
    Ответ написан
    1 комментарий
  • Что нужно сделать, чтобы после обновлений в битриксе не слетал шаблон?

    sabramovskikh
    @sabramovskikh
    Научиться пользоваться битриксом на дилетантском уровне
    Ответ написан
    Комментировать
  • Как менять SEO - данные в зависимости от города?

    Rema1ns
    @Rema1ns
    и так сойдет
    Скорее всего через отложенную функцию получают значение тайтла, возможно в хедере или футере, далее в строке ищут ##CITY_NAME## и заменяют на текущий город. Примерно так реализовано.
    Ответ написан
    Комментировать
  • Почему не выводятся картинки из папки?

    1. Права доступа к папке проверели?
    2. URL у вас получается "upload/...", то есть относительно текущего УРЛа страницы с картинками.
    То есть если это страница "www.example.com/gallery", то картинки будут "www.example.com/gallery/upload/...".
    Добавьте слэш $src = "/upload/...". Тогда сорс картинок будет "www.example.com/upload/...".
    Ответ написан
    Комментировать