当前位置:首页 > PHP > 正文内容

php proc_open子进程无法请求网络

高老师4年前 (2021-02-04)PHP1152

最近通过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://blog.20230611.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修改配置,最终未采用。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/195.html

分享给朋友:

“php proc_open子进程无法请求网络” 的相关文章

php异步执行,php后台运行,如何在windows下让php后台运行

php异步执行,php后台运行,如何在windows下让php后台运行

如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php  D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...

PHP异常处理,PHP自定义错误,PHP记录错误日志

PHP异常处理,PHP自定义错误,PHP记录错误日志

面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...

PHP yield  PHP协程,PHP协程用法学习

PHP yield PHP协程,PHP协程用法学习

【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1.  <?php   2.  $data = ['1', '2', &...

posix_ttyname函数详解

posix_ttyname函数详解

posix_ttyname - 获取当前终端设备名称。<?php     var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...

composer自动加载类库(非psr4规范的文件)

composer自动加载类库(非psr4规范的文件)

在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": {      &...

 php命令行中文乱码,php cli中文乱码

php命令行中文乱码,php cli中文乱码

<?php //如果支持exec函数,可以使用的方式 exec('chcp 65001'); //如果exec函数因安全问题禁用,可以使用的方式 pclose(popen('chcp 65001', 'r'));...