这是lessc软件的一个来源,我认为它会有帮助:

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

问题
我在shell中使用lessc只是:
lessc file.less

我得到一个css文件输出。
我试着用打开proc_的php来实现。但当我将输入文件管道化到proc时,lessc无法获取它。我有一个错误(来自管道1):
"lessc: no input files"

在shell中等价于(参数未传递):
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()函数。
我会很乐意帮助你的。
马尔金

最佳答案

今天我遇到了同样的问题,当你发布问题时,我不确定这个解决方案是否有效,但是现在你可以将“-”作为输入源传递给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 );

我不得不给debian的喘息设置PATH,因为lessc一直在抱怨:/usr/bin/env: node: No such file or directory,请看https://github.com/joyent/node/issues/3911
--no-color抑制错误消息中的转义代码
-x压缩css

10-04 19:47