PHP实现订单派单

PHP如何实现订单派单

需求:
用户下单成功后,订单表中有经纬度。骑手登录之后会不停的更新经纬度。寻找最近1公里的骑手,1公里没有骑手,就扩大2公里。依次类推,每次增加1公里(可设置)。最终目标是把这个订单派发给骑手。
目前用thinkphp5命令行运行,总是提示Allowed memory size of 134217728 bytes exhausted。命令行中通过递归增加公里,但测试只能运行5次,就出错。
请问大家有什么好的方法来轮询订单派送。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 17
gongmeng

1、限制增加次数(超过5公里的骑手,在业务上是否合理) 2、增加 PHP 运行内存 :stuck_out_tongue_winking_eye:

1年前 评论

用 Redis 或者 ES 的 GEO 能力,不用自己算

1年前 评论

同上 明显GEO合适些

1年前 评论

上go语言

1年前 评论

可以用 Redis 的 GEOHASH 实现,省事

1年前 评论
  • 直接 MySQL 根据经纬度 查 5/10 公里内的骑手,然后安装距离排序就行,按公里累加查有点不合适。
  • 骑手位置信息同步至 reids , 用 redis geo,也可以查询排序,这个更适合一点
  • 实在想轮询就循环分块查询,限制查询数据的量,结果只保留排名前10的骑手,没有看出来需要递归的点
1年前 评论
转打瞎比比 (楼主) 1年前
  • 改php.ini或者用 php -d memory_limit 加大内存
  • mysql里的经纬度字段改成geo类型的,用sql就可以查出来附近xx公里然后按距离排序。

你说的递增它需要递归吗?

1年前 评论

mysql有现成好用的计算距离的函数的,把骑手经纬度 定时保存到表里,直接查出按消费者距离排序的所有骑手,不是很方便吗?

 $sql = 'select   st_distance_sphere(point( ?,? ),
             point( machine_report_longitude, machine_report_latirtude )  ) distance
             from wws_machine where id= ? ';
1年前 评论

用户下单流程把订单号和订单主键索引,经纬度存储到redis geo,就可以完成查询。

1年前 评论

感觉5次轮询就把内存打爆了有点奇怪啊。 要不换种实现:骑手每N分钟上报位置,存到 redis(数据库也行),订单来了就取当时所有骑手的位置信息和用户位置做计算(存数据库要自己算),把订单派给最近的骑手就完了。也不用轮询,简单的计算也不耗内存。如果用 redis 的话,它自带的geo还更快。 redis geo 没用过,不过应该不难的。mongo 也有 geo

1年前 评论
转打瞎比比 (楼主) 1年前

别递归了,直接for循环.或者搞一个限制,递归限制调用多少次,要不然无论多大内存都得内存溢出

1年前 评论
转打瞎比比 (楼主) 1年前
sanders

简单点思考:直接在数据库里,根据经纬度计算距离排序,取第一条。

经理的要求你要翻译成程序可以理解的。

1年前 评论

内存爆了你是有泄露,解决了这个问题就OK了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!