think-queue 静态变量污染问题探究

文章讨论了PHP中单进程和daemon工作模式在处理消息队列时的区别,涉及内存管理、垃圾回收和内存泄漏风险。单进程模式可能导致内存污染,而daemon模式虽然能持续处理消息,但会占用更多内存。相比之下,listen模式更安全,避免了内存泄漏和变量污染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.work: 单进程的处理模式;

无 daemon 参数 work进程在处理完下一个消息后直接结束当前进程。当不存在新消息时,会sleep一段时间然后退出;

因为执行一次就退出了,不存在污染问题。

有 daemon 参数 work进程会循环地处理队列中的消息,直到内存超出参数配置才结束进程。当不存在新消息时,会在每次循环中sleep一段时间;

这里会造成内存污染,

代码演示效果

①.先定义一个TestS测试类

<?php
namespace app\api\job;
class TestS
{
   
    public static $num = 0;
    public function __construct(){
   
        echo "TestS construct \n";
    }
    public static function testNum(){
   
        self::$num++;
        return self::$num;
    }
    public function __destruct() {
   
        //在 PHP 中有一种垃圾回收机制,
        //当对象不能被访问时就会自动启动垃圾回收机制,
        //收回对象占用的内存空间。而析
我现在的项目结构为“project/ ├── include/ │ └── queue.h # 头文件 ├── src/ ├── main.c # 主程序 └── queue.c # 功能实现“且tasks.json文件为“{ "version": "2.0.0", "tasks": [{ "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应 "command": "gcc", // 要使用的编译器,C++用g++ "args": [ "${file}", "-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out "${fileDirname}/${fileBasenameNoExtension}.exe", "-g", // 生成和调试有关的信息 "-m64", // 不知为何有时会生成16位程序而无法运行,此条可强制生成64位的 "-Wall", // 开启额外警告 "-static-libgcc", // 静态链接libgcc,一般都会加上 "-fexec-charset=GBK", // 生成的程序使用GBK编码,不加这条会导致Win下输出中文乱码;繁体系统改成BIG5 "-D__USE_MINGW_ANSI_STDIO", // 用MinGW写C时留着,否则不需要,用于支持printf的%zd和%Lf等 ], // 编译的命令,其实相当于VSC帮你在终端中输了这些东西 "type": "process", // process是把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍 "group": { "kind": "build", "isDefault": true // 不为true时ctrl shift B就要手动选择了 }, "presentation": { "echo": true, "reveal": "always", // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档,即使设为never,手动点进去还是可以看到 "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义 "panel": "shared" // 不同的文件的编译信息共享一个终端面板 }, "problemMatcher":"$gcc" // 捕捉编译时终端里的报错信息到问题面板中,修改代码后需要重新编译才会再次触发 // 本来有Lint,再开problemMatcher就有双重报错,但MinGW的Lint效果实在太差了;用Clangd可以注释掉 }] }”而launch.json为“{ "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\${fileBasenameNoExtension}.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "internalConsoleOptions": "neverOpen", "MIMode": "gdb", "miDebuggerPath": "gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "Compile" }, { "name": "C/C++ Runner: Debug Session", "type": "cppdbg", "request": "launch", "args": [ "" ], "stopAtEntry": false, //D:\\Code\\VScode\\algorithm "cwd": "D:\\Code\\VScode\\algorithm", "environment": [], //D:\\Code\\VScode\\algorithm\\build\\Debug\\outDebug "program": "D:\\Code\\VScode\\algorithm\\build\\Debug\\outDebug", "internalConsoleOptions": "openOnSessionStart", "MIMode": "gdb", "miDebuggerPath": "gdb", "externalConsole": false, "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }”现在试图使用vscode调试c代码,且项目中包含多个.c与.h文件请帮我修订tasks.json文件与launch.json问价使其能够完成多个文件的调试
03-20
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oraclechaozi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值