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
<?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'; // 协议 支持 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 建的服务!

### 配置和启动 PHP WebSocket 服务器 #### 准备工作 为了确保WebSocket服务器能够顺利运行,在宝塔面板中需确认PHP已安装`redis`扩展。进入宝塔面板点击软件商城,查看并验证PHP服务是否已经成功加载Redis模块: ```bash php -m | grep redis ``` 此命令应返回`redis`表示模块存在[^1]。 #### 创建 WebSocket Server 脚本 创建一个新的PHP文件用于实现WebSocket服务器逻辑,命名为`WebSocketServer.php`: ```php <?php require 'vendor/autoload.php'; // 如果使用composer管理依赖则需要引入自动加载器 use Workerman\Worker; // 创建一个Websocket服务实例监听0.0.0.0:2345地址端口. $worker = new Worker('websocket://0.0.0.0:2345'); // 启动进程数量设置为4个 $worker->count = 4; // 当收到客户端消息时触发该事件处理函数 $worker->onMessage = function($connection, $data){ // 发送hello message给客户端 $connection->send('Hello '.$data); }; // 运行所有服务 Worker::runAll(); ?> ``` 注意:上述脚本假设使用Workerman框架来构建WebSocket应用,并且通过Composer安装了必要的库。如果未安装,则先执行`composer require workerman/workerman`下载所需组件。 #### 修改Nginx配置支持 WebSockets 和 WSS 协议 编辑站点对应的Nginx配置文件加入以下内容以支持WebSocket连接以及WSS加密传输协议。对于非SSL版本仅保留前半部分即可;而对于HTTPS网站,请确保包含完整的上下文: ```nginx location /wss { proxy_pass http://localhost:2345; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } ``` 针对WSS情况还需额外指定SSL证书位置等参数[^4]: ```nginx server { listen 443 ssl; server_name yourdomain.com; ssl_certificate cert.crt; ssl_certificate_key cert.key; location /wss { proxy_pass https://localhost:7272; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } ``` 完成以上更改后保存并重启Nginx使新配置生效。 #### 启动 WebSocket 服务 最后一步是在后台持续运行编写的WebSocket程序。可以通过命令行工具nohup让其忽略挂起信号从而保持长时间在线状态: ```bash nohup php WebSocketServer.php start & ``` 这样就可以在宝塔面板环境中成功搭建并启动基于PHP的WebSocket服务器了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个人的幸福online

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值