supervisor守护的php脚本如何自我检测更新并重启

关于使用 supervisor 守护的php脚本任务,如何检测自己的代码有变更,然后自动重新启动的问题

这里不讨论由 cron 执行 php 脚本的方式, 因为它每个循环都会重新加载代码

思路

常驻进程的代码, 内部肯定有个循环读取数据并处理数据的逻辑, 我们只要在这里加上判断,然后终止当前程序,再由 supervisor 重新启动即可.

  1. 在脚本启动时, 用 filemtime() 获取当前脚本文件的修改时间, 记录到变量

  2. 在内部循环中, 检查当前脚本文件的最后修改时间. 如果记录比当前值小, 则退出当前程序

如果这个脚本文件引用的其他文件有变更, 但是它自己没有变更怎么办呢? 难道要判断所有加载的文件是否变更吗? 那样成本有点大了, 当然你也可以这么做.

建议在这个脚本文件中, 定义一个版本号, 每次修改或关联文件修改后都去更新一下版本号, 以确保文件更新被识别到.

代码示例

示例代码:

//当前文件路径
$file_path = __DIR__ . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME'];
//文件修改时间
$file_update_time = filemtime($file_path);

//版本号
$version = 123;

//是否是第一次循环. 第一次不判断文件是否变更
$first_loop = true;
while (true) {
    if (!$first_loop) {
        //这里必须先清除PHP函数结果的缓存
        clearstatcache(true, $file_path);
        if (filemtime($file_path) > $file_update_time) {
            //文件改变, 退出当前程序
            echo 'Changed' . PHP_EOL;
            break;
        }else{
            echo 'not changed...' . PHP_EOL;
        }
    }

    $first_loop = false;
    sleep(1);
}

在workerman中监控文件更新并自动reload, 也是类似的操作. 只是我们这里只有一个进程, 不能用另外的worker来执行检测任务.

注意

1、 clearstatcache() 的使用

为了提高性能,PHP对部分函数的结果进行了缓存。 受影响的函数包括 stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() 和 fileperms()。

2、在PHPStorm中编码时

在PHPStorm的terminal中执行脚本, 在代码编辑区修改并查看循环状态时,务必修改后让鼠标离开编辑区(或者手动保存), 否则ps不会保存文件, 也就看不到结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值