在PHP网页程序中执行Sass/Compass命令

techbrood 发表于 2016-04-19 14:19:21

标签: sass, scss, compass, php, exec

- +

我们需要在wow云开发平台支持sass/compass等预编译样式语言,为此我们首先尝试了scssphp扩展,但是在支持最新语法上,经常会出现异常。所以我们采用了代理的方式,

在CentOS服务器上安装了sass-lang和compass框架(前提是安装了ruby开发环境)。

然后在php中通过系统命令执行接口(exec/system)把编译工作转交给sass/compass。

在此过程中,主要遇到如下几个问题,一一记录:

1. gem install sass时报域名解析错误,原因是rubygems.org的源国内访问受限,切换到taobao的镜像即可。

2. exec命令行执行sass/compass编译没有问题,但是在网页中执行无输出无结果。

把exec换成如下定制命令:

function my_exec($cmd, $input='') {
  $proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes);
  fwrite($pipes[0], $input);fclose($pipes[0]);
  $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
  $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
  $rtn=proc_close($proc);
  return array('stdout'=>$stdout,
                       'stderr'=>$stderr,
                       'return'=>$rtn
  );
}
可得到管道输出,提示tempfile.rb找不到cache文件,
原因是通过web用户执行时,sys_get_temp_dir()的路径被设置成了当前web文件执行路径。
解决方法是修改compass cache location(在config.rb文件中): cache_path = '.tmp/.sass-cache'
而给sass添加--cache-location [path]参数。
如果system函数第二个参数返回结果为127,表示执行路径有问题,可设置PATH环境变量:
putenv("PATH=/usr/local/bin");
3. 命令执行权限问题,可以通过phpseclib扩展来登录root账号:
set_include_path(__DIR__ .'/../../vendor/phpseclib');
require('Net/SSH2.php');
$ssh = new Net_SSH2('techbrood.com',$port);
if (!$ssh->login('root', $pass)) {
    exit('Login Failed');
}
4.编译时出现Invalid Character错误,原因是代码中包含非ASCII码字符,需要在文件开头引入编码声明:
@charset "UTF-8";
function my_exec($cmd, $input='') {
  $proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes);
  fwrite($pipes[0], $input);fclose($pipes[0]);
  $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
  $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
  $rtn=proc_close($proc);
  return array('stdout'=>$stdout,
                       'stderr'=>$stderr,
                       'return'=>$rtn
  );

}

 

possitive(9) views6398 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章