在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(0) negative(0) views3605 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • ARCore基本概念和工作原理简介

    谷歌的WebAROnARCore项目基于Android手机提供的ARCore增强现实引擎,要了解WebAROnARCore,需要先了解ARCore的工作原理。基本上ARCore做了两件事,首先跟踪手机...

  • Monaco Editor 编辑器拷贝粘贴功能调用和获取选中文本

    有时候需要在monaco editor外部调用编辑器的内置功能比如希望在页面主工具栏实现一些快捷操作。button

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

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

  • 如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域。
    本文说明和演示如何使用babylon.js来加载一个标准3d模型文...

  • A-Frame WebVR(网页虚拟现实)快速开发入门教程

    WebVR和WebGL应用程序接口使得我们已经可以在浏览器上创建虚拟现实(VR)体验,但从工程化的角度而言,开发社区还需要更多方便强大的开发库来简化编程,Mozilla的

  • Blender2.7给平面模型添加纹理贴图

    在blender中给模型添加纹理,需要有2个步骤:首先在对象属性栏中给该对象添加材料和纹理建立纹理映射添加材料和纹理这是常见操作,略过步骤。但是仅仅这样操作,...

  • CSS3人行走动作图解和动画实现

    对于人类而言,行走是一种很自然的想要前进并防止跌倒的一组动作重复。大部分人1岁就学会了走路,但至此以后的几十年间,或许我们从来没留意过自己行走姿势。当...

  • HTTP/2背景和新特性简介

    在前面的一篇文章中已经介绍了

  • 计算WebGL中的uniforms变量使用数

    在使用Three.js为人体模型加载皮肤材料时,启用了skinning:true的参数。有时候会导致GL编译错误,提示“too many uniforms”。下面的文章有助于理解错误原因和检...

  • WebGL入门教程6 - 光照效果和Phong光照模型

    正是因为有了光,世界才能被我们看见,在3D的世界里,光照给物体带来真实的视觉感受。当光照射在某一表面上时,它可能被吸收、反射或投射。其中入射到表面上的一...

  • 使用纯CSS3实现一个3D旋转的书本

    有一些前沿的电商网站已经开始使用3D模型来展示商品并支持在线定制,而其中图书的展示是最为简单的一种,无需复杂的建模过程,使用图片和CSS3的一些变换即可实现...

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

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

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

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

  • 更多...