在php-fpm环境(非workerman环境)内,如何创建常驻内存的定时器

evilk

问题描述

  1. 在一个PHP-FPM项目中,需要使用一个定时器,每10秒执行一些任务
  2. 写了一个PHP脚本,在终端执行,关闭终端后,就不再执行了
  3. workerman的timer似乎只能在workerman环境中使用

为此你搜索到了哪些方案及不适用的原因

目前我的做法是

  1. 使用symfony/process
  2. 再配合reactPHP
  3. 新建一个process.php,内容如下
    try {
    $process = new \Symfony\Component\Process\Process(['php', 'react-php-test.php']);
    $process->setOptions(['create_new_console' => true]);
    $process->start();
    echo $process->getPid();
    } catch (Throwable $throwable) {
    echo $throwable->getMessage();
    }
  4. react-php-test.php,内容如下
    $loop = React\EventLoop\Loop::get();
    // 创建一个定时器,每3秒执行一次,写入文件
    $loop->addPeriodicTimer(3, function () {
    file_put_contents('debug.txt', 'test' . PHP_EOL, FILE_APPEND);
    });
    $loop->run();
  5. 在命令行,手动执行php process.php,执行后,可关闭当前终端,会看到文件中,每3秒会写入'test'字符串
421 3 1
3个回答

nitron

1.自己写CLI
2.另外装个workerman跑

FPM的运行机制跟常驻内存基本绝缘

  • 暂无评论
释永战

FPM就别想了·····

  • 暂无评论
meows

fpm 要么用laravel的包,要么就linux Crontab

  • nitron 2023-11-03

    他要每10秒执行, crontab的最小间隔是分钟,虽然可以用别的方式取巧,但不是很靠谱

🔝