gpt4 book ai didi

php - 如何获取作为管道中第一个命令运行的 PHP 脚本的 PID?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:50 25 4
gpt4 key购买 nike

我有一个这样的命令:

php myscript.php |
curl -X POST --data-binary @- "http://localhost/webservice.php/$$/output/"

我使用 |myscript.php 的输出发送到 curl 命令。我使用 $$ 获取 PID,但这会返回 curl 命令的 PID,而不是 php 命令。

事实上,我将使用此命令行来完成我所有的 crontab 作业。我不想收到成千上万封邮件,而是想将所有信息发送到我的网络服务。

所以在 myscript.php 中,我调用(1 是 cronjob ID):

file_get_contents('http://localhost/webservice.php/1/' . getmypid() . '/start/');
...
file_get_contents('http://localhost/webservice.php/1/' . getmypid() . '/end/');

我尝试将 myscript.php 的输出发送到我正在创建的网络服务。

所以我向我的网络服务发送开始/结束命令。只有一件事我想念:如果有警告或一些“echo ”,PHP 的输出。

目标是使用 PHP 命令的 PID(我用它来识别我的 web 服务中的进程)将脚本(也可以是 bash 脚本)的输出重定向到 web 服务。

如何获取 PHP 命令的 PID?我尝试了在 Stackoverflow 中发现的 $$,但正如您回答的那样,它似乎是当前的 shell PID...

提前致谢!

最佳答案

长话短说

$$ 变量是一个特殊的变量。它返回调用 shell 的 PID,它可能与存储在 $BASHPID 中的当前 shell 的 PID 不同。这两个变量都与管道中进程的 PID 没有任何关系。 Bash manual说:

($$) Expands to the process ID of the shell. In a () subshell, it expands to the process ID of the invoking shell, not the subshell.

您需要重构 PHP 脚本和管道来做一些不同的事情。

正确创建唯一目录

您还没有解释您的 PHP 脚本实际上在做什么,所以这看起来像是一个 X/Y 问题。通常,您应该使用 mktemp 或其 PHP 等效项:

创建临时或唯一的文件名。由于您似乎想使用唯一目录,因此我将其作为下面的示例。但是,拥有一个包含保证唯一的文件名的目录可能会更清晰。您的里程可能会有所不同。

与其尝试使用 PID,不如使用 mktemp 实用程序来创建没有竞争条件的唯一目录或文件名。如果您在 Bash 中执行此操作,则可以将变量导出到环境中,然后在 PHP 脚本中使用相同的目录。例如:

#!/usr/bin/env bash

# Create a unique temp directory safely.
export DIR=$(mktemp -d)

# Create your output directory for whatever reason.
mkdir "$DIR/output"

# Ensure PHP uses $_ENV["DIR"] to do whatever it's doing.
php myscript.php | curl -X POST --data-binary @- "file://$DIR/output/"

# Clean up the temp directory at some point.
echo "I did something with '$DIR' so clean it up later." > /dev/stderr

只使用带前缀的唯一文件

除了使用目录,您还可以考虑使用具有定义前缀的唯一文件名。例如:

# Create files like "/tmp/myscript.D6147vts"
export TEMPFILE=$(mktemp -t myscript)

然后,像以前一样,在您的 PHP 脚本中使用 $_ENV["TEMPFILE"]。这种方法的好处是你的文件名保证是唯一的,但它们都在一个地方并且有一个共同的前缀。这可以使清理或以后更容易找到正确的文件。

如果您确实需要唯一的目录,请使用它们。但是,如果您真的不需要目录结构,请不要为自己做额外的工作:只需使用唯一的文件名即可。

关于php - 如何获取作为管道中第一个命令运行的 PHP 脚本的 PID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com