PHP在Linux下运行Shell命令

On November 21, 2013, in Linux, by admin

原本在本机开发PHP的时候,Shell调用一切正常。上线的时候才反应到线上的服务器对权限做了严格的控制,一顿折腾之后梳理出在严格权限控制的Linux上如何通过Nginx/Apache 以Web的方式调用Shell命令,比如调用java编译或者执行java程序。

Web服务器使用www用户启动。分为两种情况:一种是命令是通过root安装的,并不能直接把权限直接赋给www用户,比如/usr/local/nginx/sbin/nginx;一种是www用户对要执行的命令有绝对的权限,但是由于缺少某些环境变量,执行的程序如果用到了这些变量就得提前再次设定环境变量。

先说第一种,其实php.ini里面已经定义了不可以调用的命令,默认情况下exec, system之类都不能执行。首先要去php.ini里面把

disable_functions=

这一项里面定义的那些调用Shell脚本的函数移出列表,然后重启Nginx的PHP-PFM或者Apache。可以测试一下

<?php echo exec(“pwd”); ?>

正常情况下应该就可以看到当前的路径信息了。但是要想执行一些root才能执行的命令,比如重新加载Nginx配置文件,还需要一些额外的操作,这里参考http://bbs.chinaunix.net/thread-3693263-1-1.html

1、设置 sudo 配置文件 可写权限
chmod u+w /etc/sudoers

2、增加 www 用户的 nginx 脚本管理权限
www     ALL=(root)      NOPASSWD: /etc/init.d/nginx

3、关闭 【强制控制台登录】执行
【非常重要】,注释该行 我的问题就出在这里,开启了这个选项之后。在PHP中怎么调用,都没有执行结果
#Defaults    requiretty

4、还原 sudo 配置权限  440
【非常重要】,如果不还原权限。在PHP中怎么调用,都没有执行结果。
chmod u-w /etc/sudoers

5、调用php
$result2 = exec(“/usr/bin/sudo /etc/init.d/nginx stop”,$result);
var_dump($result);
var_dump($result2);

再看看如果调用Java编译并执行。www用户拥有对/work/java目录的执行权限。直接上代码:

Java的,文件名”TestJava.java”

public class TestJava{
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}

PHP的,文件名”test.php”

<?php

function del_file($file){
if(file_exists($file) && unlink($file) ){
echo “del “.$file.”<br />\r\n”;
}
}

function execute($exe){
echo $exe.”<br />\r\n”;
$r=exec($exe, $res);
var_dump($res);
echo “<br />———————-<br />\r\n”;
var_dump($r);
echo “<br />———————-<br />\r\n”;
}

$target_file = “TestJava.class”;
$output_file = “output.txt”;
$src=”/work/web/services.adsage.com/deploy/monitor/test/TestJava.java”;
$bin=”TestJava”;
$jcommon = “export JAVA_HOME=/work/java\nexport JRE_HOME=$JAVA_HOME/jre\nexport PATH=$JAVA_HOME/bin:$PATH\n/work/java/bin/”;
$javac=$jcommon.”javac “.$src;
$javab=$jcommon.”java “.$bin.” >> “.$output_file;
del_file($target_file);
del_file($output_file);

execute($javac);
execute($javab);

echo “final:<br />\r\n”;
$output=file_get_contents($output_file);
echo $output;
?>

通过Web浏览结果:

del TestJava.class
del output.txt
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/javac /work/web/services.adsage.com/deploy/monitor/test/TestJava.java
array(0) { }
———————-
string(0) “”
———————-
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/java TestJava >> output.txt
array(0) { }
———————-
string(0) “”
———————-
final:
Hello World!

 

Tagged with:  

最近团队正在尝试使用Test Flight来管理测试App和内部Demo的分发。使用Test Flight最大的好处就是可以让不越狱的iOS设备免费使用Test Flight的企业证书。

