# -*- coding: utf-8 -*-
# @Author: Wang chunsheng email:2192138785@qq.com
# @Date: 2020-05-21 12:33:30
# @Last Modified by: Wang chunsheng email:2192138785@qq.com
# @Last Modified time: 2020-05-21 14:27:51
# -*- coding: UTF-8 -*-
# ------------------------------------------------------------------------------
# 改为继承指定文件夹里的模块 -- by Tommy 2017-5-11
# 新增LOAD_TYPE,可以动态加载包,不需要每次都重启ppython服务 -- by Tommy 2017-9-22
# -------------------------------------------------------------------------------
import sys
import time
import threading
import socket
import importlib
import php_python
REQUEST_MIN_LEN = 10 #合法的request消息包最小长度
TIMEOUT = 180 #socket处理时间180秒
LOAD_TYPE = 0 #0为默认的,只导入一次,若包文件有改动,需重启ppython服务。1为动态加载,每次都会reload这个包,此时不需要重启ppython服务
pc_dict = {} #预编译字典,key:调用模块、函数、参数字符串,值是编译对象
global_env = {} #global环境变量
def index(bytes, c, pos=0):
"""
查找c字符在bytes中的位置(从0开始),找不到返回-1
pos: 查找起始位置
"""
for i in range(len(bytes)):
if (i <= pos):
continue
if bytes[i] == c:
return i
break
else:
return -1
def z_encode(p):
"""
encode param from python data
"""
if p == None: #None->PHP中的NULL
return "N;"
elif isinstance(p, int): #int->PHP整形
return "i:%d;" % p
elif isinstance(p, str): #String->PHP字符串
p_bytes = p.encode(php_python.CHARSET);
ret = 's:%d:"' % len(p_bytes)
ret = ret.encode(php_python.CHARSET)
ret = ret + p_bytes + '";'.encode(php_python.CHARSET)
ret = str(ret, php_python.CHARSET)
return ret
elif isinstance(p, bool): #boolean->PHP布尔
b=1 if p else 0
return 'b:%d;' % b
elif isinstance(p, float): #float->PHP浮点
return 'd:%r;' % p
elif isinstance(p, list) or isinstance(p, tuple): #list,tuple->PHP数组(下标int)
s=''
for pos,i in enumerate(p):
s+=z_encode(pos)
s+=z_encode(i)
return "a:%d:{%s}" % (len(p),s)
elif isinstance(p, dict): #字典->PHP数组(下标str)
s=''
for key in p:
s+=z_encode(key)
s+=z_encode(p[key])
return "a:%d:{%s}" % (len(p),s)
else: #其余->PHP中的NULL
return "N;"
def z_decode(p):
"""
decode php param from string to python
p: bytes
"""
if p[0]==0x4e: #NULL 0x4e-'N'
return None,p[2:]
elif p[0]==0x62: #bool 0x62-'b'
if p[2] == 0x30: # 0x30-'0'
return False,p[4:]
else:
return True,p[4:]
elif p[0]==0x69: #int 0x69-'i'
i = index(p, 0x3b, 1) # 0x3b-';'
return int(p[2:i]),p[i+1:]
elif p[0]==0x64: #double 0x64-'d'
i = index(p, 0x3b, 1) # 0x3b-';'
return float(p[2:i]),p[i+1:]
elif p[0]==0x73: #string 0x73-'s'
len_end = index(p, 0x3a, 2) # 0x3a-':'
str_len = int(p[2:len_end])
end = len_end + 1 + str_len + 2
v = p[(len_end + 2) : (len_end + 2 + str_len)]
return str(v, php_python.CHARSET), p[end+1:]
elif p[0]==0x61: #array 0x61-'a'
list_=[] #数组
dict_={} #字典
flag=True #类型,true-元组 false-字典
second = index(p, 0x3a, 2) # 0x3a-":"
num = int(p[2:second]) #元素数量
pp = p[second+2:] #所有元素
for i in range(num):
key,pp=z_decode(pp) #key解析
if (i == 0): #判断第一个元素key是否int 0
if (not isinstance(key, int)) or (key != 0):
flag = False
val,pp=z_decode(pp) #value解析
list_.append(val)
dict_[key]=val
return (list_, pp[2:]) if flag else (dict_, pp[2:])
else:
return p,''
def parse_php_req(p):
"""
解析PHP请求消息
返回:元组(模块名,函数名,入参list)
"""
print('全部',p)
while p:
v,p=z_decode(p) #v:值 p:bytes(每次z_decode计算偏移量)
params = v
modul_func = params[1] #第一个元素是调用模块和函数名
print("模块和函数名:%s" % modul_func,params,params[0])
print("参数:%s" % params[2:])
pos = modul_func.find("::")
modul = modul_func[:pos] #模块名
func = modul_func[pos+2:] #函数名
return params[0],modul, func, params[2:]
class ProcessThread(threading.Thread):
"""
preThread 处理线程
"""
def __init__(self, socket):
threading.Thread.__init__(self)
#客户socket
self._socket = socket
def run(self):
#---------------------------------------------------
# 1.接收消息
#---------------------------------------------------
try:
self._socket.settimeout(TIMEOUT) #设置socket超时时间
firstbuf = self._socket.recv(16 * 1024) #接收第一个消息包(bytes)
if len(firstbuf) < REQUEST_MIN_LEN: #不够消息最小长度
print ("非法包,小于最小长度: %s" % firstbuf)
self._socket.close()
return
firstComma = index(firstbuf, 0x2c) #查找第一个","分割符
print('查找第一个',firstComma,firstbuf,firstbuf[0:firstComma])
totalLen = int(firstbuf[0:firstComma]) #消息包总长度
print("消息长度:%d" % totalLen,firstbuf)
reqMsg = firstbuf[firstComma+1:]
print(reqMsg)
while (len(reqMsg) < totalLen):
reqMsg = reqMsg + self._socket.recv(16 * 1024)
#调试
#print ("请求包:%s" % reqMsg)
except Exception as e:
print ('接收消息异常', e)
self._socket.close()
return
#---------------------------------------------------
# 2.调用模块、函数检查,预编译。
#---------------------------------------------------
#从消息包中解析出模块名、函数名、入参list
addons,modul, func, params = parse_php_req(reqMsg)
sys.path.append(addons)
#检查模块、函数是否存在
if (modul not in pc_dict): #预编译字典中没有此编译模块
#检查模块、函数是否存在
try:
tommy = modul.find(".") #将模块名和子模块分开
modulname = modul[tommy+2:] #指定子模块
callMod = __import__ (modul,fromlist = (modulname,)) #根据module名,反射出module
pc_dict[modul] = callMod #预编译字典缓存此模块
except Exception as e:
print ('模块不存在:%s' % modul)
self._socket.sendall(("F" + "module '%s' is not exist or there is an error in your .py file!" % modul).encode(php_python.CHARSET)) #异常
self._socket.close()
return
else:
callMod = pc_dict[modul] #从预编译字典中获得模块对象
if (LOAD_TYPE == 1):
print('reload module')
callMod = importlib.reload(callMod) # 重新载入模块
try:
callMethod = getattr(callMod, func)
except Excep
没有合适的资源?快使用搜索试试~ 我知道了~
AI会员管理系统人脸识别
共1656个文件
php:829个
png:173个
js:170个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 174 浏览量
2022-03-27
16:15:24
上传
评论
收藏 33.8MB ZIP 举报
温馨提示
是一个基于人脸识别的会员管理系统。可应用于商场客流统计、门店智能管理和店内监控等。是一款基于 yii2 的,并且集成了 AI 技术、智能硬件设备对接技术的软硬件开源框架。它采用 yii2+uniapp+swagger 的开发模式,从接口开发到接口文档都非常快捷方便。同时结合 uniapp 一端开发、多端发布的优势,让一套代码实现 AI 技术对接 app/各种小程序、H5 端的发布
资源推荐
资源详情
资源评论
收起资源包目录
AI会员管理系统人脸识别 (1656个子文件)
127.0.0.1 0B
init.bat 513B
yii_test.bat 328B
yii_test.bat 328B
yii.bat 323B
.bowerrc 43B
www.wayfirer.com 1.8MB
app.conf 2KB
index.css 288KB
index-main.css 288KB
bootstrap.css 143KB
style.css 120KB
bootstrap.min.css 118KB
AdminLTE.css 112KB
AdminLTE.min.css 89KB
ionicons.css 56KB
css-assets.css 52KB
ionicons.min.css 50KB
ionicons.min.css 50KB
all-skins.css 47KB
ueditor.css 43KB
all-skins.min.css 40KB
font-awesome.css 37KB
ueditor.min.css 34KB
font-awesome.min.css 30KB
font-awesome.min.css 30KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
video-js.css 21KB
image.css 18KB
site.css 16KB
video.css 15KB
attachment.css 14KB
site.css 14KB
video-js.min.css 11KB
shCoreDefault.css 7KB
style.css 6KB
bootstrap-switch.min.css 5KB
skin-black-light.css 5KB
skin-blue-light.css 5KB
skin-purple-light.css 5KB
skin-yellow-light.css 5KB
skin-green-light.css 5KB
skin-red-light.css 5KB
skin-black.css 4KB
skin-black-light.min.css 4KB
skin-blue-light.min.css 4KB
require.css 4KB
skin-blue.css 4KB
skin-purple-light.min.css 4KB
skin-yellow-light.min.css 4KB
skin-green-light.min.css 4KB
skin-purple.css 4KB
skin-yellow.css 4KB
skin-green.css 4KB
skin-red-light.min.css 4KB
scrawl.css 4KB
skin-red.css 4KB
skin-black.min.css 4KB
skin-blue.min.css 3KB
skin-purple.min.css 3KB
skin-yellow.min.css 3KB
skin-green.min.css 3KB
skin-red.min.css 3KB
codemirror.css 3KB
charts.css 3KB
background.css 2KB
site.css 2KB
site.css 2KB
site.css 2KB
site.css 2KB
emotion.css 2KB
dialogbase.css 2KB
music.css 2KB
build.css 1KB
edittable.css 1KB
template.css 1KB
firetech.css 829B
webuploader.css 515B
style.css 416B
webuploader.css 397B
table-editor.css 394B
help.css 389B
video-uploader.css 95B
iframe.css 41B
Dockerfile 164B
Dockerfile 164B
Dockerfile 163B
fontawesome-webfont.eot 162KB
ionicons.eot 118KB
glyphicons-halflings-regular.eot 20KB
vjs.eot 3KB
acceptance.suite.yml.example 217B
acceptance.suite.yml.example 217B
UEditorSnapscreen.exe 508KB
wface.gif 49KB
jxface2.gif 40KB
yface.gif 28KB
bface.gif 27KB
icons.gif 20KB
共 1656 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
资源评论
觅码巡航员
- 粉丝: 2
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功