Поиск

Найдена 21 статья по слову "php"

Как делать Mirror Repository (зеркало) на GitLab?

Шаг 1. Создаем репозиторий, который будет зеркалом, например https://gitlab.com/crusat/php-mirror - никаких веток и прочего туда не создаем.

Шаг 2. Заходим в репозиторий, с которого будем делать зеркало (т.е. основной репозиторий), например https://gitlab.com/crusat/php

Шаг 3. В меню находим Settings -> Repository, внутри раскрываем “Mirroring repositories”.

Шаг 4. Заполняем данные

Git repository URL - https://crusat:password@gitlab.com/crusat/php-mirror

Где: * crusat - ваш логин * password - ваш пароль (не бойтесь, после добавления они будут скрыты звездочками).

Password - еще раз вводим ваш пароль.

Жмем кнопку Mirror Repository.

Шаг 5. Должно появиться зеркало. Чтобы проверить - справа жмем кнопку со стрелочками для обновления данных. После этого можно перезагрузить страницу и посмотреть, что данные были отправлены (см. “Last successful update”). После этого идем смотреть в репозиторий https://gitlab.com/crusat/php-mirror, что все действительно успешно обновилось.

gitlab

Чиним вход через ЕСИА с ГОСТ-2012

Сухая выдержка без мата “ЧТО ДЕЛАТЬ”.

Предполагается, что вы уже получили папку (например, “MySite.001”), содержающую файлы header.key, masks.key, masks2.key, name.key, primary.key, primary2.key.

Все это делаем под Windows 10.

  1. Покупаем софт у ЛИССИ P12FromGostCSP http://soft.lissi.ru/ls_product/utils/p12fromcsp/ (на момент написания статьи стоит 2990 руб)
  2. Ждем письмо, при необходимости скорости пишем им в саппорт, почта саппорта указана при покупке.
  3. Присылают письмо с лицензией и ссылкой на скачивание P12FromGostCSP и скачиваете его. Пока не запускаем.
  4. Копируете папку “MySite.001” на флешку (любую).
  5. Устанавливаем триальный КриптоПРО CSP.
  6. Запускаем “Инструменты КриптоПРО”.
  7. Переходим во вкладку Контейнеры, он подгрузит контейнер “MySite.001” с флешки (у него будет уже нормальное имя), жмем Импортировать. Пароль обычно 12345678.
  8. Запускаем P12FromGostCSP, он подгрузит ключ из КриптоПРО. Жмем Экспортировать, выбираем папку.
  9. Все, у вас есть корректный PFX файл, который содержит сертификат и закрытый ключ.
  10. Теперь устанавливайте docker (если его еще нет).
  11. Из директории где лежит p12.pfx выполняете команду (потребуется ввести пароль): docker run –rm -v `pwd`:`pwd` -w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes
  12. В директории должен появиться закрытый ключ key.pem.
  13. Далее выполняете из той же директории команду: docker run –rm -v `pwd`:`pwd`-w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nokeys -out cert.pem
  14. Появится файл сертификата cert.pem.
  15. Далее необходимо сгенерировать публичный ключ из сертификата (необходим для проверки подписи): docker run –rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
  16. Готово, эти ключи понимает openssl с поддержкой ГОСТ-2012. Рекомендую использовать сборку php-fpm отсюда: https://github.com/rnixik/docker-openssl-gost
  17. Также потребуется применить эти файлы к вашему коду. Тут уже сами - у каждого свой код.

Для проверки используйте следующий код.

Подпись

Создайте файл с любым текстовым содержимым, например file.txt:

Some Data

Далее необходимо подписать файл (выходом будет бинарный формат, поэтому делаем base64):

docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -sign key.pem file.txt | base64 > signed.txt

Проверяйте, что файл появился и у него есть содержимое.

Проверка

Далее, раскодируем из base64 в бинарный формат:

base64 -D -in signed.txt > signed.bin

И проверяем подпись, сравнивая с исходным файлом и подписью:

docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -verify pubkey.pem -signature signed.bin file.txt

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

Также обратите внимание на этот репозиторий (сделал REST-сервис для подписи и проверки подписи): https://github.com/crusat/openssl-gost-rest

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

Источник: боль, кровь и мои слезы.

openssl

Docker показывает IP контейнера, а не пользователя

Это в первую очередь касается PHP проектов.

Делаем две вещи. Первое - для reverse proxy (если используется) у nginx дописываем в раздел следующее:

server {
    ...
    location / {
        ...
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
    ...
}

И рестартим nginx.

После этого у нас для переменной $_SERVER['HTTP_X_REAL_IP'] будет правильный IP-адрес клиента, а для $_SERVER['REMOTE_ADDR'], скорее всего, останется неправильной.

Второе, что делаем - надо прокинуть правильную переменную в fastcgi_param. Идем во внутренний nginx и исправляем конфиг:

server {
    ...
    location ~ \.php$ {
        ...
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        ...
    }
    ...
}
devops nginx php

Битрикс редиректит на старый домен

После переноса сайта на другой домен или ip-адрес он может начать редиректить, при заходе на него, на старый сайт.

Ситуация может быть в конструкции кода редиректа, например:

<?php
header('Location: http://oldsite.example')

Но, возможно, что это не привязано к коду. И в коде решение найти будет проблематично. Тогда, скорее всего, дело в системе безопасности битрикса. Для того, чтобы ее убрать, необходимо зайти в консоль MySQL и выполнить следующую команду:

> DELETE FROM b_module WHERE `ID`='security';

Query OK, 1 row affected (0.001 sec)

Источник: http://blog.ispsystem.info/2019/05/bitrix.html

bitrix

Отправка почты через mail() из php

Крайне не рекомендую использовать php-функцию mail() для отправки почты. Лучше все-таки отправлять ее через smtp с возможностью настройки из приложения всех необходимых данных.

Но в случае, чтобы тот же битрикс не ругался, можно проделать это следующим образом:

<span>1.</span> Устанавливаем sendmail

apt install sendmail -y

<span>2.</span> Вносим изменения в /etc/hosts:

127.0.0.1 localhost localhost.localdomain yourdomain
...

<span>3.</span> Перезапускаем конфиг (на все вопросы отвечаем утвердительно):

sendmailconfig

<span>4.</span> Перезагружаем все:

service nginx restart
service sendmail restart
service php7.0-fpm restart

<span>5.</span> Готово, можно проверять:

<?php

echo  mail(
    "mymail@yandex.ru",
    "test message",
    "test message",
    "From:no-reply@gmail.com"
);

bash bitrix devops linux php

Что такое Docker и что делать, если ваша команда его уже использует?

Что такое вообще этот docker и зачем он нужен?

Он обеспечивает изоляцию выполняемых программ в нем от окружения (программного обеспечения и настроек) вашей операционной системы.

Например, вы работаете над проектом, который использует PHP версии 7. И вдруг к вам на техподдержку приходит проект, который работает максимум на PHP 5.3. Что делать? Если не использовать Docker (или подобное ПО), то вам придется иметь на вашей рабочей машине две версии PHP и разруливать их. Учитывая остальное необходимое для работы приложения ПО, система довольно быстро замусоривается и вполне могут начаться конфликты между ПО, который необходим для одного проекта и неприемлим для другого.

Вы можете рассматривать контейнер docker’а как легковесную виртуальную машину (аналог vmware, virtualbox и т.п.). Только без графического интерфейса и выполняющую определенную программу.

Некоторые термины

Проект - исходный код и конфигурации проекта, над которым вы работаете, обычно находится в одном git-репозитории.

Образ - операционная система и набор программ, которые можно использовать для создания контейнера (программистам проще представлять его как “Класс”). Примеры - Ubuntu 18.04 с установленным PHP 7.1; Debian с установленным nginx; CentOS с установленным MySQL 5.7.

Контейнер - созданный на основе образа экземпляр, может накапливать внутри себя изменения (программистам проще представлять его как “Объект, экземпляр класса”).

Какая разница между командами docker и docker-compose?

Команда docker просто выполняет команду, которая следует в параметрах, например docker run hello-world запустит образ hello-world и покажет результат его выполнения.

Команда docker-compose работет с конфигурациями (файлы формата *.yml), которые содержат инструкции для сборки проекта. Также, он может запускать несколько контейнеров сразу, а не только один как команда docker.

Для разработки обычно используется docker-compose, т.к. он позволяет удобно передавать конфигурацию сборки между разработчиками.

Я только получил проект, что делать?

Для начала надо поднять проект локально. Для этого выполняется команда:

docker-compose up

Параметр up создает необходимые для работы проекта контейнеры. Если контейнеры уже были созданы, то он запускает их.

В самом простом случае этого должно быть достаточно чтобы запустить проект и начать работу.

Что за параметр -f?

Вам могла попадаться команда вида:

docker-compose -f docker-compose-dev.yml up

Параметр -f <путь_к_файлу_yml> позволяет указать путь к файлу конфигурации для запуска проекта.

Дело в том, что когда мы не указываем этот параметр, то это равнозначно -f docker-compose.yml - т.е. это стандартный путь к файлу конфигурации.

Т.е., две следующие команды - равнозначны (делают одно и то же):

docker-compose up
docker-compose -f docker-compose.yml up

Но, возможно есть несколько файлов конфигурации (например, один запускает только базу данных - docker-compose-db.yml, другой целиком бекенд - docker-compose-backend.yml, третий проект в продакшн режиме - docker-compose-production.yml), тогда и пригождается эта команда. В ней можно указать полный путь, например, /home/user/myproject/myconfigs/my-docker-compose.yml. Его можно применять для любого из параметров (up, down, start, stop, build и т.п.). Ставится всегда перед параметром, т.е. docker-compose -f <путь> <параметр start|stop|down|up|build>.

Что за параметр -d?

Это запуск проекта в фоновом режиме.

Например:

docker-compose up -d

Поднимает проект в фоне, т.е. вы не увидите логов приложения без особых команд. Ставится всегда после параметра, т.е. docker-compose <параметр> -d.

Я закончил работу с проектом, что делать?

Можно выполнить одну из двух команд.

Эта команда просто остановит контейнеры, то есть вы сможете быстро их запустить позже (командой docker-compose start):

docker-compose stop

А эта команда остановит и удалит контейнеры проекта, то есть вы освободите место на жестком диске, но запуск контейнеров будет производится дольше:

docker-compose down

Помните, что если вы использовали особую конфигурацию для поднятия проекта (параметр -f), то его же надо использовать и для этих команд, например, docker-compose -f docker-compose-db.yml stop.

Как посмотреть, какие контейнеры сейчас запущены?

Эта команда покажет запущенные контейнеры:

docker ps

А эта все созданные контейнеры:

docker ps -a

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

devops docker

Табличный вид заказа в письме в битриксе версии 18

Вот таким образом можно сделать табличный вид заказа с торговыми предложениями и самими товарами в письме. Для вывода таблицы в шаблоне нового заказа необходимо использовать переменную #ORDER_TABLE_ITEMS#. Картинки тоже прилагаются.

Файл init.php:

<?
AddEventHandler("sale", "OnOrderNewSendEmail", "ModifyOrderSaleMails");

function ModifyOrderSaleMails($orderID, &$eventName, &$arFields) {
    if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")) {
        $strOrderList = "";
        $dbBasketItems = CSaleBasket::GetList(
            array("NAME" => "ASC"),
            array("ORDER_ID" => $orderID),
            false,
            false,
            array("PRODUCT_ID", "ID", "NAME", "QUANTITY", "PRICE", "CURRENCY")
        );
        $strOrderList = "
                <style>
                    table.example {
                        border-collapse: collapse;
                        width: 585px;
                    }
                    table.example td {
                        border:1px solid black;
                    }
                    table.example td.num {
                        width: 30px;
                        text-align: center;
                    }
                </style>
                <table class=\"example\">
                    <tr>
                        <td class=\"num\" align=\"center\">№</td>
                        <td align=\"center\">Фото товара</td>
                        <td align=\"center\">Наименование</td>
                        <td align=\"center\">Количество</td>
                        <td align=\"center\">Цена, руб.</td>
                        <td align=\"center\">Cумма, руб.</td>
                    </tr>";
        $i = 0;
        while ($arProps = $dbBasketItems->Fetch()) {
            $i += 1;
            // image
            $offer = CIBlockElement::GetById(IntVal($arProps["PRODUCT_ID"]))->GetNext();
            $pictureId = $offer["PREVIEW_PICTURE"];
            if (is_null($pictureId)) {
                $realProductInfo = CCatalogSku::GetProductInfo(IntVal($arProps["PRODUCT_ID"]));
                $realProduct = CIBlockElement::GetById(IntVal($realProductInfo["ID"]))->GetNext();
                $pictureId = $realProduct["PREVIEW_PICTURE"];
            }
            $thumb = CFile::ResizeImageGet(
                $pictureId,
                array("width" => 200, "height" => 200),
                BX_RESIZE_IMAGE_PROPORTIONAL,
                false
            );
            $thumb = $thumb["src"];
            // sum
            $summ = $arProps['QUANTITY'] * $arProps['PRICE'];
            $strOrderList .= "<tr><td class=\"num\">".$i."</td><td><img src=\"http://".$_SERVER['SERVER_NAME'] . $thumb."\"></td><td>".$arProps['NAME']."</td><td>".$arProps['QUANTITY']."</td><td>".number_format((float)$arProps['PRICE'], 2, '.', '')."</td><td>".number_format((float)$summ, 2, '.', '')."</td><tr>";
        }
        echo "</table>";
        // пишем в переменную для письма
        $arFields["ORDER_TABLE_ITEMS"] = $strOrderList; 
    }
}
?>

