PHP popen и proc_open не возвращают двоичный вывод - PullRequest
2 голосов
/ 05 февраля 2010

При использовании popen или proc_open для запуска следующей команды для просмотра содержимого общего ресурса Windows:

smbclient -N  -U 'username%password' -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192'  -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192' -d 0 '//server/sharename' -c 'dir "dirpath\*"' 2>/dev/null

Если файл в общем ресурсе имеет символ § (десятичный ASCII 21) при обнаружении специального символа, он пропускает данные до следующей строки.

        $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
        1 => array("pipe", "wb"),  // stdout is a pipe that the child will write to
        2 => array("pipe", "w") // stderr is a file to write to
    );

    $process = proc_open("smbclient -N  -U 'username%password' -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192'  -O 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192' -d 0 '//server/sharename' -c 'dir \"dirpath\*\"' 2>/dev/null", $descriptorspec, $pipes, null, null, array('binary_pipes'=>true));
    if(!is_resource($process)) {
        return false;
    }

    echo 'START[['.fread($pipes[1], 10096).']]END';
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close ($process); 

Ожидаемый результат:

  .                                   D        0  Fri Feb  5 15:31:11 2010
  ..                                  D        0  Fri Feb  5 15:31:11 2010
  Test File § hello.doc              A   233472  Wed Feb  3 15:16:26 2010
  test.xls                                 11776  Tue Feb 24 11:14:28 2009

Реальный выход:

  .                                   D        0  Fri Feb  5 15:31:11 2010
  ..                                  D        0  Fri Feb  5 15:31:11 2010
  Test File   test.xls                                 11776  Tue Feb 24 11:14:28 2009

1 Ответ

2 голосов
/ 12 февраля 2010

Переменная среды LANG для оболочки не была установлена ​​в Unicode.

PutEnv ( 'LANG = en_GB.UTF-8');

или

setlocale (LC_CTYPE, "UTF8", "en_GB.UTF-8");

...