之前团队碰到过一个Android测试设备的管理问题:作为一个创业团队,没有财力购买多余的设备。虽然每个测试,研发以及销售、运营同事都有自己的设备,但是在很多情况下,这些设备作为测试设备临时征用的时候就碰到一些困难,无法完整统计每个人手里的设备型号。

在使用Test Flight的时候发现Test Flight不仅仅可以用来分发测试App,同时也收录了所有测试人员手中的设备情况。但是Test Flight没有提供直观的视图来让测试、开发或者管理员来统计所有的设备情况。

仔细琢磨了一下,花了点时间,写了个CasperJS的脚本,来登录Test Flight并且把所有的测试设备列表抓取回来。

源码:https://github.com/shootsoft/testflight-device

使用:

casperjs device.js –username=xxxx –password=yyyy >> device.csv

device.csv可以用Excel导入形成直观的表格

email,platform,hardware,os,udid
a@xxxcom,Android,Xiaomi MI 2SC (Phone),Android 4.1.1,
b@xxxcom,iOS,iPod Touch 4th Gen,iOS 6.1.2,3660axxxxx28986c9e96c6c822e7c7049
c@xxxcom,Android,Samsung GT-I9502 (Phone),Android 4.2.2,
c@xxxcom,Android,Huawei HUAWEI Y220-T10 (Phone),Android 2.3.5,
d@xxxcom,Android,Huawei HUAWEI U8825D (Phone),Android 4.0.4,
e@xxxcom,iOS,iPad 2 Wi-Fi,iOS 6.1.3,60301xxxxxxxxff4cab91db6325cc7
e@xxxcom,Android,Lenovo Lenovo A820e (Phone),Android 4.1.2,
f@xxxcom,Android,Htc Evo 3D GSM (Phone),Android 4.1.2,
f@xxxcom,iOS,iPhone 4 GSM,iOS 5.1.1,ae3b3fxxxxxxxxxx5c71aa5f6ff3d59c1f921
g@xxxcom,iOS,iPhone 4S,iOS 7.0.2,178215cxxxx36d0eb48e2b54bfe3c5077

导入Excel后

testflightapp-device-excel

Tagged with:  

发布一个开源的PList Editor

On July 10, 2013, in Download, by admin

PList文件是苹果XCode中经常用到的配置文件(Property List)。Windows下经常会碰到需要查看plist文件内容的时候。有些时候是xml格式的,用记事本就能看,但是有些时候碰到二进制的就素手无策了。偶然的机会发现Github上的这个C#的plist解析器(PlistCS),于是开发了一个PList Editor

源码下载:https://github.com/shootsoft/PListEditor

二进制下载:https://github.com/shootsoft/release/tree/master/PListEditor

第一个版本:

  • 支持新建,编辑,保存为二进制或者XML格式的plist
  • 支持系统文件关联
  • 支持XML格式化
  • 支持XML高亮语法

鸣谢:https://github.com/animetrics/PlistCS

截图:

plist.editor

 

Tagged with:  

2013 QCon Beijing 游记3

On April 27, 2013, in News, by admin

很快就到第三天了,上午也是相对比较固定的在Node.js相关的会场呆着,中途去听了一场新浪云平台的分享,不过感觉还不够深入,倒是Node.js方面,新浪的另外一位讲师分享了使用Node.js开发的MySQL的数据库中间件,通过这个中间件来管理MySQL集群,这个和新浪云那个一结合,大概如何做一个开放式的MySQL集群服务就有大致的思路了。

网易游戏的谢骋超分享的Node.js的polemo网游Server端框架非常有意思,Demo也比较完整,做移动应用&游戏的同学有福了。网易在国内开源社区方面也算是树立了一个标杆。想了解的可以迅速移步:http://pomelo.netease.com/index.html

下午四场都是集中式的专题演讲了,其中NASA的工程师Khawaja Shams明显的就是Amazon的“形象代言人”了,NASA去年的火星探测器后端的数据处理全部Hosting在Amazon的AWS上,非常的Cool~

