php 使用宝塔执行长时间问题

客户的需求是,半夜三点清算。由于操作非常耗时间,在五分钟以上。这里总结一下办法,让php半夜三点长时间执行。不超时,不崩溃。
宝塔本身有自带定时任务。

1,用宝塔定时半夜三点,访问网站,网站执行不就好了?

根据下面设置,成功!


//ignore_user_abort(true);
// 设置时区
 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

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'; // 协议 支持 tcp udp unix http websocket text
    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');

        // 每分钟的第2秒执行.//这里应该使用正确的时间
        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';
        });


		//这个是定时器示例
//		 $time_interval = 5;
//		 Timer::add($time_interval, function()
//		 {


//		 });
	}
}

3,使用shell 执行thinkphp 方法

利用宝塔定时器,shell 执行thinkphp 默认命令

//新建入口文件 ,我习惯绑定模块,不喜欢绑定的也可以
namespace think;
// 加载基础文件
require __DIR__ . '/../thinkphp/base.php';
// 支持事先使用静态方法设置Request对象和Config对象
// 执行应用并响应
Container::get('app')->bind('worker')->run()->send();

//worker文件夹里面文件index.php文件
<?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 建的服务!

你可能感兴趣的:(thinkphp,php学习,php,linux)