Submitted by 夜雨飘零 on 2010, July 31, 11:54 PM
真的是不用不知道,其实我们熟悉的 PHP 还有很多好东西没有发掘。看到这篇文章 ,当时就泪奔了好几回,重点推荐下,顺便我自己也做个整理。
sys_getloadavg()
这个函数 返回当前系统的负载均值信息 (当然 Windows 下不适用),详细文档可以翻阅 PHP 的相关文档。文档中有段示例代码,基本上也就能看出它的用途了。
<?php
$load = sys_getloadavg();
if ($load[0] > 80) {
header('HTTP/1.1 503 Too busy, try again later');
die('Server too busy. Please try again later.');
}
PS,如果“很不幸”得你的 PHP 环境中没有这个函数,可以考虑使用下面这段代码 via
if (!function_exists('sys_getloadavg')) {
function sys_getloadavg()
{
$loadavg_file = '/proc/loadavg';
if (file_exists($loadavg_file)) {
return explode(chr(32),file_get_contents($loadavg_file));
}
return array(0,0,0);
}
}
这一特性如果使用得当,能减轻服务器部分压力。
pack()
pack 对应的还有个函数为 unpack ,用于压缩二进制串,文中的作者的示例非常清楚
$pass_hash = pack("H*", md5("my-password"));
如果你使用 PHP5,那么可以直接这样子
$pass_hash = md5("my-password", true); // PHP 5+
这样做的好处之一是能减少串存储空间(能节省多少呢?可能又会是另篇文章了)。
这里还有个示例代码可以 pack 数组 via
<?php
function pack_array($v,$a) {
return call_user_func_array(pack,array_merge(array($v),(array)$a));
}
cal_days_in_month()
该函数 可以直接返回指定月份中的天数,例如
$days = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y")); // 31
我敢保证,你自己实现过类似功能的函数 :^)
_()
呃,这的确也是个 PHP 函数 (也有可能是最短的 PHP 内置函数)。_() 是它的“小名”,它的大名是 gettext() 。
写过 Wordpress 皮肤的朋友会了解 __() 以及 _e() 这些函数,其实 PHP 早已经自带了相关的功能。
// Set language to German
setlocale(LC_ALL, 'de_DE');
// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");
// Choose domain
textdomain("myPHPApp");
echo _("Have a nice day");
利用 gettext 可以编写多语言的应用,现在您感兴趣的可能就是如何编写 locale 文件,这但已经不是此文涉及的重点,更多信息可以移步到这里 。
get_browser()
坦白讲,见到这个函数 我当时就彻底泪奔。有了这个函数,再也不用自己去分析 $_SERVER['HTTP_USER_AGENT'] 这个字符串了。
更多的信息可以参考这里。在使用此函数前,你可能需要个 browscap.ini 配置文件 ,相信你可以搞定的。
debug_print_backtrace()
以前查看函数调用堆栈,我会使用 xdebug 等的扩展,其实 PHP5 版本以后已经内置了相关的函数 。
顺便再分享个“蛋疼”的小技巧 ,如果你记不住这个函数的名字,可以用这段代码同样能达到目的(看起来还是记住那个函数靠谱):
<?php
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
natsort()
这个函数用于自然排序 ,这个大家可能都要用到。贴下相关的文档链接以及示例代码
$items = array("100 apples", "5 apples", "110 apples", "55 apples");
// normal sorting:
sort($items);
print_r($items);
# Outputs:
# Array
# (
# [0] => 100 apples
# [1] => 110 apples
# [2] => 5 apples
# [3] => 55 apples
# )
natsort($items);
print_r($items);
# Outputs:
# Array
# (
# [2] => 5 apples
# [3] => 55 apples
# [0] => 100 apples
# [1] => 110 apples
# )
有关自然排序的算法规则,可以参考这里的文档 。
glob()
这个函数的功能 同样让人感到泪奔,先不说功能直接上示例代码
foreach (glob("*.php") as $file) {
echo "$file\n";
}
相比你已经了解该函数的用途了,那么我们就可以有更多的“玩法”,例如就显示目录(via ):
$dirs = array_filter(glob($path.'*'), 'is_dir');
当然,文件递归你也可以考虑使用下 SPL 扩展 。
补充 by 神仙 :
glob 有个参数选项 GLOB_ONLYDIR 就可以只列目录
PHP Filter
如果你还在正则验证字符串,那么就真的“Out”了。自 PHP5.2 版本以后,内置了 PHP Fliter 模块 用于专门验证 电子邮件、URL 等是否合法,示例代码:
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
由于是新生的模块,因此还有很多的陷阱,例如
filter_var('abc', FILTER_VALIDATE_BOOLEAN); // bool(false)
filter_var('0', FILTER_VALIDATE_BOOLEAN); // bool(false)
但这不影响我们去尝试。有关 PHP Filter 的更多信息,相信能拎出来另外写篇文章了。
-- Split --
最后,感叹 PHP 其实是个历久弥新的工具,不小心我们就会悲剧性得重复造了只轮子。因此,时常看看 PHP 文档每次都会有新的收获。
原文:http://www.gracecode.com/archives/3013/
Tags : php
技术(藏) | 评论 :0
| 阅读 :3
Submitted by 夜雨飘零 on 2010, July 31, 8:52 AM
The duct tape programmer “胶带型”程序员
代码不漂亮,但是管他呢,能用就行!
这类型的人是你公司的基石。 当什么事情搞砸时,他会很快的修正,以后也不用怎么操心了。当然关心代码是否好看,好用,或其相关的方面做得漂亮,他就是能搞定,不需要唧唧歪歪的废话。用这样的兄弟你只需要指出问题然后闪人就好了。
The OCD perfectionist programmer “完美主义型”程序员
我的代码已经很完美了,还需要做什么?
这一类型基本不关心你的项目截止日期和预算,和编程的艺术相比这些玩意算什么。当你终于收到他们完成的作品时,你会折服其代码的完美格式,哦不,是漂亮得无可挑剔的精美代码,你能做的只是赞服,这就是大师的手笔。他是唯一那个有资格改动他自己代码的人。
The antiprogramming programmer “反编程型”程序员
我是程序员,我TMD的不写代码。
他的世界只有一条准则写代码太傻了。如果需要自己动手写东西的话,这事情就不对啦。别人早都做过这些工作了,拿来用就好了么。他会告诉你这样的拿来主义是最快的,尽管他老人家用的时间和其他人一样多,哦,或者还要长。最后当你拿到他干的活儿时,里面可能就20行实际代码,简单易读。这样的方式不一定快,那么有效,或着向前兼容,但是他至少用最少的代价完成了项目。
The halfassed programmer “半桶水型”程序员
你还想要什么? 程序能跑了不是?
这个家伙不太关心程序质量,那是其他人的工作。他只是迅速地完成交给他的任务。你可能不太喜欢他干的活儿,其他的程序员甚至鄙视他,但是老板和客户喜欢就行了。未来他可能会让你头疼,但他的确独立地在档期内干完了工作,你没办法鄙视他(虽然你真的很想)。
The theoretical programmer “理论家型”程序员
恩,那是个可能性,不过是不是实际上这样做会更好呢?
这个兄弟着迷于探寻各种方法大于脚踏实地干活。他老人家80%的时间是在空洞的盯着电脑,想着应该如何干完一件事情,15%的时间是在抱怨截止期限是多么的不合理,5%的时间是在修正他选择的干活方式,最后1%的时间才是在写代码。当你终于拿到他的作品时,总是会听到他的评语“如果给我多点时间我会干得更漂亮的”。
Tags : 程序员
网络(集) | 评论 :0
| 阅读 :15
Submitted by 夜雨飘零 on 2010, July 16, 7:26 PM
Android中文资讯网是一个专注于提供Android相关资讯和应用的网站!
提供内容包括:Android最新资讯、Android软件下载、Android游戏下载、Android开发教程、Android刷机教程、Android ROM下载……
网址 http://www.x25.cn
Tags : android
个人(创) | 评论 :0
| 阅读 :59
Submitted by 夜雨飘零 on 2010, June 8, 3:57 PM
MongoDB是一个可扩展、高性能的下一代数据库。MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系。文档可能由以下几 部分组成:独立的基本类型属性、“内嵌文档”或文档数组。
这样的灵活性让开发者能以一种易于管理且灵活的方式来对大量的问题进行建模,不必将数据打散到不同的数据表中。在数据不宜被构造成单独文档的情况 下,MongoDB有“DBRef”的概念,这是从文档的一个属性指向另一个文档的指针。
从MongoDB数据库中获取和查询数据是十分灵活的——可以基于主文档、文档中的任意属性、任意内嵌文档、数组中的任意文档来动态地查询文档。可以通过 “点”符号来访问内嵌文档。
» 阅读全文
Tags : mongodb , nosql
技术(藏) | 评论 :0
| 阅读 :461
Submitted by 夜雨飘零 on 2010, June 8, 3:41 PM
Gearman 系统用来把工作委派给其他机器,分布式的调用更适合做某项工作的机器,并发的做某项工作,在多个调用间做负载均衡,或用来在调用其它语言的函数。
通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
通过 gearman 你可以实现并行的工作,负载均衡处理,调用其他语言的函数。它可以应用在多种场合,从高可用性的 web 服务到数据库复制,换句话说,它是分布式处理的中枢神经。
» 阅读全文
Tags : gearman
技术(藏) | 评论 :0
| 阅读 :275
Submitted by 夜雨飘零 on 2010, May 28, 1:35 PM
接到任务要对sphinx进行研究,所以在虚拟机上装了个ubutu折腾安装环境,记录如下
安装g++编译环境
apt-get install g++ gcc
安装python开发组件 非必要 视情况选择安装
apt-get install python python-dev
安装PHP运行及相关扩展
apt-get install php5 php5-dev php5-pear php5-cgi php5-mysql php5-curl php5-gd php5 php5-mcrypt php5-memcache
安装mysql 及开发库
apt-get install mysql-server mysql-client
apt-get install libmysqlclient15-dev
安装nginx 最新版需要通过下载源码编译安装
apt-get install nginx
安装成功后,启动nginx 输入如下命令:
sudo /etc/init.d/nginx start
可以看到nginx已经启动成功。
Starting nginx: nginx.
spawn-fcgi.c.197: child spawned successfully: PID: 9772
打开浏览器,输入127.0.0.1,可以看到nginx的欢迎欢迎画面,显示
Welcome to nginx!
安装spawn-fcgi
运行sudo apt-get install spawn-fcgi
配置Nginx和spawn-fcgi配合运行
(1).在/etc/nginx/fastcgi_params 文件最后,加入一行
sudo gedit /etc/nginx/fastcgi_params打开文件
加入此行:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
(2).另外需要在PHP-CGI的配置文件(Ubuntu 上此配置文件位于/etc/php5/cgi/php.ini)中,找到cgi.fix_pathinfo选项,修改为:cgi.fix_pathinfo=1; (这个参数好像有问题,最近很火的那个漏洞)
这样php-cgi方能正常使用SCRIPT_FILENAME这个变量。
(3).打开/etc/nginx/sites-available/default文件
在
server {
listen 80;
server_name localhost;
下面添加
root /var/www/nginx-default
即root和server_name同级
这段即相当于apache的默认目录 如果没有这个的话,容易在执行php 文件的时候,会提示”No input file specified”。
然后修改
#location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
#fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#includefastcgi_params;
#}
修改成
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name; include /etc/nginx/fastcgi_params; #fastcgi的参数文件地址
}
重启nginx和php-cgi 的命令
nginx: sudo /etc/init.d/nginx restart 同样也可以有start,stop等参数
php-cgi: 先杀死进程
sudo killall -HUP php5-cgi
再启动
sudo /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u yeyupl -g yeyupl -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
参数含义如下
-f 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置
-a 绑定到地址addr
-p 绑定到端口port
-s 绑定到unix socket的路径path
-C 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P
指定产生的进程的PID文件路径
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行
安装sphinx 通过下载最新版源码编译安装
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
tar zxvf sphinx-0.9.9.tar.gz
cd sphinx-0.9.9
./configure --prefix=/usr/local/sphinx --with-mysql
make && make install
创建配置文件
cd /usr/local/sphinx/etc
sudo cp sphinx.conf.dist sphinx.conf
sudo gedit sphinx.conf
修改配置里相应的数据库连接信息
在示例配置文件中,将试图对MySQL数据库test中的documents 表建立索引;
因此在这里还提供了example.sql 用于给测试表增加数据用于测试:
mysql -u yeyupl< /usr/local/sphinx/etc/example.sql
运行indexer 创建全文索引:
cd /usr/local/sphinx/etc
/usr/local/sphinx/bin/indexer
检索新创建的索引
可以使用search实用程序可以从命令行对索引进行检索:
cd /usr/local/sphinx/etc
/usr/local/sphinx/bin/search test
如果要从PHP脚本检索索引,需要:
运行守护进程searchd,PHP脚本需要连接到searchd上进行检索
cd /usr/local/sphinx/etc
/usr/local/sphinx/bin/searchd
运行PHP API 附带的test 脚本(运行之前请确认searchd守护进程已启动):
cd sphinx/api
php test.php test
将API文件(位于api/sphinxapi.php) 包含进自己的脚本,开始编程
至此基本的安装和简单测试完成,有待进一步测试研究
Tags : ubuntu , nginx , php , mysql , sphinx
技术(藏) | 评论 :0
| 阅读 :517
Submitted by 夜雨飘零 on 2010, May 7, 12:05 PM
发现自己的blog没什么内涵,没有什么技术含量,都是牢骚多,
呃,也许性格问题吧,技术方面的东西没有心情去写,没事唠叨几句就好了,这才是生活原态
从小开始自己在文科方面就是比理科方面好
阅过没万卷书也有千本了,小学三年级开始看大部头的《西游记》、《薛刚反唐》,六年级因为上课看《薛丁山征西》被没收,拿回书的条件是期末考试前三名,结果当然是拿回来了,那时的成绩还是数一数二的。初中开始迷恋各种武侠小说,和历史小说,图书馆里的这类书基本被我看过了。我应该也是当时学校里唯一用完两本借书证的人。上高中后图书馆书多了不少,我应该也还是班上唯一用了两本借书证的人,武侠小说、历史小说,传记,外国名著等都看过不少,印象比较深的 自然是《史记》、《呼啸山庄》、《金庸全集》等等了。不过从高二第二学期开始因为要应付高考了,决定封书,自此之后至今都不再喜看书了,除了大学还经常借技术类书看外,其他的书基本与我绝缘了,不知道是好事还是坏事,如今想再看书都没什么时间和心情了。
一直觉得自己比较属于多愁善感的人,颇有几分文人气质
记得当初写作文喜欢标新立异,写过诗,作过赋,更用文言文写过不少,有篇作文用小说体写了十多页……
高考时因为理科选择专业有优势,更对电脑之类感兴趣,且认为做技术比较靠谱,所以选了物理
高考时语文是分数最高的,物理是最低的,既是情理之中,亦是意料之外
不过话说回来,虽有文人的闷骚,却没有文人的文采,是为一耻也
blog者,记录生活之用也,非标榜立碑之所
懂我了解我的人,自然能从我的牢骚之言中体会我的生活,
无关人士,一笑而过即可
比较喜欢微博的快餐式记录,想关注我的可以收听我的腾讯微博:
» 阅读全文
个人(创) | 评论 :1
| 阅读 :632
Submitted by 夜雨飘零 on 2010, April 28, 10:48 PM
是要追求短期的收益还是长远的发展呢?
这是个问题,而且是个比较难抉择的问题
只能说一开始就站错了队
如今想退出的时候就不是那么容易了
放弃已得是件让人纠心的事
选择一个新的队伍也未必是对的队伍
然而继续守着也许也就这个样子了
很多东西真的不是努力就可以改变的
出路依旧是那么的模糊
愿圣光与你同在~
大地母亲在忽悠着你~
个人(创) | 评论 :0
| 阅读 :352