从 PHP 调用外部 shell 脚本并获取其进程 ID
如何从 PHP 本身调用外部 shell 脚本(或者外部 PHP 脚本)并在同一脚本中获取其进程 ID?
How can I invoke an external shell script (Or alternatively an external PHP script) from PHP itself and get its process ID within the same script?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
最终对我有用的是使用 pgrep 来获取在 PHP 中调用 exec() 后执行的命令(或进程名称)的 PID。
这也适用于启动后台进程。但是,您必须记住将程序的输出通过管道传输到
/dev/null
,否则 PHP 将挂起。另外,在调用 pgrep 时,不能包含命令的管道部分:请注意,如果系统使用同一个命令启动了多个进程,它将返回与该命令匹配的所有进程的 PID。给
pgrep
的命令。如果只传入进程名称,它将返回具有该进程名称的所有 PID。What ended up working for me is using
pgrep
to get the PID of the command (or process name) executed after callingexec()
in PHP.This will work for launching background processes too. However, you must remember to pipe the program's output to
/dev/null
or else PHP will hang. Also, when callingpgrep
you can't include the pipe portion of the command:Note that if the system has multiple processes launched with the same exact command, it will return the PIDs of all processes which match the command given to
pgrep
. If you only pass in a process name, it will return all PIDs with that process name.如果您想严格使用 PHP 提供的工具来执行此操作,而不是 Unix 特定的魔法,您可以使用 < a href="http://php.net/manual/en/function.proc-open.php" rel="noreferrer">
proc_open
和proc_get_status
,尽管需要将描述符规范传递到proc_open
使用起来非常冗长:If you want to do this strictly using tools PHP gives you, rather than Unix-specific wizardry, you can do so with
proc_open
andproc_get_status
, although the need to pass a descriptor spec intoproc_open
makes it unpleasantly verbose to use:对于跨平台解决方案,请查看 symfony/process。
使用 Composer 安装
symfony/process
后(composer require symfony/process
),您可能需要使用composer dump-autoload
更新自动加载信息并然后使用require __DIR__ 要求自动加载。 '/vendor/autoload.php';
。另请注意,您只能获取正在运行的进程的 PID。有关 API 详细信息,请参阅文档。
For a cross-platform solution, check out symfony/process.
After you install
symfony/process
with composer (composer require symfony/process
), you may need to update autoloading info withcomposer dump-autoload
and then require the autoload withrequire __DIR__ . '/vendor/autoload.php';
.Notice also that you can get PID of a running process only. Refer to the documentation for API details.