Все записи автора Павел Грибов

Вызов скрипта на python из php с передачей произвольных данных

Редко,  но бывает необходимо из скрипта на PHP, вызвать на исполнение скрипт на python с передачей неких параметров и данных.

Мне например понадобилось потому что основной код у меня на PHP,  а вот часть которая отвечает за взаимодействие с онлайн кассой Атол — на python, и переписывать эту часть на PHP нет возможности (без большого гемороя) —  заголовки драйвера Атола под Linux есть только на python (dto9fptr.py и dto9base.py — поставляются в комплекте с драйвером).

Ниже приведен один из способов:

PHP:

<?php

$idkkm= _POST("idkkm");

$sql = "SELECT * FROM online_kkm where id='$idkkm'";
$result = $sqlcn->ExecuteSQL($sql) or die("Не могу выбрать список настроек!" . mysqli_error($sqlcn->idsqlconnection));
$param=array();
$param["mode"]="getinfo";
while ($row = mysqli_fetch_array($result)) {
    $param["ipaddress"] = $row['ipaddress'];
    $param["ipport"] = $row['ipport'];
    $param["model"] = $row['model'];
    $param["accesspass"] = $row['accesspass'];
    $param["userpass"] = $row['userpass'];
    $param["protocol"] = $row['protocol'];
    $param["logfilename"] = $row['logfilename'];
    $param["testmode"] = $row['testmode'];
    $param["libpath"] = $row['libpath'];
    $param["version"] = $row['version'];
    $ppath= $row['ppath'];
};
$jsonparam= base64_encode(json_encode($param));
$command = "/usr/bin/env python $ppath $jsonparam 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

?>

Python:

#!/usr/bin/env python2
#encoding: UTF-8
import sys, json,base64

prm=json.loads(base64.b64decode(sys.argv[1]))

print prm["ipaddress"]

Т.е. что мы сделали?

  1. В скрипте на PHP сформировали json строку с параметрами и закодировали её в base64
  2. Вызвали python скрипт с аргументом в кодированной строки
  3. Python скрипт соответственно обратно декодирует и обрабатывает json

Профит.

Вложенный в письмо файл winmail.dat

Иногда попадаются письма, которые не удается распарсить средствами модуля imap на php — вложения он упорно видит одним файлом winmail.dat . Это «подарок» от Microsoft Outlook, который когда пользователь выбирает тип письма RTF, не заморачиваясь завертывает в файл winmail.dat и письмо, и вложения и с письмом помимо заголовков отправляет только это вложение. А люди — которые не пользуются Outlook — по мнению Microsoft — это ваши проблемы 😉

Решение — использование консольной утилиты tnef. Например:

tnef -f /usr/local/www/apache24/ssl/data/pays/1/rpost/winmail.dat -C /usr/local/www/apache24/ssl/data/pays/1/rpost

 

Загрузка изображений в справочник номенклатуры из csv файла Розница 2.2

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

Решение: пишем универсальный загрузчик изображений из csv. Изображения могут располагаться как в папке на жестком диске, так и в сети.

1) Выбираем разделитель  csv, стартовую строку (например первую строчку — обычно это названия колонок, нужно пропустить)

2) Выбираем колонки, где что находится в файле csv. Соответствие номенклатуры базы и файлу  идет по артикулу. Предусмотрена загрузка до 4-х картинок за один проход, которые располагаются в колонках «Ссылка 1..4». Если в колонке значение-1,  значит файла картинки нет в этой колонке.

3) Нажимаем кнопку «Загрузить CSV» и выбираем файл. После чего он будет загружен в табличную часть

Если  соответствие артикула и номенклатуры найдено в базе — будет заполнена колонка «Номенклатура».

4) Нажимаем кнопку «Прикрепить изображение». Обработка скачает картинку, сохранит его в базе или на томах, и прикрепит к номенклатуре:

Скачать обработку можно здесь

Читать далее Загрузка изображений в справочник номенклатуры из csv файла Розница 2.2

Программное присоединение изображения к номенклатуре. 1С Розница 2.2

Этот код присоединяет картинку к номенклатуре, и делает её «по умолчанию».

	ИмяВременногоФайла="c:\temp\minion.jpg";                        
    ном=Справочники.Номенклатура.НайтиПоКоду("1536       ");            
                                    
	ПараметрыФайла=Новый Структура;
	ПараметрыФайла.Вставить("Автор",Пользователи.НайтиПоИмени("Администратор"));
	ПараметрыФайла.Вставить("ВладелецФайлов",ном.Ссылка);
	ПараметрыФайла.Вставить("ИмяБезРасширения","бла-бла-3");
	ПараметрыФайла.Вставить("РасширениеБезТочки","jpg");
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное",ТекущаяУниверсальнаяДата());	
		
	ДвоичДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
	АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичДанные);
	
	фс=ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла,АдресВременногоХранилищаФайла,,,);
	
	об=ном.ПолучитьОбъект();
	об.ФайлКартинки= фс;
	об.Записать();

Сброс пароля root в MySQL 5.7

Алгоритм сброса теперь несколько отличается чем ранее.

1) Запускаем MySQL в safe mode

service mysqld stop
sudo mysqld_safe --skip-grant-tables &

2) Заходим в MySQL и сбрасываем пароль

mysql -u root mysql
update user set authentication_string=PASSWORD("новый_пароль") where User='root';
FLUSH PRIVILEGES;

Возможно захочется понизить уровень безопасности:

set global validate_password_policy=LOW

3) Добавление НОВЫХ пользователей:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
FLUSH PRIVILEGES;