Oracle的Java那个专题基本上很无趣,原因是Java 8的这些新特性已经讲的非常多了,连我这个不做Java的都听的耳朵快磨出老茧了,更别说那些专职Java的工程师们了。这个演讲直接导致我旁边的同学鼾声大起…

晚上本来大会行程已经Over,不过腾讯云单独加了个专场,就去听了听。腾讯真是一个非常低调务实的公司。我比较看好腾讯云在游戏行业的拓展。目前腾讯云官方的主要的几个Case也都是游戏方面的。

三天很快结束,真是意犹未尽~期待明年仍然有机会去参加新的QCon大会~

Tagged with:  

2013 QCon Beijing 游记2

On April 26, 2013, in News, by admin

QCon第二天位置比较固定了,上午一直听的都是UI和产品设计相关的专场,四场分享一个比一个精彩。百度的香超分享了很多移动App UI设计方面的经验;豆瓣的屈雪则分享了豆瓣FM从零开始,如何定义产品,如何分析产品需求,如何设计产品UI的前前后后和点点滴滴;Jing.fm分享者是一个很酷的中俄混血帅哥施凯文,如果套用昨天的道哥的标题(山寨微信…),Jing.fm则是《这一次,我们重新定义了音乐搜索》;来自eico的张伟所分享的有关设计的细节非常值得所有的产品经理和设计人员细细体会。
其中印象最深的还是Jing.fm,从音乐类型分类开始,到音乐乐器识别,最后再到歌曲的情感分析,Jing.fm团队做了深入的研究和大量的创新,真正将自然语言描述化的融入了音乐搜索当中。比如“德国带有钢琴演奏的轻音乐”,再比如“周杰伦的悲伤的歌”,或者是“我喜欢周杰伦,我失恋了,给我来首歌吧”。

下午前3场一直在《跨终端的Web》这个专题里猫着,其中来自腾讯的黄悦所分享的《响应式Web设计在跨终端广告创意中的应用》很合我胃口,只可惜腾讯内部的这些工具我们“只可远观而不可亵玩焉”。

最后一场去听了新蛋伍涛分享的《Solr与Cassandra二级缓存实践》,个人感觉前半部分分享的过于细节了,所以后面很多踩过的“坑”没法一一细说。其实在开源的项目上,这些“坑”有些时候反而是更重要的。原因是方案大致上确定了之后,翻翻代码,基本上都有思路,有些“坑”不可避免的要走一周,但是有些“坑”提前知道了,则会节省很多时间。

PPT都在InfoQ的微盘分享里了,就不一一贴出:http://vdisk.weibo.com/u/1746173800

 

Tagged with:  

2013 QCon Beijing 游记1

On April 25, 2013, in News, by admin

感谢国家,感谢@郑旭进 同学的努力争取,感谢老板@付增学 掏钱,让我等有机会与大人物们近距离接触,感受软件工业界的这一盛会。

第一次这么早出门上地铁,不过还好是从8号线起始站上,人也不是很多。很快赶到鸟巢。天气很不错,早上人不多,零星的有些旅游观光的人。另外没有杂七杂八的卖什么罗汉豆之类的小商贩,走在奥林匹克公园的广场上很是惬意。
国际会议中心比较好找,之前也来过一次,应该是09年的Google开发者大会。很快办理了入场手续后找了个离大屏幕近的地方就坐。上午的4场全部都是主题演讲,英文的还有同声传译(去的晚的同学就没有了…)。下面重点说说自己的感受吧。
第一场是Douglas,思维观念部分听的比较晕乎,不过编程风格部分倒是非常清晰。说实话,那个Javascript的例子确实也解决了很久以来积压在我心头的一个问题:为什么Vistual Studio针对Javascript的格式化一直默认保持K&R style风格(大括号的开始总是与上一行代码在同一行),而不是和C#一致的Allman style风格(大括号的开始总是独占一行)?
PS:各种风格参考 http://en.wikipedia.org/wiki/Indent_style
原因参考PPT:http://vdisk.weibo.com/s/yTOrU/1366857734

