浏览模式: 标准 | 列表分类:技术(藏)

一些被忽视的 PHP 函数(整理)

真的是不用不知道,其实我们熟悉的 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

MongoDB 简单研究

MongoDB是一个可扩展、高性能的下一代数据库。MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系。文档可能由以下几 部分组成:独立的基本类型属性、“内嵌文档”或文档数组。
这样的灵活性让开发者能以一种易于管理且灵活的方式来对大量的问题进行建模,不必将数据打散到不同的数据表中。在数据不宜被构造成单独文档的情况 下,MongoDB有“DBRef”的概念,这是从文档的一个属性指向另一个文档的指针。
从MongoDB数据库中获取和查询数据是十分灵活的——可以基于主文档、文档中的任意属性、任意内嵌文档、数组中的任意文档来动态地查询文档。可以通过 “点”符号来访问内嵌文档。

» 阅读全文

Tags: mongodb, nosql

Gearman分布式远程过程处理框架简单研究

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

ubuntu+nginx+php+mysql+sphinx安装

接到任务要对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脚本检索索引,需要:

  1. 运行守护进程searchd,PHP脚本需要连接到searchd上进行检索

cd /usr/local/sphinx/etc
/usr/local/sphinx/bin/searchd

  1. 运行PHP API 附带的test 脚本(运行之前请确认searchd守护进程已启动):

cd sphinx/api
php test.php test

  1. 将API文件(位于api/sphinxapi.php) 包含进自己的脚本,开始编程

至此基本的安装和简单测试完成,有待进一步测试研究

Tags: ubuntu, nginx, php, mysql, sphinx

MySQL性能优化的最佳20+条经验

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。

» 阅读全文

Tags: mysql, 性能

如何逃离垃圾客户(下)

故事三:朋友介绍的好机会

C:高级程序员,5年代码工作经验。在职,工作清闲,偶尔接点私活。

外地人,在北京漂着,8K月薪税前,偶尔需要加班,有个职业普通的女朋友,买房甭想,打车掂量掂量。宅男,回家了就看看资料看看美剧,长时间持续的代码工作,视力一天不如一天,脖子和腰也经常不舒服。

C经常想,不知道有多少程序员过着像这样的生活,不好不坏,无力改变,也没有理由去改变。

好在他性格温和,人缘很好,经常会有朋友介绍一些私活给他,除了挣点钱,对生活也是一种填充。

C一个挺铁的哥们跳槽到一家传统行业的公司,公司需要开设电子商务的业务,就找到了C帮忙搭个系统,费用也不低,C欣然承应。

客户公司不大,对互联网有一定了解,由市场部门和C沟通接洽。 他们并没有太明确的想法,希望和现行跑的大部分网店差不多就行。C就用开源系统搭个一个,按照客户的要求建了分类,录入了一些测试数据。

» 阅读全文

Tags: 客户

如何逃离垃圾客户(上)

做项目做产品可以有3个境界:1 挣钱的,2 做品牌的,3 很酷的。有的人从境界1做到3,有得人从3做到1。

我是从1做到3,因为有了钱,你才能远离垃圾项目和不专业的客户。

无论你是单打独斗兼职之余接个小项目,还是已经成立了公司签合同盖大红章接外包项目,初期阶段都遇到过垃圾项目和垃圾客户。你有可能拿到了搭上了无数个不眠之夜,只获得了少的可怜的报酬,受了一肚子气还不落好,客户正和你在心里互相怒骂。也有可能一分钱都没拿到,受骗感和屈辱感正驱使你要去百度贴吧上声讨那个客户公司。更有可能把你的一帮弟兄们一块拉进了一个大坑,你人生中最重要的资源之一正在廉价地流失。

垃圾项目是一个必经阶段:

  • 考验你团队是否能同甘共苦肝胆相照
  • 磨练你的耐心和自我控制力;
  • 让你学习代码规范、架构规划、分工设计、进度设计、质量控制等预防规避机制;
  • 帮助你健全任务计划、进度反馈、测试文档、邮件、合同、备忘录等重要文档规范

下一步你要做的就是一看见垃圾项目和垃圾客户,就跑得越远越好!!

下面我来讲一些可能大家都经历过的故事:

» 阅读全文

Tags: 客户

收集的小tools

Tags: 工具, tools

Records:301234