12次请求后,Firebase或Python-firebasin库不再发送和接收数据

1 投票
1 回答
624 浏览
提问于 2025-04-18 13:39

我遇到了一个问题,请帮帮我。

我写了一个Python脚本,用来和Firebase合作,保存和接收数据。我的脚本使用的是python-firebasin这个库(链接到python-firebasin)。我用我的Firebase账号(HACKER PLAN)测试了这个应用一周,期间一切都很好。

之后我购买了一个高级账号,网址是像x.firebaseio.com这样的格式,这时候问题就来了。我把旧Firebase里的数据结构导入到新的Firebase账号,并在我的Python脚本中设置了新的Firebase网址。现在一切应该在我的新高级账号上正常工作。

我运行了我的脚本,前大约60秒内一切正常,回调事件也能正常工作,设置值也没问题。但是在大约60秒后,Firebase就不再接收数据,也不再向我的Python脚本发送任何回调了。

为了调试,我写了一个简单的脚本,每5秒向Firebase发送一次时间戳。前12次请求(12 * 5 = 大约60秒)都正常,但之后Firebase就不再接收任何数据了。Python也没有报错,回调也没有。

注意:在我的旧Firebase账号(HACKER PLAN)上,一切都正常!

from firebasin import Firebase
from time import sleep, time

# Firebase
vGFirebase = None

vGCompanyId = '1'
vGHardwareId = '0000000000123123'

i = 1

vGFirebase = Firebase('https://subdomain.firebaseio.com')

def errorCallback(data):
    print('errorCallback', data)

while True:
    try:
        pingChild = vGFirebase.child('data/app/pings/' + str(vGCompanyId) + '/' +  str(vGHardwareId))
        sendTime = int(time())
        pingChild.set(sendTime, errorCallback)
        print(i, 'send ', sendTime)
        i += 1
        sleep(5)
    except:
        print('Exception')
        break

vGFirebase.waitForInterrupt()

我在python-firebasin库中启用了调试模式。所以在12次请求后,我收到了这个消息:(('Closed down :(', 1006, 'Going away'),)。我觉得这可能是因为Firebase关闭了连接……但为什么呢?

抱歉我的英语不好……

1 个回答

3

firebasin 并不会自动发送心跳信号来保持连接活跃。你可以自己轻松地启动一个。在创建 vGFirebase 的那一行之后:

from ws4py.websocket import Heartbeat
while not vGFirebase.connection.data:
    sleep(1)
Heartbeat(vGFirebase.connection.data,2).start()

不幸的是,dataref.py 中的 _keep_alive 方法似乎和黑客的计划不太兼容,当它发送自己的保持连接消息时,会导致连接断开,所以你也需要禁用这个方法。你可以通过在脚本顶部添加

import firebasin
firebasin.dataref.RootDataRef._keep_alive = lambda *x: None

来临时解决这个问题。还有一种更永久但不太灵活的解决方案,就是修改 dataref.py,把它的 _keep_alive 方法替换成一个可以启动 ws4py 的心跳信号的方法。我已经提交了一个请求,希望能在上游进行修改;我们看看为什么 Abe Haskins 一开始没有这样做。

撰写回答