Процесс не получает канал от proc_open. lessc - язык динамических стилей - PullRequest
0 голосов
/ 24 февраля 2012

Вот источник программного обеспечения Lessc, я думаю, что это будет полезно:

https://github.com/cloudhead/less.js/blob/master/bin/lessc

ПРОБЛЕМА

Я использую lessc в оболочке просто:

lessc file.less

и я получаю вывод файла css.

Я попытался сделать это с помощью php с proc_open.Но когда я передаю входной файл в proc, lessc не получает его.У меня ошибка (из канала 1):

"lessc: no input files"

, что эквивалентно в оболочке (параметр не передан):

lessc
lessc ''

Мой код:

$descriptorspec = array(
    0 => array("file", 'path/to/file/foo.less', "r"), 
    1 => array("pipe", "w"), 
    2 => array("file", '/tmp/lessCompiler-errors', "a")
);

$process = proc_open('lessc', $descriptorspec, $pipes);

if (is_resource($process)) {
    $contents = stream_get_contents($pipes[1]);
    fclose($pipes[1]);    
    proc_close($process);
}

кстати.Я стараюсь избегать использования функции exec ().

Я буду благодарен за любую помощь.Marcin

1 Ответ

1 голос
/ 11 марта 2014

Я столкнулся с той же проблемой сегодня, но не уверен, что решение было верным, когда вы опубликовали вопрос, но теперь вы можете передать '-' как источник ввода в lessc, чтобы он читал из stdin.Так что вам нужно изменить только одну строку:

$process = proc_open('lessc -', $descriptorspec, $pipes);

Поскольку мне потребовалось некоторое время, чтобы выяснить все детали, вот мой фрагмент кода:

/* run lessc */
$descriptors = array(
    0 => array( 'pipe', 'r' ),
    1 => array( 'pipe', 'w' ),
    2 => array( 'pipe', 'w' ));
$process = proc_open( 'lessc --no-color -x -', $descriptors, $pipes,
    '/web/less', array( 'PATH' => '/usr/local/bin/' ) );

if( !is_resource( $process ) ) {
    $this->errorMessage( 'Unable to start lessc' );
    exit();
}

/* write generated content */
fwrite( $pipes[0], 'some dynamically generated less code' );
fclose( $pipes[0] );

/* read compiled css */
$css = stream_get_contents( $pipes[1] );
fclose( $pipes[1] );

/* check for errors */
if( $stderr = stream_get_contents( $pipes[2] ) ) {
    $this->errorMessage( "lessc error: {$stderr}" );
    exit();
}
fclose( $pipes[2] );

proc_close( $process );

/* write back */
$this->write( $css );
  • У меня былоустановить PATH в debian wheezy, поскольку lessc продолжал жаловаться: /usr/bin/env: node: No such file or directory, см. https://github.com/joyent/node/issues/3911
  • --no-color подавляет управляющие коды в сообщениях об ошибках
  • -x сжимает css
...