dongyingdao8867 2016-08-17 15:16
浏览 91
已采纳

为什么proc_open()多次运行相同的命令?

I'm facing problems on a new server to run commands with proc_open(). I created the following script for test:

$desc = array(
    0 => array('pipe', 'r'), // we use to write data
    1 => array('pipe', 'w'), // we use to read data
    2 => array('pipe', 'w') // errors' log
);

$cmd = "exec php -v";
$process = proc_open($cmd, $desc, $pipes);

if (is_resource($process)) {
    stream_set_blocking($pipes[1], 0);
    stream_set_blocking($pipes[2], 0);
    $cmd .= "
META: " . print_r(stream_get_meta_data($pipes[1]), true);

    if (is_resource($pipes[1])) {
        $cmd .= "
STDOUT: " . stream_get_contents($pipes[1]);
    }

    if (is_resource($pipes[2])) {
        $cmd .= "
STDERR: " . stream_get_contents($pipes[2]);
    }

    $status = proc_get_status($process);
    $cmd .= "
" . print_r($status, true);
    proc_close($process);
} else {
    $cmd .= "
Failed!";
}

echo "<pre>{$cmd}</pre>";

The script simply hangs and never shows the output. Getting a look into the console, I see that the script is spawning the same command multiple times. See:

root[~]# clear && ps ax o pid,args | grep [p]hp
10122 /usr/bin/php /home/user/public_html/thread.php
10124 php -v
10126 php -v
10128 php -v
10130 php -v
10132 php -v
10134 php -v
10136 php -v
10138 php -v
10140 php -v
10142 php -v
10144 php -v
10146 php -v
10148 php -v
10150 php -v
10152 php -v
10154 php -v
10156 php -v
10158 php -v
10160 php -v
10162 php -v
10164 php -v
10166 php -v
10168 php -v
10170 php -v
10172 php -v
10174 php -v
10176 php -v
10178 php -v
10181 php -v
10184 php -v
10187 php -v
10189 php -v
10191 php -v
10193 php -v
10195 php -v
10197 php -v
10199 php -v
10201 php -v
10205 php -v
10207 php -v
10210 php -v
10212 php -v
10214 php -v
10216 php -v
10219 php -v
10222 php -v
10224 php -v
10226 php -v
10229 php -v
10231 php -v
10233 php -v
10235 php -v
10237 php -v
10239 php -v
10242 php -v
10245 php -v
10248 php -v
10250 php -v
10252 php -v
10254 php -v
10256 php -v
10258 php -v
10260 php -v
10262 php -v
10264 php -v
10266 php -v
10268 php -v
10270 php -v
10272 php -v
10274 php -v
10276 php -v
10279 php -v
10282 php -v
10284 php -v
10287 php -v
10289 php -v
10291 php -v
10293 php -v
10295 php -v
10297 php -v
10299 php -v
10301 php -v
10303 php -v
10305 php -v
10307 php -v
10309 php -v
10311 php -v
10313 php -v
10315 php -v
10317 php -v
10319 php -v
10321 php -v
10323 php -v
10325 php -v
10327 php -v
10329 php -v

However, the same script works on my local machine (Win10). I already googled about this issue but didn't find it anywhere else.

Is something related to the server environment, or PHP installation?

  • 写回答

1条回答 默认 最新

  • dongshang1529 2016-09-13 19:13
    关注

    I don't know why, but changing the PHP handler from suphp to cgi on Apache solved the problem. Now the script behaves as expected.

    If someone can explain why, will be welcome.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。