如何在PHP和Python之间建立持续连接

1 投票
2 回答
835 浏览
提问于 2025-04-17 19:26

我想做一个实时应用程序。这里是我的情况——

我有数据通过我的一个COM端口传输到我的电脑,然后用Python来获取这些数据并显示出来。为此,我使用了一个简单的Python serial模块,它可以通过串口读取数据并显示。

现在,这些数据对我来说是本地的。为了更高级的用途,我需要把这些数据发布到我的一个在线网站上,这个网站上运行着apache网络服务器,可以让全世界的人看到这些数据。

所以为了实现实时性,我需要不断监控串口,获取数据,并持续地把这些数据发送到网络服务器(PHP端)。也就是说,读取串口数据和发送到服务器的操作要同时进行。

现在问题来了——

  1. 我该如何在发送数据到网络服务器的同时,监控来自COM端口的数据呢?

  2. 如果我持续发送数据,网络服务器怎么知道这些数据是连续的?为了解决这个问题,我想把数据保存到网络服务器的数据库中,并让PHP脚本持续监控这个数据库。如果你有更好的方法,请告诉我。

2 个回答

0

在Python中,最简单的方法是使用两个线程。线程1会从串口读取数据,使用的是阻塞调用,也就是说它会一直等着,直到有数据可读,然后把读取到的所有数据放进一个线程安全的队列里。线程2则会从这个队列中取出数据,发送到远程的PHP服务器(如果发送失败会一直重试),然后休息2秒,再继续这个过程。

从Python调用的PHP脚本只需要把数据插入到数据库中。前端的PHP脚本会从数据库中获取这些数据并展示出来。

0

一般来说,当你在做一个实时应用程序时,它会在一个接口接收数据,然后在另一个接口发送数据。这种情况下,你需要几个线程和至少几个队列。
如果你想让你的程序根据事件来驱动(强烈推荐!),你还应该设置一些事件,当接收到输入时就会触发。

针对你的问题,我建议:

1个线程用于COM读取
1个线程用于COM写入(如果需要写的话)
1个线程用于PHP写入
1个线程用于PHP读取(如果需要读取的话)
1个队列用于COM输入
1个事件用于COM输入

每当在COM端口接收到数据时,COM读取线程就会把这些数据写入COM输入队列。如果你愿意,可以在放入队列之前先验证一下这些数据。

然后,COM输入队列会把COM输入事件设置为真,这就相当于给PHP写入队列一个“停止”的信号。

接着,PHP队列会循环处理所有添加到COM输入队列中的内容,直到队列为空,然后把COM输入事件设置为假,等待更多输入后再继续循环。

确保队列是线程安全的,或者在它周围加一个互斥锁,这里有几个链接可能对你有帮助:

Python锁
Python事件
Python队列


在网络服务器方面,当你向网络服务器发送数据时,应该使用http POST消息。根据你在请求中放入的内容,你可以把数据发送到网络服务器上的一个脚本,这个脚本会验证、处理并存储这些数据。

不过不幸的是,我在这方面不是专家,所以不能给你太多建议。

撰写回答