Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

Sunday, June 21, 2009

以FastCGI的方式运行PHP

让PHP以FastCGI的方式运行可以最多提高10倍左右的速度, 还是很诱人的, 那天为了测试这个性能提升有多少, 就在Ubuntu里配置了一下.

首先需要安装一个软件包, 如果按上一篇文章[使用Ubuntu源安装LAMP]里讲的过程安装好的话其实就已经不用再安了, 需要的就是php5-cgi这么一个包.

然后需要打开Apache的actions模块, 因为后面的配置需要用到. 以下操作基于源安装的Apache:
$ cd /etc/apache2/mods-enabled/
$ sudo ln -s ../mods-available/actions.* .

最后就是修改配置文件了, 参考了FastCGI的官方文档. 添加如下配置:
# FastCGI for PHP
FastCgiServer /usr/lib/cgi-bin/php
AddHandler php-fastcgi .php
Action php-fastcgi /cgi-bin/php
需要注意, 最后一句中的/cgi-bin/是一个别名, 即下面一行配置指定的:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
经过上面的一系列配置, 当php后缀的文件运行时就会自动以FastCGI的方式运行了. 还可以使用php_sapi_name这个函数测试是否配置成功, 如果运行输出的是cgi-fcgi就证明成功了, 失败通常输出apache2handler.

运行的时候需要注意两点, 一是要给PHP文件加上可执行 (x) 权限, 另一个就是PHP文件所在目录需要在Apache中设置+ExecCGI选项:
Options +ExecCGI

这时就可以使用ab工具来测试了:
$ ab -c 50 -n 1000 http://localhost/fcgi-bin/test.php
经测试, 一个简单的字符串输出的PHP程序才只有处理复杂操作的C++程序性能的2/3, 看来差距还是挺大的.

使用Ubuntu源安装LAMP

以前写过一个编译安装LAMP的文档, 放在我的Google Code的texsky项目里 (关于texsky的详细介绍参见以前的一篇文章[又建了一个项目 -- texsky]), 前段时间觉得有源还是用源好点, 毕竟更新会更加方便.

用源就简单了, 只需要记住软件包名就行了, 以下包名在9.04下测试通过:
$ sudo apt-get install apache2.2-common mysql-server php5 php5-cgi php5-cli php5-mysql
真怀疑为了一点扩展性和性能提升去折腾编译值不值得...

如果还需要FastCGI的支持, 再加上两个软件包:
$ sudo apt-get install libapache2-mod-fastcgi libfcgi-dev
顺便提一下libfcgi-dev这个包, 刚开始以为这个包只是编译的时候需要用到, 因为它的描述是: Header files of FastCGI, 所以误以为只有头文件而已. 结果运行的时候由于没安这个包就出错了, 研究了一下才发现这个包里还包含了一些so文件 (好阴险), 自然是运行时需要用到的了, 安上以后运行一切正常.

Monday, April 27, 2009

近期的一些杂感

由于这几周都在忙着做事, 有好几篇blog想发却一直搁置着, 今天就把它们都写到一起吧.