第二场是来自Github的运维工程师Jesse,重点介绍了Github中运维用的”协同办公”工具Chatbot和Hubot,这两个工具思路非常有意思:让OPs的运维过程也能协同起来。比如对于异地入职的新员工,由于无法像同一个Office的团队一样,无法真实观摩一次同事的部署过程,使用Chatbot就能很好的解决问题:我演示给你看,你自己回头也应该这么做。如果是同一个团队,这个“演示”毫不费力,但是对于异地的Office就无法很好的做到这一点了。
PPT下载:http://vdisk.weibo.com/s/yTyLo/1366856893

第三场是来自百度的林仕鼎,感觉比较厉害,但是这个架构设计与架构师的话题感觉有些抽象,回头写本书倒是可以看看。不过能够感受到一点,这个分享的确是从系统非常基础的层面开始准备和整理的,需要花些时间消化消化。
PPT下载:http://vdisk.weibo.com/s/yT-n-/1366862570

第四场是Kevlin Henney,《程序员应该知道的97件事》的作者,是个“实战派”人物,不但总结的精辟,还上了emacs和C++的现场编译演示的例子,不过演示系统缺又偏偏不给力…
PPT下载:http://vdisk.weibo.com/s/yUjup/1366864019
下午行程:二号厅的A->B->A->C
首先还是Github的Jesse,分享了Github背后用到的那些Open Source的基础架构。包括LVS,MySQL,Redis,Memcache,Git,Unicorn(Ruby的Http Server,Github大部分应用均是Ruby开发)…都非常常见。不常见的是Github的Private Respo可以通过SSH访问,Github自己实现了一个从SSH到Git协议转发的Proxy(不知道我理解的是否正确)
详情参考PPT:暂无

