![如何可靠且正确地统计PHP中同一脚本的正在运行的进程数?](https://linux22.com/image/1607017/%E5%A6%82%E4%BD%95%E5%8F%AF%E9%9D%A0%E4%B8%94%E6%AD%A3%E7%A1%AE%E5%9C%B0%E7%BB%9F%E8%AE%A1PHP%E4%B8%AD%E5%90%8C%E4%B8%80%E8%84%9A%E6%9C%AC%E7%9A%84%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%95%B0%EF%BC%9F.png)
我目前使用的非常有缺陷的方法是:
tasklist /FI "WINDOWTITLE eq BLABLABLA" /NH
上面的 BLABLABLA 部分是当前确切的进程标题。(甚至不要让我开始说它没有自己的引号,因此无法轻松/正确地转义/保护。)
问题在于,只要进程标题相差一个字符,按照这个逻辑,它就会被视为不同的脚本。例如,我经常在窗口/进程标题中添加各种有用的提示,例如:
Actual title (5 seconds left...)
和:
[FINISHED] Actual title
和:
Actual title (4 / 9 items left)
和:
Actual title (35% downloaded)
等等。你明白我的意思了。进程标题经常变化,因此它对于检查唯一脚本来说并不可靠。
我发现的唯一其他方法是引用他们称之为“IMAGENAME”的东西(显然意味着“可执行名称”):
tasklist /FI "IMAGENAME eq php.exe" ...
这当然更糟因为它只会列出任何 php.exe 脚本!
我对“tasklist”命令的实验(使用--verbose输出并阅读其手册)并没有发现任何关于文件路径或任何唯一的每个文件id或类似内容的提及。
为什么它不让我做这样的事?
tasklist /FI "FILEPATH eq BLABLABLA" /NH
?
我曾想过自己在数据库中跟踪正在运行的脚本,但当事情没有完全按照计划进行时,这种方法似乎效率极低,而且不可靠。使用操作系统提供的命令绝对是最好的选择(除非 PHP 内置了该命令)。
我知道“eq”过滤器接受星号在最右边,但由于上述原因,这对我没有帮助。
我是否真的别无选择,只能坐下来分析完整的任务列表输出,并尝试删除进程标题的任何“动态”部分,以便我可以计算出具有与运行代码的脚本“相同”进程标题的正在运行的脚本的数量?这感觉非常黑客和愚蠢。它不能是正确的方式……
(PS:你知道,我一直一次又一次地感到困惑,到底有多少“显而易见的”(显然只对我而言)东西和功能缺失了。Windows 和 Linux 上的情况都一样。我认为是“最低限度”的东西不知何故被其他人认为是多余的/无用的。这真的让我很疑惑...)
答案1
您可以使用以下方法优化结果:
tasklist /fi "imagename eq php.exe" /v | find /i "Actual title"