在PHP网页程序中执行Sass/Compass命令
我们需要在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);}
最新评论
- 相关文章
CSS3属性选择器特性使用详解
CSS3除了引入动画、滤镜(用于特效)以及新的布局技术外,在选择器(selector)方面也有增强。属性选择器根据元素的属性(attributes)来匹配。这可以是一个单独...
React JSX语法简介
JSX是一种类似XML的标签语法,用来简化代码,我们可以不使用JSX,但了解并使用也没什么坏处:)在React中,JSX是一个使用 React.createElement() API的快捷方式...
常见面试题JS语言中四种函数调用方式实例讲解
JS的语言世界中函数(function)是一等公民,函数的调用有多种方法。普通调用这个是最常见和直接的方式:function
CSS3弹性布局弹性流(flex-flow)属性详解和实例
弹性布局是CSS3引入的强大的布局方式,用来替代以前Web开发人员使用的一些复杂而易错hacks方法(如使用float进行类似流式布局)。其中flex-flow是flex-direction...
深入理解CSS3滤镜(filter)功能和实例详解
CSS3滤镜功能源自SVG滤镜规范,SVG滤镜最早用来给矢量图添加类似PS中像素图的一些特效。
把这个滤镜功能引入到普通HTML元素中可以带来很有趣的效果(模糊、...HTML5、Hybrid APP、Native APP对比和技术选型
HTML5和Native APP都很容易理解。为了获得HTML5的移植性和移动本地应用的高性能,搞出来一些混合APP的解决方案。比如Apache的Cordova(也就是以前的PhoneGap),...
Three.js入门教程2 - 着色器(下)
这是WebGL着色器教程的后半部分,如果你没看过前一篇,阅读这一篇教程可能会使你感到困惑,建议你翻阅前面的教程。
CSS3图片混合(Blend)效果及其参考计算公式一览表
在Photoshop软件中,混合是将两个图层的色彩值进行合成,从而创造出大量的效果。在这些效果的背后实际是一些简单的数学公式在起作用。下面所介绍的公式仅适用于R...
WebGL入门教程4 - 使用纹理贴图(Texture Map)
3D建模和纹理贴图的关系就好比人体和皮肤(或着装)的关系,3D建模用来处理空间属性,而贴图适合用来处理细腻的表面属性。如果不使用贴图,而想在表面达到足够的...
如何基于Canvas来模拟真实雨景Part1:预备知识和创建基本对象
使用top/left/margin和CSS3 translate两种方法实现标题居中的性能差异详解
要实现标题全屏居中(同时在垂直和水平方向居中),有若干种方法,包括使用弹性布局、表格单元、绝对定位、自动外边距和CSS3平移变换等。你可能已经使用了这些方...
更多...