Вызов скрипта на python из php с передачей произвольных данных
Редко, но бывает необходимо из скрипта на PHP, вызвать на исполнение скрипт на python с передачей неких параметров и данных.
Мне например понадобилось потому что основной код у меня на PHP, а вот часть которая отвечает за взаимодействие с онлайн кассой Атол — на python, и переписывать эту часть на PHP нет возможности (без большого гемороя) — заголовки драйвера Атола под Linux есть только на python (dto9fptr.py и dto9base.py — поставляются в комплекте с драйвером).
Ниже приведен один из способов:
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?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:
1 2 3 4 5 6 7 |
#!/usr/bin/env python2 #encoding: UTF-8 import sys, json,base64 prm=json.loads(base64.b64decode(sys.argv[1])) print prm["ipaddress"] |
Т.е. что мы сделали?
- В скрипте на PHP сформировали json строку с параметрами и закодировали её в base64
- Вызвали python скрипт с аргументом в кодированной строки
- Python скрипт соответственно обратно декодирует и обрабатывает json
Профит.