其次是Apache Camel DSL in Scala。选这个没什么特别的理由,只是不了解Apache Camel和DSL,想听一听。 先不说Scala,这个用Java的肯定都了解。Camel还是一个挺有意思的项目,用于路由规则和中介引擎。DSL对我也是一个比较陌生的概念,回来也好好补了补课(具体请参考:领域特定语言 http://baike.baidu.com/view/1616623.htm)
PPT分享:http://vdisk.weibo.com/s/yYtnx

除了@fenng小道消息道哥的黑板报也是我每天必看的微信帐户之一。以前只是大致看过安全宝的介绍,没有详细了解过,这次道哥不但详细介绍了重新定义的WAF(Web Application Firewall),还特别介绍了创业路上的各种坑,其中不乏中国特色的。另外以前公司每次有门户方面的需求,我的第一个反应都是能不能用Wordpress,DedeCMS之类的来实现,但是安全问题却又总是绕不过去:万一有漏洞怎么办?安全宝则给我们提供了一个很好的解决方案。
PPT分享:http://vdisk.weibo.com/s/yYpJ3

最后是七牛云存储的持续集成部署的分享。对于云存储这种较为底层的服务,代码的上线发布环节需要十分严谨,但在这样的情况下,每天还能做到几次到十几次的发布,还是很惊人的。不过堪称敏捷团队的典范。
PPT分享:http://vdisk.weibo.com/s/yYZ9x

 

Tagged with:  

[原创]浅谈移动App广告平台的设计

On April 9, 2013, in Others, by admin

前言

依靠广告盈利占据了国内移动App盈利模式的半壁江山。很多App刚刚有点流量的时候都会考虑是不是做个自己的广告投放系统以支撑业务未来的需求。

笔者在工作中有幸接触到了一些有这类需求的App,这些App在自有广告系统中总有这样或那样的功能性缺失,这不可避免的会造成一些业务上的损失。
主要的功能缺陷集中在对品牌类广告主的需求满足上。相对于效果广告主来说,品牌广告主是一类让人又爱又恨的主儿。爱是因为品牌们都是有钱的主儿,能被品牌们看上也说明了自己的江湖地位。恨是因为品牌们都是事儿妈,销售和运营们7*24的伺候着不说,还总提出层出不穷匪夷所思的投放功能需求才是最让人恨的地方。

尽量使用国内服务

这一点很重要,必须先说明:不管你看到的国外的某个网站有多牛,追踪效果、报表有多酷,但是只要你的目标用户在国内,尽量使用国内的服务,原因不细说,心里明白就行。

使用WebView展示广告

从最基本的图片显示需求开始,80%的开发者首先想到的肯定都是有个尺寸,图片地址,点击地址,在App上使用一个Image View显示一下应该就足够了吧,因为业务人员往往就是这样描述他们的业务场景的。但是在实际的业务场景中往往会有很多变数:比如需要增加展示监控,增加广告关闭按钮(免得金山毒霸之类的给你的App上加一个,还有可能引发不兼容等问题)。
此外,移动领域的广告让品牌广告主非常心动的一点就是有丰富的人机互动和表现能力,比如晃动,涂抹,重力感应等。如果有这类需求开发人员会发现原来的ImageView太简陋了,而且需求不明确的情况下也没法实现开发和投放,因此基本上调研之后都会转而使用Web View来展示广告。WebView的缺点是比较消耗资源,一个WebView的创建一般都需要200ms左右,但是只要稍微做些优化,这个损耗和App3,4秒的启动速度相比就不足挂齿了,用户体验不会有明显差异。比如WebView要渲染完毕再展示,出场有个动画(这个地方的灵活性可以参考jquery的动画)就可以给用户更好的体验。
。这时候投放系统可以实现图片,文字链,视频,HTML5动画等广告展示形式,几乎无所不能了,如果仔细研究一下各家专业移动广告平台的投放,这些几乎已经是标配。

展示监控

很多品牌广告主往往一上来就指明要展示监控,说简单一些就是用户每次看到广告,需要通知广告主发生了一次展示。品牌广告主们往往不会拥有自己的系统,而是找代理商,代理商有时还会再找个第三方监控平台以示公正。这一点要是不能满足,这单估计就保不住了。做展示监控要特别注意几点:

  • 展示监控链接会有跳转行为,所以千万别访问一下就完事,要有两跳,但至多三跳。一般来说四跳非常非常少见,五跳以上基本可以认为对方的系统出问题了…;
  • 有的监控链接还会要求有动态参数,一般是用户的标识符,包括iOS的MAC地址,广告追踪ID,OpenUIDID(UDID可以不用再考虑了);Android的EMSI SIMID AndroidId等;
  • 有些情况下也可以做服务器转发,但是客户端的IP之类的信息得附带上,同时得与代理商和第三方监控提前沟通,否则转发服务器的IP会被认为是作弊;
  • 展示次数差异一般上下浮动10%是正常现象,因为国内网络复杂度及终端用户的网络质量都是不可控因素。

点击链接

点击链接与显示链接一样,可能会有参数的替换。所以在App前端的系统设计上千万不要把参数和顺序定死,最好的方式是模板式替换。如果App本身也带监控,最好是采用多线程式同时触发。可以想到如果采用顺序式触发万一某个服务挂了就会影响后续的监控。
在点击链接的跳转上,每一次跳转可能都有5%左右的损失,所以要提升到达率就需要尽可能减少跳转的次数。
不同的系统兼容性不一样,这里还有一个URLencode的坑:要注意每一个链接都是有多个参数的,拼接跳转链接时记得做URLencode处理,不要丢参数;同时每一个参数最好做一次decode的检查,特别是参数有中文的情况下,没有URLencode过的要专门处理一下。
点击之后的打开行为,一般分为应用内打开,应用外打开,其他行为三类。手机上比较独特的一点就是其他行为,包括拨打电话,发送短信,邮件,启动其他应用等,这些基本都可以通过系统调用实现,在开发的时候要特别注意。
iOS6以后有个应用内下载功能要注意集成进App,能非常大的提升App类广告的转化率。
笔者深有体会的是Android的应用外打开非常坑爹,会导致50%以上的点击丢失!原因是用户安装了两款以上的浏览器时系统会询问用户。一个非常有用的实践中得来的经验是App内置一个浏览器来打开着陆页,或者强制指定一个默认浏览器。

屏幕密度

Android上的屏幕密度问题。得益于苹果高超的工业设计和制造水准,将高清屏引入了智能手机产品当中。但悲摧的是由于Android的制造厂家众多,标准不一,在Android上要特别注意对高清屏的处理,否则 图片尺寸变形在所难免。

视频广告

视频广告虽然目前还不是主流,但还是值得一提。首先是视频的自动播放,一般广告主会要求在Banner上点击以后全屏播放,如果用着陆页直接链接视频文件的方式,可以实现自动播放,但是会无法追踪用户的后续行为。解决办法是要么在Banner上直接播放,要么自己用Native Code处理一下。其次是用户观看视频的时长追踪。举个栗子,假如一个视频有25秒,广告主如果要求提供看完视频的用户个数,看完20秒视频的用户个数,看完15秒视频的用户个数,系统得能够支持这样的追踪。而且视频广告一定要提前在不同的Android机型和系统版本上测试兼容性。

广告后台

广告后台要注意的首先就是各种定向的需求,专业广告平台的定向类型非常多,但是作为非专业的App后台,只需包含地域定向和按小时包段投递等简单定向即可。如果想更进一步深入研究广告投放系统,可以参考一下
百度广告管家(http://adm.baidu.com/index.html)
谷歌DFP(https://www.google.com/dfp/)
OpenX(http://www.openx.com/mobile)
以及师徒网的计算广告学这门课程(http://sheetoo.com/app/course/ov?course_id=200)

最后再说说广告的投放和渲染。为了节约服务器流量,投放出来的广告一般是数据加模板地址,模板放在CDN上,本地可以对模板和图片等广告物料资源进行缓存。其余诸如把模板下载到本地,然后填充数据,再使用WebView渲染等都是非常基础和具体的开发工作了,这里就不再一一细说。

Tagged with:  

今天碰到一个比较小众的需求:动态解析一个二级域名到内网IP上。域名本身是托管在DNSPod上的,先试了试官方提供的客户端,发现只能解析到外网IP,由于公司内部是一个局域网,出口的外网IP都是一样的,所以意义不大。好在DNSPod的API非常齐全,参考:https://www.dnspod.cn/Support/Api

仔细研究了之后决定自己写一个。

配置文件选用JSON格式,最近做了不少项目,配置文件基本都是JSON。JSON格式的配置文件无论程序还是人为读取,可读性都非常好。C#下有很多JSON的类库,由于之前多次使用FastJSON,所以继续使用:http://www.codeproject.com/Articles/159450/fastJSON

但是不得不吐槽一下DNSPod的API格式:比如Record类型的id属性,一会儿是数字类型,一会儿又是字符串类型,实在是有些不方便,特别是碰上FastJson这样愣头愣脑类型的解析器:为了追求速度,对JSON格式做了非常严格的规定,数字就是数字,要么你去修改类型,要么修改FastJson的代码用int.trypase去尝试一下。JSON.NET目前还是.NET平台下最好的JSON解析,只是用在这个项目里觉得体积还是有些大了。

DNSPod的API都是标准的REST请求,返回XML或者JSON。迅速完成核心需求:

动态解析域名到内网IP上

传送门:https://github.com/shootsoft/SimpleDDns

 

Tagged with:  

LuManager单独安装mysqli手记

On May 12, 2012, in Linux, by admin

在开始之前,首先试一下这个这个帖子里提到的方法

http://www.zijidelu.org/forum.php?mod=viewthread&tid=46214

如果不行,按照下面的方法进行(不仅仅适用于LuManager,如果是自己编译安装的php也可以这么做):

首先确定你正在使用的php版本以及php.ini的位置,LuManager自带了几个版本。如果是默认安装,应该是5.2.17。php.ini的位置应该是在

/usr/local/php_fcgi/lib/php.ini

要确定这些信息,可以自己编写一个 info.php

 <?php

phpinfo();

?>

把文件存放到网站根目录,然后浏览一下。

比如 http://yourdomain.com/info.php

到上述帖子里提到的LuManager的安装源码包里,我的解压到了/root/zijidelu_install路径下

进入LuNamp的soft路径

cd /root/zijidelu_install/LuNamp/soft

用ls查看一下,应该有这个文件

ls php-5.2.17.tar.gz

解压缩

tar -zxvf php-5.2.17.tar.gz

进入mysqli的安装路径

cd php-5.2.17/ext/mysqli

这里是mysqli的源码,编译之前我们还需要借助phpize这个工具(感谢@一只猪同学的帮助:-)),它存在于你的php安装路径,比如

/usr/local/php_fcgi/bin/phpize

在当前路径下运行一下,看到如下提示:

Configuring for:

PHP Api Version:         20041225

Zend Module Api No:      20060613

Zend Extension Api No:   220060519

configure.in:3: warning: prefer named diversions

configure.in:3: warning: prefer named diversions

继续运行下面这几个命令

 ./configure -with-php-config=/usr/local/php_fcgi/bin/php-config -with-mysqli=/usr/local/mysql/bin/mysql_config

make

make install

最后会看到这个提示:

Installing shared extensions:     /usr/local/php_fcgi/lib/php/extensions/no-debug-non-zts-20060613/

说明安装成功。

从LuManager后台重启一下ngix(如果你只用Apache那就重启一下Apache)

再刷新一下info.php,搜索mysqli,如果还搜不到就得自己编辑一下php.ini了

编辑之前double check一下mysqli.so是不是已经安装到上述路径了

cd  /usr/local/php_fcgi/lib/php/extensions/no-debug-non-zts-20060613/

ls

如果看到mysqli.so就继续

vim /usr/local/php_fcgi/lib/php.ini

输入

/mysqli

然后回车,定位到这一行

;extension=php_mysqli.dll

输入i,进入编辑模式,然后在这之前或者之后加入一行

extension=mysqli.so

按下ESC,然后输入

:wq

如果对vim编辑不熟悉可以从LuManager后台在线编辑php.ini

保存之后重启一下ngix

再次查看info.php

mysqli

 

MysqlI Support enabled
Client API library version 5.1.56
Client API header version 5.1.56
MYSQLI_SOCKET /tmp/mysql.sock

 

 

Tagged with:  

发布SAE Storage批量上传工具[开源]

On March 28, 2012, in News, by admin

最近云计算如火如荼,于是也忍不住去尝了尝鲜。SAE(Sina App Engine)是新浪推出的云计算平台,直接用微博账号就能登录,绑定手机号以后就可以开始使用了,支持PHP/Java/Python。一个比较有特色的是应用程序商店,逛了一圈发现有Wordpress,于是动起了把本站迁移到SAE的念头。上网搜了一圈,发现这篇教程倒是很详细:

http://www.mobai.org/2011/09/30/wp2sae/

但是第一个评论就击退了念头:

看来wordpress的转入,确实很麻烦。尤其是图片的部分,5年,每年12个月,就要手动创建60的路径,然后每个路径再上传图片,这是很可怕的工作量了。。。唉。

难道没有好的办法了么?摸索了一番之后决定自己开发一个SAE Storage的批量上传工具。

原理很简单,搭建Wordpress之后,再通过SVN或者手动上传一个额外的PHP,这个PHP专门用于接收上传的文件,然后转存到Storage。路径与本地的或者原有路径保持一致即可。本地上传使用C#开发。源码托管在Github上:https://github.com/shootsoft/SAEMutipleUploads

SAE Storage批量上传工具的使用教程参考这里

Tagged with: