- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当 php
用作 apache
模块,来自 apache 的环境变量 SetEnv
指令可用于 php 的 getenv()
, 但它似乎不适用于 C
通过 stdlib 的 getenv()
扩展.至少它发生在 pgsql
上模块。
如果用php代码重新实例化变量:
putenv("varname=".getenv("varname"));
然后它就可以用于扩展的代码。
问题:为什么需要重新实例化?核心 php 环境与“标准”(stdlib
)环境有何不同?
这发生在:PHP Version 5.3.10-1ubuntu3.17
在 Ubuntu 12.04 中,作为 apache 模块。从命令行运行时,不需要上述解决方法。来自另一个问题:Using .pgpass from Apache libphp5.so看来这个解决方法对于 FreeBSD 下的 php-5.4 也是必需的,所以它不仅仅是 Ubuntu 或 php-5.3。
它不依赖于variables_order
有E
在里面。我都试过了 EGPCS
和 GPCS
, 和 $_ENV
E
时未填充正如预期的那样不存在,但这不会改变 getenv()
的结果, 作为 documented ,或者显然是 stdlib 的 getenv()
的结果来自内部扩展。
问题演示 pgsql
模块。它建立在 libpq
之上用 C
编写的共享库,它调用 getenv()
在少数可选 PG*
环境变量。
在apache配置文件中,在一个<VirtualHost>
下,我将其设置为使连接尝试失败:
SetEnv PGHOST doesnotexist
并且没有在 pg_connect
中指定主机打电话,所以PGHOST
在场时必须带走。
第一次尝试:
$v=getenv("PGHOST");
echo "PGHOST=$v\n";
$cnx=pg_connect("user=daniel");
if ($cnx) {
echo "Connection is successful.";
}
结果:
PGHOST=doesnotexistConnection is successful.
So PGHOST
is getting ignored, despite being in the environment.
Second try, now putting again PGHOST
into the environment even though it's already there:
$v=getenv("PGHOST");
echo "PGHOST=$v\n";
putenv("PGHOST=".getenv("PGHOST"));
$cnx=pg_connect("user=daniel");
if ($cnx) {
echo "Connection is successful.";
}
结果(未能连接到指定主机,如预期):
PGHOST=doesnotexistWarning: pg_connect(): Unable to connect to PostgreSQL server:could not translate host name "doesnotexist" to address:Name or service not known in /var/www/test/pgtest2.php on line 8
最佳答案
原因是这样的:
您从 getenv()[PHP]
(php 函数)获得的环境值与您使用 getenv()[C]
(the C库函数)。 getenv()[PHP]
所做的是检查已注册的 sapi 是否匹配( http://lxr.php.net/xref/PHP_5_6/ext/standard/basic_functions.c#3999 )。
apache2 sapi 通过自己的环境上下文 (http://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253) 执行此操作,而不是来自 apache 进程本身的标准操作系统环境。
只有当没有找到匹配时,它才会检查实际进程的环境。所以这就是为什么 getenv()[PHP]
返回一个值,而 getenv()[C]
没有。
现在,“hack”也很简单:putenv()[PHP]
,将给定的键/值存储在运行进程的环境中,这就是为什么它可以稍后由 getenv()[c]
找到。
关于php - 为什么已经定义的环境变量需要 putenv()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29700814/
在我的 apache 实例上,它设置了一个环境变量 APP_ENV=development。我正在尝试在我的 PHP 端动态更改此设置(在启动测试套件的实例中),如下所示: putenv('APP_E
我正在尝试使用 GCC 4.7.1 (MinGW) 在 Windows 上编译 Qt 4.8.4。我编辑了 mkspec 以包含 C++11 特性(添加了 -std=c++11 标志)来编译 Java
当 php用作 apache模块,来自 apache 的环境变量 SetEnv指令可用于 php 的 getenv() , 但它似乎不适用于 C通过 stdlib 的 getenv() 扩展.至少它发
我在这里阅读了几篇文章,但仍然对 setenv() 的方式感到困惑作品: linux-where-are-environment-variables-stored where-is-the-envir
编辑:据我所知,我的问题是由于 PHP 的缺陷造成的。我已将此问题复制到 PHP 错误跟踪器:https://bugs.php.net/bug.php?id=74143并计划尝试实现修复。 puten
函数 putenv 不是线程安全函数,所以我想如果我在调用 putenv 之前调用 pthread_mutex_lock,我可以让 putenv 这样“线程安全”? 我试过了,但是当我运行它的时候,出
我需要用户在文本文件中定义我的程序所需的所有环境变量,如下所示。 MyDLLPath = C:\MyDLLPath 我的选项 = 选项 1 PATH = %MyDLLPath%;%PATH%; 在我的
我正在为系统编程类(class)开发自定义 shell。我们被指示实现内置的 setenv() 和 unsetenv() 命令,并提示检查 putenv()。 我的问题是 setenv(char*,
POSIX 系统调用 putenv 声明分配的内存字符串在调用 putenv 后不能被调用者释放。因此,您不能使用自动变量调用 putenv。 例子: #include #include #inc
putenv函数接受一个参数,一个字符串。此字符串应采用以下格式:KEY=VALUE . 引用:http://php.net/manual/en/function.putenv.php 将以下代码作为
我提前为一些代码转储道歉,我已经尽可能多地修剪了不重要的代码: // Global vars / mutex stuff extern char **environ; pthread_mutex_t
我正在学习 Laravel。我使用 WinNMP 安装了 php 7、mysql 和 nginx。我安装了composer,并通过它安装了laravel cli(Laravel\Installer)。
我需要从用户那里获取输入并处理变量。我需要具备以下功能: set varname = somevalue:将名为varname的环境变量的值设置为somevalue指定的值。 delete varna
在 php 中,运行: echo shell_exec("export http_proxy=http://myproxy.com:8080 2>&1"); echo shell_exec("env
尝试运行以下在 VS2012 中编译的代码时,我似乎遇到了内存损坏。 它在 VS2010 和以前的版本中工作正常: char *var1 = getenv("var1"); // Value for
我正在尝试在使用 g++ 编译的程序中使用 putenv stdlib 函数,包括标志和警告 - std=c++11 和 -Wall -Wextra。 程序可以像下面这样简单: #include #i
我尝试在 Ubuntu 13.04(64 位)上使用 gcc 4.7.3 和 clang 3.2.1 编译以下代码: #include #include #include int main()
我一直在思考环境变量,并有一些问题/意见。 putenv(char *string); 这个调用似乎有致命的缺陷。因为它不复制传递的字符串,所以你不能用本地调用它,并且不能保证堆分配的字符串不会被覆盖
我试图通过在此之前连接 str1 和 str2 在 UNIX 上使用 putenv() 。 我想在环境中添加一个变量或修改一个变量,所以我调用 putenv() (或者我可以调用 setenv() 相
pytest 的 monkeypatch模块提供了一个setenv 函数,它将设置环境变量名称为值。 为什么monkeypatch 提供这个?听起来和os.putenv一样?它提供了 prepend
我是一名优秀的程序员,十分优秀!