Подобным образом можно добавить и другие переменные к письму.

bitrix php

git и PHPStorm — игнорирование файлов и папок

В PHPStorm, при использовании файла .gitignore будет происходить ошибка — что он не может добавить файлы, которые находятся в этих папках. Это очевидно, но хотелось бы, чтоб он просто не добавлял их и ошибки не показывал. Для этого в этой IDE предусмотрена следующая штука:

File -> Settings -> Version Control -> Ignored Files

И там можно добавить файлы и папки, которые не требуется хранить в контроле версий (например, директории assets и protected/runtime в Yii).

php

Debug в PHPStorm

Устанавливаем xdebug:

$ sudo apt-get install php5-xdebug

В php.ini вставить следующий блок (желательно в самый низ):
ВНИМАНИЕ! У вас путь zend_extension="/usr/lib/php5/20090626/xdebug.so" может отличатся! Необходимо написать путь до xdebug.so.

[XDebug]
zend_extension="/usr/lib/php5/20090626/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"

Перезапускаем apache:

$ sudo /etc/init.d/apache2 restart

Теперь в PHPStorm.
Заходим в настройки, раздел PHP, подраздел Debug. Проверяем, что в XDebug порт должен стоять — 9000. Принимаем все изменения.
Далее заходим в Run/Edit configuration, нажимаем на плюсик, добавляем PHP Web Application. Называем, например, «phpdebug». Напротив Server нажимаем «…».
Пишем имя веб-приложения, которое будем отлаживать, пишем виртуальный хост, в качестве дебаггера — XDebug. Принимаем все изменения.

Теперь ставим брейкпоинт и нажимаем shift+F9.

php

Проверить, установлен ли memcache на сервере

Самый простой способ — выполните на сервере команду:

$ php -i | grep -i memcache

Если вы увидите строки

memcache
memcache support => enabled

и подобные, то все установлено!

bash