最近通过proc_open创建子进程,为了区分进程,特别在创建进程时添加了进程环境变量来标识,但是发现子进程无法正常请求网络。
模拟进行复现
a.php主进程:
<?php
$cmd = "C:/phpEnv/php/php-7.0/php.exe D:/wwwroot/learn/b.php";
$desc = [];
$env = [
'process_name' => 1
];
proc_open($cmd, $desc, $pipes, null, $env, [
'bypass_shell ' => true
]);
sleep(100);
b.php子进程
<?php
while (true)
{
$res = file_get_contents('https://www.gaojiufeng.cn/?id=1756');
var_dump($res);
}
输出:Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: ֪ in D:\wwwroot\learn\b.php on line 5
经过排查是由于请求网络时依赖于进程中的环境变量,而我传递参数时没有保留原进程的环境变量。正确的方法是取得当前主进程的环境变量$_ENV进行追加传递到子进程,同时修改php.ini的variables_order 配置项,否则无法获取。只是记录下问题,事实上因为要靠php.ini修改配置,最终未采用。