分类目录归档:web开发

PHP & Git 最简单的自动部署之二 Win系列服务器

上一回介绍了看起来挺高上大的PHP+git自动部署,之前一直是在linux平台上面使用的,用着还挺顺利的,今天很蛋疼的要做某个项目在windows服务器上面的自动部署,然后就有坑了。首先git在windows上面就是个问题了。msysgit?那家伙凑合能用,但是还是很多问题,还是上次的脚本,会出现无返回无错误进程没有启动的问题,如果你出现了找不到路径,不是可执行文件等提示,你可以试下制定好git的绝对路径,反正我这还是不行。

我换着用PHP的执行命令的方法,exec/system/passthru/shell_exec反正都是不行,出现无返回无错误进程没有启动,试着中间再套一层bat来调用,进程是起来了,但是不知道出什么错误一直不能结束,也就一直阻塞着。用ProcessExp看一下其实msysgit还真是个复杂而蛋疼的东西,一个简单的git pull 他会启动超过5级子进程,目测是sh,用来初始化环境,然后再在里面跑git。

于是我很蛋疼的想,我再写一个别的exe,把运行git pull并取结果包装起来,然后再让php来调用这个exe?结果还是不行,折腾了一天,突然一想不如自立门户,然后多了几行代码,把这个小程序改成了监听某个端口,接收到请求就git pull并把返回写到response,这个东西在go里面不难实现,最后做成这个样子,简单粗暴,有效。

这个程序实现的东西就是一个一个小的http server ,监听8124端口,有简单的http auth,auth通过了之后会调用gitPull,调用过程很复杂的样子,其实还好,他先是找到git的绝对路径,然后Chdir到文件所在目录(也就是说,最后这个程序编译出来,应该放在版本库根目录),然后执行git pull再返回响应。这已经挺完美了,但是还可能出现的一个问题是你的机器在防火墙之后。你开了8124端口外网访问不到怎么办?那还用80端口,还用上次的脚本,做一次中转,脚本里面执行的部分改成curl一下127.0.0.1:8124好了,记得带上auth。

另外提醒一点,这样把版本库放在web目录方便自动部署啥的,其实有安全性的问题,毕竟你有一些例如数据库密码你是硬编码在配置文件里面的,也在版本控制之中,简单地说,你要保护.git目录,最简单的办法RewriteRule ^..* – [F]

#暨大离线# windows平台下面的静态文件web服务器选型

今天下午和晚上在做暨大离线的一些准备,主要测试了一些东西

离线下载,顾名思义你离线,服务器帮你下载,那么服务器下完之后还得给你传,这里采用什么传输方式呢?

一开始我有考虑使用ftp,但是发现相比起http下载,ftp还有很多人不会用,如果这个局域网过程仍然采用http下载,对于用户来说会不会比较无痛呢?

于是我开始测试服务器用的web服务器软件,服务器这边目前是win2k3环境(至于为什么,后面文章再有详细介绍)。

这个服务器承担让用户取回要下载的文件的这么一个角色,只需要对静态文件提供http下载即可,不需要脚本支持。

Nginx在windows——杯具!

一开始我测试了windows版本的nginx,nginx在linux上面是个很不错的服务器软件,有低资源占用,抗并发能力好等特点。但是到了windows平台上就坑爹啊~~这一点你还不能怪nginx的开发者,实际上C语言可以为Windows平台编写软件,linux也没有例外。程序本身的逻辑应该是跨平台的,而在具体与系统打交道(调用系统api)的时候才有差异,这个差异有很多方面,包括内存管理、进程管理、文件系统、网络控制等方面。而一个优秀的开源服务器软件,nginx,在windows下,是在这次测试中表现最渣的一个。对于同一个普通二进制静态文件,局域网内客户端开5线程下载平均速度在1mb/s左右,峰值可以达到1.5mb/s,速度很不稳定。

Apache在windows——仍旧杯具!

第二我测试了Apache,Apache作为市场占有率第一的服务器软件,在windows平台上也有比较完善的版本。我是从官方网站下载的2.2stable版安装的,还是跟上面一样的那个文件,一样的客户端一样的5线程,下载平均速度1.3mb/s,峰值能到1.5mb/s。速度比较稳定,不过Apache的个东西,性能不会是最好的,apache和nginx最大的不同是,apache使用了每个请求一个线程的阻塞I/O模型,nginx使用了单线程的非阻塞I/O模型,关于apache和nginx之间的讨论还有很多,我比较偏向于把apache和nginx组合来使用(明显是说在linux平台上),这样他们两个可以互相取长补短。

IIS不用说肯定是在windows——居然能跑这么快!坑爹啊

最后我尝试了IIS,IIS的配置过程看起来非常轻松方便。测试同一个文件,额,什么情况!这win2k3上面的iis6,居然让客户端的下载速度平均值达到了2mb/s,峰值能到2.3mb/s。搜了一下网上很多人都有说这个问题,在微软的windows上面就他自家的iis跑得最快了,别的都是渣渣。

就这样这个web服务器软件就暂时选定了IIS吧,是那个我之前相当鄙视的IIS,总的来说其实是自己对于IIS没有很多的认知。IIS怎么说市场份额也是排在第二的(Apache比它大几倍的稳居榜首),另外有一点,国内很多入门级虚拟主机都是windows+IIS+ISAPI来支持PHP的,他们也不会在windows上面弄apache,这一点也能说明一些问题。当然了,这是一片神奇的土地,国外又完全不是这么回事了,国外一般人不会用Windows做服务器的操作系统(是服务器不是pc),包括费用等方面的考虑(我觉得更大的原因是——用不着)。

 

新浪云计算初体验-SAE图床

今天晚上开始在新浪云计算平台SAE部署我的第一个应用,一个图床。程序代码据说是提取自isaid的,整个代码和教程来自于这里,其实这个算比较简单的一个组件吧,我只做了小部分修改。教程里面有的我就不重复了,下面说一下教程里面没有的。

开始使用使用新浪云计算的sdk上传代码的时候,需要先在新浪云计算应用中心,进入你的应用里面的 “应用管理-代码管理” 里面创建一个版本,版本只能是一个正整数,默认为1。创建版本之后,在本地sdk中选择“下载全部Apps”,然后对应到你的本地app目录(默认为你sdk目录下面的apps文件夹,例如我这里是E:saeSAE_SDK_Windows_1.0.5apps)里面应该有与应用名一致的文件夹,再往里面就是一个应用各版本的文件夹,以版本号为目录名。在这个以版本号数字为名的文件夹里面你需要放置code文件夹,code文件夹里面才是需要上传的代码,对应web的根目录。我一开始犯的错误就是没有使用创建代码版本,直接手工建立各级文件夹(例如我这里是E:saeSAE_SDK_Windows_1.0.5appshorsley1code,horsley是应用名)。

版本等问题解决之后我在sdk中点击“更新上传”按钮得到了一个error,说不存在config.yaml。有玩过用过Google App Engine (GAE)做各种应用(各种代理程序……##¥%&%¥)的童鞋应该大概知道这是一个配置文件,包含应用的版本号,应用名等信息。这个文件存放位置应该是在版本号文件夹下,与code文件夹处于同一层(例如我这里是E:saeSAE_SDK_Windows_1.0.5appshorsley1config.yaml)。没有这个文件夹怎么办呢?我们可以在sdk工具右上方文件列表窗口右键,选择菜单里面的“编辑config.yaml”,这时候他就会提示你“APP的config.yaml文件不存在,是否创建一个?”当我们点击“是”按钮之后它就会帮我们创建一个config.yaml文件,并且里面已经有需要的默认的内容了。这个文件创建好之后我们再上传代码就不会有问题了。

上传完之后按照教程进行安装初始化,安装成功之后开始登陆,登陆以后却出现了错误

SAE_Warning: Cannot modify header information – headers already sent by (output started at /data1/www/htdocs/605/horsley/1/config.php:1) in manager/index.phpon line 53

这个问题有点眼熟,以前折腾暨南人新闻网wordpress的时候遇到过。大概情况就是php里面用到了header函数,header函数要求必须在有任何实际浏览器输出之前调用,下面是php手册里面的对header函数的原文提示:

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

很多时候我们都需要调用header函数发送location的http都控制浏览器跳转,而这个错误的发生原因很多时候是我们不经意制造了一些浏览器输出。按照sae警告的内容找到这个config.php,在有行号显示的编辑器里面(例如我在使用的notepad++)打开这个文件可以很明显的看到文件末尾有一个空行,这就是问题所在。我们写c++代码的时候,使用例如我们作业要求的c-free5+mingw编译环境,如果文件末尾没有一个空行,将会产生一个编译器警告。php和c是同一系列的语言风格,不知道是不是这个原因所以在这个php文件末尾多了一个引起问题的空行。

突然想起一个东西,当我们为sae上边的应用创建一个新代码版本之后,sae默认写入一个index.php,内容如下

<?php
echo '<strong>Welcome to SAE!</strong>';
一开始我看了觉得很奇怪,怎么这个php标签没有闭合啊?简单google一下发现,其实这种写法有一个主要的好处:避免 ?> 后面的不可见字符(多余的空格、换行符)等破坏页面显示,也不会导致 Header already sent 这样的警告信息。因为没有结束标签 ?> 所以就算文件末尾有多余空行,用于没有php结束标签,这个空行就属于php解析的范围而不是直接的浏览器输出。在php代码范围里面,空行不产生输出也不影响代码。不过,我们也应该注意这个用法只能是在文件末尾的php结束标签?>才可以这样省略,其他地方我们还是需要使用结束标签的,例如php嵌入html。
凡事多思考,多问个为什么,这样才能有进步。