先说攻防吧, 最近又出新题了还没去看, 对于注入这种层次的题目暂时不想了, 其它的什么编程题还能应付下, 无奈比例不大, 不能让队伍再靠前一点. 因为某题需要用到PHP的编程, 于是在重拾Emacs时发现默认是不支持PHP的高亮的, 这种事情肯定有人想到并解决了的, 安装php-mode就行了, Ubuntu可以直接apt-get install php-mode, 也可以自己到SF上去下载, 然后修改.emacs:
;; PHP mode for Emacs.
(require 'php-mode)
(add-hook 'php-mode-user-hook 'turn-on-font-lock)

以前的文章[参加三叶草Linux方向考核的一些总结]中介绍了一个叫做template的Emacs插件, 可以实现新建特定扩展名的文件时自动加载模板的功能, 像现在的某些IDE一样. SHE同学前段时间因为用Vim写汇编时必须重复地输入那些又长又难记的SEGMENT而苦恼, 问我Vim是否能自动加载模板. 查了一下, 还挺简单的, 这个不需要任何插件就能实现了. 修改.vimrc:
" Template for Vim.
autocmd BufNewFile *.asm 0r ~/.vim/templates/template.asm
注意中间那个是数字0, 而不是字母o. 把你的模板放在相应的文件里, 如果需要其它类型的模板修改扩展名就行了. 以上方法来自LinuxSir.Org.

由于最近需要经常测试网页, 愈发觉得用当前的Firefox调试很麻烦. 最让人痛苦的一点就是如果调试页面崩溃了, 还要连带影响我的正常浏览页面, 不得不一次又一次地重启. 实在是忍受不了之后 (看来我还是一个很能忍的人), 决定来一个专业一点的调试方法. 来自Mozilla的一篇文章:
Setting up an extension development environment
介绍了如何利用Firefox打造调试环境, 解决我前面那个问题的方法就是使用多用户配置文件, 实话说, 用了这么久Firefox还真不知道可以多用户运行的... 使用如下命令启动Firefox:
$ firefox -no-remote -P dev
这时应该会弹一个选择用户配置文件的窗口, 因为以前没有dev这个配置文件, 需要新建一个才行. 建好以后再用上面的命令运行的时候就会使用dev, 而不是默认的default了, 这样新开的浏览器与我之前打开的就不会相互影响了. 那篇文章还介绍了Firefox的一些配置调整以适应调试的需求和一些有用的调试插件, 这里强烈推荐Firebug, 看网页结构那叫一个爽.

最后, 那天看到一个很搞的命令: vrms. 为什么说它搞呢? 先看看这个缩写的全称吧: Virtual Richard M. Stallman. 那这个命令是用来干什么的呢? 号称可以找出你电脑上所有的非自由 (non-free) 软件, 晒下我的结果, ORZ... 内核也算?
                Non-free packages installed on LAN

fglrx-amdcccle Catalyst Control Center for the ATI graphics accelerat
fglrx-kernel-source Kernel module source for the ATI graphics accelerators
fglrx-modaliases Identifiers supported by the ATI graphics driver
human-icon-theme Human Icon theme
linux-generic Complete Generic Linux kernel
linux-restricted-modules- Non-free Linux 2.6.27 modules helper script
linux-restricted-modules- Restricted Linux modules for generic kernels
nvidia-173-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-177-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-71-modaliases Modaliases for the NVIDIA binary X.Org driver
nvidia-96-modaliases Modaliases for the NVIDIA binary X.Org driver
rar Archiver for .rar files
tangerine-icon-theme Tangerine Icon theme
tango-icon-theme Tango Icon theme
Reason: Creative Commons Attribution-ShareAlike 2.5 License
xorg-driver-fglrx Video driver for the ATI graphics accelerators

Contrib packages installed on LAN

msttcorefonts Installer for Microsoft TrueType core fonts
nvidia-common Find obsolete NVIDIA drivers

15 non-free packages, 0.9% of 1628 installed packages.
2 contrib packages, 0.1% of 1628 installed packages.

Saturday, March 21, 2009

关于JS的跨域访问

上周在写一个小工具, 简易的字典翻译功能. 由于用的是其它网站的字典数据, 所以最大的技术细节就是跨域访问了. 什么是跨域访问? 说白了就是访问非本地服务器上的内容. 比如我想通过我这台服务器上的网页来查看其它网站的内容就属于这种情况. 这种行为在JS中是严厉禁止的, 被叫做"The Same-Origin Policy"

当然, 网上也流传着很多破解这条规定的方法. 有通过在server上配置"代理"的, 有调整Apache配置的, 还有通过<iframe><script>标签来迂回的. 对于第二种, 通用性不高, 要是遇到非Apache服务器就没辙了. 第三种, 恕我才疏学浅, 看了几篇文章都没搞明白到底该怎么弄. 第一种倒是在几篇文章的帮助下成功了, 遂记之.

首先讲下原理, 由于JS被禁止直接访问, 所以我们就采用迂回战术, 通过服务器上另一个页面作为中转, 再传递给JS处理, 这个和平时使用的通过代理服务器来中转, 以便查看一些被墙的网页是一个道理.

我用的是PHP页面来作为中转, 这个页面的功能是把目标网页的源代码传送回来. 代码是用的这个网站的, 里面也介绍了上面的另外两种方法, 有兴趣的同学可以去看看.
$ cat proxy.php
<?php
$url = $_GET['path'];
$session = curl_init($url);

// Don't return HTTP headers. Do return the contents of the call.
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// Make the call.
$html = curl_exec($session);

// The web service returns HTML.
header("Content-Type: text/html; charset=gbk");

echo $html;
curl_close($session);
?>
需要注意的是, 这段代码要求server的PHP具有cURL模块的支持. 非常不爽的一点就是, Win下PHP只需要改下配置文件就可以使用cURL了, 而Linux下则必须重新编译一次PHP才行. 你需要先下载cURL, 然后是常规的编译安装三部曲, 具体的编译参数可以参照./configure --help自行调整:
$ ./configure --enable-http --enable-file
$ make
$ sudo make install
接着是编译PHP, 在编译参数里面添加两个参数:
$ ./configure --with-curl=/usr/local --with-curlwrappers
/usr/local是默认安装地址, 如果你没有改的话. 最后修改PHP的配置文件, 添加:
extension=curl.so
这样上面那段PHP代码就能正常执行了.

有了上面PHP的支持, 剩下的操作就易如反掌了, 和本地就没什么区别了, 想怎么弄就怎么弄, 嘿嘿~ 思路上很大程度上是受了这篇文章的影响, 虽然最后没有用上文中介绍的JSON, 但还是发现JSON是个很好很强大的东西. 下面的JS代码示例中用了jQuery中的API作为AJAX的简化操作, 这也是我第一次用jQuery, 发现这个也挺爽的, 包装了很多有用的功能, 也算偷了下懒. 示例代码部分:
$.get(
       "proxy.php",
       { path: "http://www.google.com/" },
       function(data)
       {
         // Do something on data...
       },
       "html"
     );
余下的就看你的需求了, end.