客户的需求是,半夜三点清算。由于操作非常耗时间,在五分钟以上。这里总结一下办法,让php半夜三点长时间执行。不超时,不崩溃。
宝塔本身有自带定时任务。
1,用宝塔定时半夜三点,访问网站,网站执行不就好了?
根据下面设置,成功!
date_default_timezone_set('PRC');
set_time_limit(0);
ini_set('memory_limit', '-1');
fastcgi_finish_request();
echo date('Y-m-d H:i:s');
echo '------';
for($i=1;$i<20;$i++){
var_dump($i);
file_put_contents('/www/wwwroot/tp.com/lizhili.txt',$i.'--'.date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
sleep(10);
}
file_put_contents('/www/wwwroot/tp.com/222.txt',date('Y-m-d H:i:s'),FILE_APPEND);
echo date('Y-m-d H:i:s');
echo '------';
echo 'ok';
2,thinkphp 安装上了workerman ,使用workerman的定时功能
根据下面成功,但是注意,这个重启就失效了,可以根据我以前的文章设置,开机自启。https://blog.csdn.net/weixin_42249565/article/details/122715565
//先安装 workerman的插件,我使用tp5.1
composer require topthink/think-worker=2.0.*
//然后安装 定时插件
composer require workerman/crontab
<?php
namespace app\http;
use \Workerman\Lib\Timer;
use think\worker\Server;
use think\Db;
use Workerman\Crontab\Crontab;
class Worker extends Server
{
protected $protocol = 'tcp';
protected $host = '0.0.0.0';
protected $port = 2347;
protected $name = 'thinkphp';
protected $count = 1;
protected $lian=[];
public function onWorkerStart($worker){
date_default_timezone_set('PRC');
new Crontab('2 * * * * *', function(){
$name=date('YmdHis');
echo '------';
for($i=1;$i<20;$i++){
var_dump($i);
file_put_contents($name.'.txt',$i.'--'.date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
sleep(10);
}
file_put_contents($name.'2.txt',date('Y-m-d H:i:s'),FILE_APPEND);
echo date('Y-m-d H:i:s');
echo '------';
echo 'ok';
});
}
}
3,使用shell 执行thinkphp 方法
利用宝塔定时器,shell 执行thinkphp 默认命令
namespace think;
require __DIR__ . '/../thinkphp/base.php';
Container::get('app')->bind('worker')->run()->send();
<?php
namespace app\worker\controller;
use think\Db;
class Index
{
public function index()
{
$name=date('YmdHis');
echo '------';
for($i=1;$i<20;$i++){
var_dump($i);
file_put_contents($name.'.txt',$i.'--'.date('Y-m-d H:i:s').PHP_EOL,FILE_APPEND);
sleep(10);
}
file_put_contents($name.'2.txt',date('Y-m-d H:i:s'),FILE_APPEND);
echo date('Y-m-d H:i:s');
echo '------';
echo 'ok';
}
}
利用宝塔定时器,执行shell
#!/bin/bash
cd /www/wwwroot/tp.com
php public/worker.php index/index
4,使用shell 执行thinkphp 自定义命令,用命令调用方法
这个我不写了,和3类似,不是很难,自己写吧,就是新建一个 command 然后调用 thinkphp里面的方法
5,利用tcp或者rpc 调用 ,thinkphp 用workerman或者swoole 建的服务!
|