编辑:据我所知,我的问题是因为PHP存在缺陷.我在这里将这个问题复制到PHP bug跟踪器:https://bugs.php.net/bug.php?id = 74143并计划尝试实现修复.
putenv函数设置环境变量的值.根据手册,putenv在成功时返回true,在失败时返回false.
但是,我发现putenv函数有时会返回true而不更新当前会话的环境变量.
要重现此问题,请使用PHP FPM在Web服务器中使用fastcgi_param指令设置环境变量.这非常有用,因为它允许将环境变量隔离设置到同一服务器上的其他主机.
示例nginx.conf:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param TESTVAR_ENV old-value;
include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)
示例test.php:
var_dump(getenv("TESTVAR_ENV"));
var_dump(putenv("TESTVAR_ENV=new-value"));
var_dump(getenv("TESTVAR_ENV"));
Run Code Online (Sandbox Code Playgroud)
test.php的输出:
string(12) "old-value"
bool(true)
string(12) "old-value"
Run Code Online (Sandbox Code Playgroud)
如你看到的:
我误解了putenv函数的用途是什么?setenv手册页上是否有一些缺少的文档?如何使用putenv()更新现有环境变量?
我有一个我无法发布的复杂软件,也没有具体的工作示例.我会尝试解释这个问题,也许有人曾经遇到过这个问题.
在Linux shell上我定义了一个环境变量:
> export MY_TEST_ENV=4711
> echo $MY_TEST_ENV
> 4711
Run Code Online (Sandbox Code Playgroud)
在复杂的代码中我想用这个变量获取
print os.getenv('MY_TEST_ENV')
Run Code Online (Sandbox Code Playgroud)
总是回来None
.如果我创建一个测试脚本来测试这种行为,即使是不同文件中的类,我总是得到所需的行为,例如,os.getenv('MY_TEST_ENV')
返回正确的值4711
.
代码以sudo
.开头.
任何想法可能是什么原因?
我正在尝试编写在UNIX环境中使用一些ENV变量的C代码.问题是:读取变量(例如getenv())会导致缓冲区溢出吗?此外,如何找到我的平台的env变量大小的限制?例如哪个头文件?
最后,阅读环境提供的变量中最安全的代码实践是什么?
我正试图改变LD_LIBRARY_PATH
我的C++程序.我能够使用它来获取它的值getenv("LD_LIBRARY_PATH")
并使用它设置它的值setenv()
(我知道这是有效的,因为当我getenv("LD_LIBRARY_PATH")
再次调用时,我得到更新的值),但是从程序内部改变它的值没有任何影响对它:我仍然收到此错误消息:
Failed to Load the shared library file
如果我在加载可执行文件或启动应用程序之前设置了值,它就可以正常工作.
当我使用以下图像时:node:6.11.0-alpine运行我的服务(使用GRPC),然后继续收到以下警告:
D0622 06:52:01.170502843 1 env_linux.c:66] Warning: insecure environment read function 'getenv' used
D0622 06:52:01.554446816 12 env_linux.c:66] Warning: insecure environment read function 'getenv' used
D0622 06:52:01.559295167 14 env_linux.c:66] Warning: insecure environment read function 'getenv' used
D0622 06:52:01.566036292 13 env_linux.c:66] Warning: insecure environment read function 'getenv' used
D0622 06:52:01.569975088 15 env_linux.c:66] Warning: insecure environment read function 'getenv' used
Run Code Online (Sandbox Code Playgroud)
我会错过任何包裹吗?如何解决这个问题?
可以参考此问题#8104。
我有一个Apache/2.2.15(Win32)与PHP/5.3.2设置,处理身份验证.
<Directory /usr/www/myhost/private>
# core authentication and mod_auth_basic configuration
# for mod_authn_dbd
AuthType Basic
AuthName "My Server"
AuthBasicProvider dbd
# core authorization configuration
Require valid-user
# mod_authn_dbd SQL query to authenticate a user
AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s"
</Directory>
Run Code Online (Sandbox Code Playgroud)
身份验证工作正常!没问题.
但是对于文档,从AuthDBDUserPWQuery返回的任何额外字段将被放入环境中的AUTHENTICATION_fieldname变量中.
有了phpinfo()
,我可以在"Apache Environment"下看到这些变量和正确的值.
AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS
我无法从我的PHP中获取这些环境变量.
1 <?php
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3 var_dump($Access);
4 ?>
Run Code Online (Sandbox Code Playgroud)
第3行打印bool(false),表示找不到变量!
但是,如果我更改为另一个Apache环境变量,例如'HTTP_HOST',它可以工作.
..是的,我也尝试过getenv()
,同样的结果.
还有一个注意事项,Apache服务器需要使用APR 1.3.0进行编译才能工作.我使用了来自httpd.apache.org的Apache msi构建,它似乎是用APR编译的,高于版本2.因为我可以看到它们,phpinfo()
所以它们必须可以从PHP访问.
我正在尝试运行下面的简单代码片段
port = int(os.getenv('PORT'))
print("Starting app on port %d" % port)
Run Code Online (Sandbox Code Playgroud)
我可以理解 PORT 是 s 字符串,但我需要转换为 int。为什么我收到错误
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
Run Code Online (Sandbox Code Playgroud) 我应该释放为char数组分配的内存,该char * getenv( char * )
函数返回指针吗?哪种方式 - C free()
或C + delete []
?如果没有 - 为什么?
我的意思是:
char * ptr = getenv( "LS_COLORS" );
cout << ptr << endl;
delete [] ptr; //Is this or free() call needed?
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试编写一个 bash 脚本运行的程序。我希望 bash 脚本能够更改 C++ 程序的状态,而我唯一能找到的就是使用环境变量。问题是,似乎 getenv 仅在程序运行时获取值。
重击
export BLINK=1
./blink &
sleep 5s
unset BLINK
Run Code Online (Sandbox Code Playgroud)
C++
int main(int args, char **argv) {
char *blink = getenv("BLINK");
while(blink && blink[0] == '1')
{
std::cout << getenv("BLINK") << std::endl;
usleep(500000);
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
所以它的作用是运行眨眼程序,等待 5 秒钟,然后取消环境设置。然而,C++ 程序始终将环境值视为 1 并且永远不会停止。程序运行时如何获取更新的环境变量?或者有没有更好的方法让 bash 脚本控制 C++ 程序的状态。
编辑我应该注意,我也不想只是终止该进程,因为它必须在结束时关闭硬件。
我的 C++ apache/cgi 中的 getenv() 给了我奇怪的东西,然后我检查了 /proc/${PID_OF_THE_RUNNING_PROCESS} 内的环境,它们不匹配,我认为它们应该匹配,我想知道 /proc 或它出了什么问题是 getenv() 吗?
shell@kernel # xargs --null --max-args=1 echo < /proc/${PID_OF_THE_RUNNING_PROCESS}/environ
PATH=/usr/bin:/bin:/usr/sbin:/sbin
LD_LIBRARY_PATH=/usr/local/httpd-2.2.19/lib:
Run Code Online (Sandbox Code Playgroud)
PID_OF_THE_RUNNING_PROCESS 的代码
#include<stdio.h>
extern char **environ;
void run()
{
char* s = *environ;
printf("declare -x all env begin\n");
for (int i = 1; NULL != s; ++i) {
printf("declare -x %s\n", s);
s = *(environ+i);
}
printf("declare -x all env end\n");
}
Run Code Online (Sandbox Code Playgroud)
PID_OF_THE_RUNNING_PROCESS 的控制台日志
declare -x all env begin
declare -x FCGI_ROLE=RESPONDER
declare -x UNIQUE_ID=Wvq-Cn8AAAEAAAkmJlsAAAmM
declare -x HTTP_HOST=www.example.com …
Run Code Online (Sandbox Code Playgroud)