记一次蛋疼的PHP后台任务

要求实现这样一个功能(亲MA爱FAN的客户)

想同时设置多个时间段的,怎么实现呢,例如,10001.10020.10080.在8.30自动转,10086..10000.7852.在8.30.01自动转,1896.8569.0852.在8.30.02自动转
 
我大概理解了,意思就是 用户ID与ID之间转账 不过是设定好的时间转出去,而且时间是不确定的,可能是20:30:08秒 可能是20:30:22秒,那么用服务器的定时任务是肯定行不通了
 
emmm。。。绞尽脑汁
 
看下php定时任务吧、网上说的天花乱坠,蛋疼中。
 
16.png

具体转账的业务代码块就如下了 查询到现在前3秒 后3秒没有处理的单就处理掉 不过怎么让他自动跑起来呢

 //任务块
  public function runtaskblock(){

       try
       {
          db()->startTrans();

          //获取当前时间
          $now = time();
          $start = $now - 3;
          $end = $start + 3;

          $where = [];
          $where['sendtime'] = array('between',$start.",".$end);
          $where['status'] = array('eq',0);

          $list = db("com_plat")->where($where)->select();

          if ($list) {

             foreach ($list as $k => $v) {
                $users = json_decode($v['senduid']);

                $recvuid = $v['recvuid'];

                foreach ($users as $i => $u) {

                    if ($u == $recvuid) {
                       continue;
                    }
                    $usercoin = db("capital_user_coin")->where(['uid'=>$u])->find();
                    $user_coin_in  = db('capital_user_coin')->where(['uid'=> $recvuid])->find();

                    //转账金额
                    $amount = $v['amount'];
                    
                    if (!$usercoin || $usercoin['ebao'] - $amount <0) {
                       continue;
                    }

                    db('capital_user_coin')->where(['uid'=> $u])->update([
                        'ebao'  => ['exp', "ebao-{$amount}"],
                    ]);

                    db('capital_user_coin')->where(['uid'=> $recvuid])->update([
                        'ebao'=> ['exp', "ebao+{$amount}"],
                    ]);

                    //转账人支出
                    db('capital_user_coin_log')->insert([
                        'uid'=> $u,
                        'amount'=> $amount,
                        'now'=> $usercoin['ebao'] - $amount,
                        'type'=> 1, // [0: '增加', 1: '减少']
                        'kind'=> 8, // [8: '转账']
                        'coin_code'=> 'ebao',
                        'remark'=> "转账金额-".$amount.'-收款人-'.$recvuid,
                        'addtime'=>date('Y-m-d H:i:s'),
                    ]);

                    //接收人增加
                    db('capital_user_coin_log')->insert([
                        'uid'=> $recvuid,
                        'amount'=> $amount,
                        'now'=> $user_coin_in['ebao'] + $amount,
                        'type'=> 0, // [0: '增加', 1: '减少']
                        'kind'=> 8, // [8: '转账']
                        'coin_code'=> 'ebao',
                        'remark'=> "收款金额".$amount.'-付款人-'.$u,
                        'addtime'=>date('Y-m-d H:i:s'),
                    ]);
                    db("com_plat")->where(['id'=>$v['id']])->update(['status'=>1]);
                }
                
             }

             db()->commit();
          }
       }
       catch(Exception $e)
       {  
          file_put_contents("platlog.txt",$e->getMessage()."\n",FILE_APPEND);
          db()->rollback();
       }
  }

瞬间想到 swoole(不熟)、js轮询、还有试了php自己带的关掉浏览器照样执行 各种行不通 还差点没把Apache跑死

哎 聪明的我想到了python 虽然不会 但还是喀喀喀搞定了

新建一个plat.py (皮肉交易) 脚本 代码如下 (原谅我第一次用py)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests   #导入requests包
import time
url = 'http://www.fuck86.com'

while (True):
   print(url)
   r = requests.get(url)
   print(r.status_code)
   time.sleep(2)

又百度了下py的后台任务
服务器又装了py2 又有py3 途中又是各种报错,各种不兼容
最终解决方案 是下面一条命令 具体什么意思 emmm 。。凑合用吧 
nohup python3 -u  plat.py > platout.log 2>&1 &
45.png
 
总而言之,言而总之,算是跑起来了  
 
2秒请求一次,一次把当前3秒后3秒没处理的单子处理掉
 
于是过了半天 发现进程挂掉了
 
哎,勉强再研究下吧 我开两个线程你再死我也没办法聊,只能请教高人了 
 
# -*- coding:utf-8 -*-
import requests
from threading import Thread
import time
from time import sleep,ctime
url = "http://www.fuck86.com"
def get_info():
	# while True:
	    try:
	        res = requests.get(url)
	        print res.status_code
	    except Exception as e:
	        print e

def main():
	    thread_array={}
	    start_time = time.time()   #开始计时
	    for tid in range(2):
	        t = Thread(target = get_info)  #线程中执行my_counter函数
	        t.start()
	        # print"%s is running thread No.%d"%(ctime(),tid+1)
	        t.join()  #等待到该线程结束,才开始执行下一个线程
	        # print"%s thread No.%d ended"%(ctime(),tid+1)
	        sleep(1)        
	    end_time = time.time()     #结束计时
	    # print("Total time:{}".format(end_time-start_time))

if __name__ == '__main__':
	while True:
            main()
    	    sleep(1)

 

最后告诉客户 有问题不要找我了  水平太菜 没办法

我又把心里话说出来了

 
 
q.gif
 
本博客所有文章如无特别注明均为原创。作者:odaycaogen复制或转载请以超链接形式注明转自 123``blog
原文地址《记一次蛋疼的PHP后台任务

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(2)

哈哈哈哈 耿直boy
2b 10个月前(01-05) 回复
@2b:2b青年快乐多
odaycaogen 9个月前(01-06) 回复