在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) views6445 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • 3D感知和建模关键硬件技术:双目、3D结构光和TOF

    无论VR、AR和3D打印,其核心技术包含3D成像和建模。而3D建模属于劳动密集型的工作,耗时耗力,凡这类工作都会是被新技术革命的地方,自动3D建模技术就是为了解决...

  • html5跨平台实战-第一周-水平测验-新闻列表页面

    这是一个DIV+CSS布局页面的一个实例,主要介绍POSITION定位、导航UL LI的制作、利用浮动原理对页面分栏、分列的页面布局。新闻页面的效果图

  • CentOS6 Apache2.2用域名配置多虚拟机

    在CentOS下使用域名配置多虚拟机的步骤如下:
    1. 使用

  • WebGL、Asm.js和WebAssembly概念简介

    随着HTML技术的发展,网页要解决的问题已经远不止是简单的文本信息,而包括了更多的高性能图像处理和3D渲染方面。这正是要引入WebGL、Asm.js和WebAssembly这些技...

  • CSS3属性选择器特性使用详解

    CSS3除了引入动画、滤镜(用于特效)以及新的布局技术外,在选择器(selector)方面也有增强。属性选择器根据元素的属性(attributes)来匹配。这可以是一个单独...

  • WebGL Roadmap

    Unity 5.0 shipped with a working preview of our WebGL technology in March this year. Since then, Google has disabled (by default) NPAPI support in the...

  • 通过实例深入理解HTML5/CSS3/SVG/WebGL的技术本质

    常常听到人们对于HTML5的讨论,看了页面头部这个那个就是HTML5,误认为HTML5只是新增些标签“而已”,学完了

  • 学习使用CSS制作进度条

    进度条是基础的界面控件,可用于多种场合,比如任务完成进度,手机充电状态等。本文介绍一个简单实用的进度条制作方法。预期效果如下图所示:直观上,我们可以把该进度条控件分为2个部分,外部的边界用来表示固定的目标范围,里面的条形部分用来表示当前进度。外部目标范围元素的CSS代码编写如下:.pb-scope

  • 深入理解Three.js(WebGL)贴图(纹理映射)和UV映射

    本文将详细描述如何使用Three.js给3D对象添加贴图(Texture Map,也译作纹理映射,“贴图”的翻译要更直观,而“纹理映射”更准确。)。为了能够查看在线演示效...

  • WebGL 纹理映射模式以及WRAP_S | WRAP_T参数详解

    我们在纹理滤镜一文中已经说明了2个重要的纹理参数,用来定义对象缩放时纹理的处理方式:GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER本文讲解其余几个纹理参数...

  • CSS3图片混合(Blend)效果及其参考计算公式一览表

    在Photoshop软件中,混合是将两个图层的色彩值进行合成,从而创造出大量的效果。在这些效果的背后实际是一些简单的数学公式在起作用。下面所介绍的公式仅适用于R...

  • 如何使用CSS3实现一个平滑的3D文本标题

    要实现3D文本,基本上有3种方法:1. 使用CSS3的投影滤镜(filter: drop-shadow)2. 使用3d建模和CSS3 3d变换来实现(最真实)3. 使用CSS3 text-shadow属性来实现...

  • 如何使用纯CSS3实现一个3D泡沫

    要实现一个逼真的泡沫,涉及到比较复杂的光学/物理学知识。我们这里先简化下问题,实现一个相对简单而足够实用的泡沫元素。我们可以把基础的泡沫元素应用在很多场景中,比如水景、泡咖啡、啤酒甚至火焰特效中。泡沫首先是一个圆形元素.bubble

  • 如何使用CSS3/SCSS实现逼真的车窗雨滴效果

    在天气预报类的Web移动应用中,常常需要实现屏幕的雨滴效果,表示阴雨天气。感觉上比较神奇,其实想通了,这个效果的实现只需要一点物理知识和CSS3的简单变换。实现一个小雨滴首先雨滴是一个个小的椭圆形元素:.raindrop

  • 更多...