Day 22 - [API] 使用 PHP 执行 Python 脚本

嗨! 昨天终於结束了语料库模型建置的部分,再来就要建立 API 了。这个系统中我采用了一个比较特别的架构,服务器是 Ubumtu + Apache + PHP,API 主要使用 PHP 撰写,并由 PHP 去执行 Python 脚本(也就是前面建置的 TF-IDF 语料库模型),再回传结果。可以参考下图。

系统架构

其实 Python 也是可以写後端的,但我缺少建置 Python 服务器的经验,期间我尝试搭配 Python + Apache、用 Python 的框架建置服务,一直没有成功。哀,这又是另一个走错路的故事了。

後来听了朋友建议,采用一个比较像绕过问题的方式,使用 PHP + Apache 作为 API 端服务,PHP 去执行 Python 脚本。换句话说,就是把 PHP 当作是 Android 与 TF-IDF 语料库之间的桥梁。不过,我觉得这不是一个最好的写法。

做都做了,还是要记录一下啊,今天这篇就来介绍使用 PHP 执行 Python 脚本的方法吧。

程序码

以编号 001 这支来说明
完整程序码: https://gitlab.com/graduate_lab415/chatbot-api/-/blob/master/getAnswer.php

<?php
/**
 * 001 [POST] /Chatbot/getAnswer.php
 * 以使用者输入的语句查询,回传资料集中与输入最相似的 3 笔问答组合。
 * 
 * q: 使用者输入的问句
 * category_id: 使用者选择的类别编号
 */
header('Content-Type: application/json; charset=utf-8');
$q = $_POST['q'];
$category_id = $_POST['category_id'];
$output = exec('/home/yr/PycharmProjects/nlp/venv/bin/python3 /home/yr/PycharmProjects/nlp/main.py ' . $q . ' ' . $category_id . ' 2>/home/yr/PycharmProjects/nlp/output/log.txt', $output2);
print($output);

首先,会收两个 Post 参数 $_POST['q']$_POST['category_id'] 执行 Python 脚本时,再把参数带进去。

$output 会得到 Python 印出的 JSON 内容,再印出来给 Android 端。

简略一点,就是这个样子。因为我用的是 Pycharm 的 venv 所以路径要复杂一点。

python3 main.py "我想申请长照" 2 2>log.txt

2>log.txt: 把标准错误写到档案中

API

本系统总共有 3 支 API: getAnswer、addAdjustment、getCategories。
各自的详细说明与程序码在这: https://gitlab.com/graduate_lab415/chatbot-api


本文同步发布在: https://dreambo4.github.io/2021/10/06/API-%E4%BD%BF%E7%94%A8-PHP-%E5%9F%B7%E8%A1%8C-Python-%E8%85%B3%E6%9C%AC/


<<:  [Day 21] 资料关联

>>:  卡夫卡的藏书阁【Book22】- Kafka - KafkaJS 消费者 4

设计模式种类与建议研读方法

在这本GOF的设计模式中 共有23种设计模式 作者将这些设计模式又依照目的性粗略分为三大类,分别是:...

Day 12 Odoo Server Actions (ir.actions.server)

Odoo模组开发实战 目录 1.Actions 1.1 Server Actions (ir.act...

Day 19 | 万年范例-TodoList(2)

回到昨天留下的问题 card数太长要怎麽办 TextFiled 送出後怎麽清除里面的字 其实只要将 ...

JS 24 - 请求支援前,要先发送请求!

大家好! 发送请求时,各位有没有多写好几行程序码的经验呢? 今天就是要简化如此复杂的动作。 我们进入...

新新新手阅读 Angular 文件 - Interpolation(1) - Day13

本文内容 本文内容为阅读官方文件有关interpolation 的笔记内容。 利用 interpol...