找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 技术 查看内容

PHP最佳实践(译)

2013-06-04 09:19    收藏: 4 分享: 1    

define() vs. const

使用define(),除非考虑到可读性、类常量、或关注微优化

习惯上,在PHP中是使用define()函数来定义常量。但从某个时候开始,PHP中也能够使用const 关键字来声明常量了。那么当定义常量时,该使用哪种方式呢?

答案在于这两种方法之间的区别。

  1. define()在执行期定义常量,而const在编译期定义常量。这样const就有轻微的速度优势, 但不值得考虑这个问题,除非你在构建大规模的软件。
  2. define()将常量放入全局作用域,虽然你可以在常量名中包含命名空间。这意味着你不能 使用define()定义类常量。
  3. define()允许你在常量名和常量值中使用表达式,而const则都不允许。这使得define() 更加灵活。
  4. define()可以在if()代码块中调用,但const不行。

示例

因为define()更加灵活,你应该使用它以避免一些令人头疼的事情,除非你明确地需要类 常量。使用const通常会产生更加可读的代码,但是以牺牲灵活性为代价的。

无论你选择哪一种,请保持一致。

进一步阅读

缓存PHP opcode

使用APC

在一个标准的PHP环境中,每次访问PHP脚本时,脚本都会被编译然后执行。一次又一次地花费 时间编译相同的脚本对于大型站点会造成性能问题。

解决方案是采用一个opcode缓存。opcode缓存是一个能够记下每个脚本经过编译的版本,这样 服务器就不需要浪费时间一次又一次地编译了。通常这些opcode缓存系统也能智能地检测到 一个脚本是否发生改变,因此当你升级PHP源码时,并不需要手动清空缓存。

有几个PHP opcode缓存可用,其中值得关注的有eaccelerator, xcache,以及APC。 APC是PHP项目官方支持的,最为活跃,也最容易安装。它也提供一个可选的类memcached 的持久化键-值对存储,因此你应使用它。

安装APC

在Ubuntu 12.04上你可以通过在终端中执行以下命令来安装APC:

user@localhost: sudo apt-get install php-apc

除此之外,不需要进一步的配置。

将APC作为一个持久化键-值存储系统来使用

APC也提供了对于你的脚本透明的类似于memcached的功能。与使用memcached相比一个大的优势是 APC是集成到PHP核心的,因此你不需要在服务器上维护另一个运行的部件,并且PHP开发者在APC 上的工作很活跃。但从另一方面来说,APC并不是一个分布式缓存,如果你需要这个特性,你就 必须使用memcached了。

示例

陷阱

  • 如果你使用的不是PHP-FPM(例如你在 使用mod_php 或mod_fastcgi),那么 每个PHP进程都会有自己独有的APC实例,包括键-值存储。若你不注意,这可能会在你的应用 代码中造成同步问题。

进一步阅读

PHP与Memcached

若你需要一个分布式缓存,那就使用Memcached客户端库。否则,使用APC。

缓存系统通常能够提升应用的性能。Memcached是一个受欢迎的选择,它能配合许多语言使用, 包括PHP。

然而,从一个PHP脚本中访问一个Memcached服务器,你有两个不同且命名很愚蠢的客户端库选择项:MemcacheMemcached。 它们是两个名字几乎相同的不同库,两者都可用于访问一个Memcached实例。

事实证明,Memcached库对于Memcached协议的实现最好,包含了一些Mmecache库没有的有用的特性, 并且看起来Memcached库的开发也最为活跃。

然而,如果不需要访问来自一组分布式服务器的一个Memcached实例,那就使用APC。 APC得到PHP项目的支持,具备很多和Memcached相同的功能,并且能够用作opcode缓存,这能提高PHP脚本的性能。

安装Memcached客户端库

在安装Memcached服务器之后,需要安装Memcached客户端库。没有该库,PHP脚本就没法与 Memcached服务器通信。

在Ubuntu 12.04上,你可以使用如下命令来安装Memcached客户端库:

user@localhost: sudo apt-get install php5-memcached

使用APC作为替代

查看opcode缓存一节阅读更多与使用APC作为 Memcached替代方案相关的信息。

进一步阅读

PHP与正则表达式

使用PCRE(preg_*)家族函数

PHP有两种使用不同的方式来使用正则表达式:PCRE(Perl兼容表示法,preg_*)函数 和POSIX(POSIX扩展表示法,ereg_*) 函数。

每个函数家族各自使用一种风格稍微不同的正则表达式。幸运的是,POSIX家族函数从PHP 5.3.0开始就被弃用了。因此,你绝不应该使用POSIX家族函数编写新的代码。始终使用 PRCE家族函数,即preg_*函数。

进一步阅读

配置Web服务器提供PHP服务

使用PHP-FPM

有多种方式来配置一个web服务器以提供PHP服务。传统(并且糟糕的)的方式是使用Apache的 mod_php。Mod_php将PHP 绑定到Apache自身,但是Apache对于该模块功能的管理工作非常糟糕。一旦遇到较大的流量, 就会遭受严重的内存问题。

后来两个新的可选项很快流行起来:mod_fastcgi 和mod_fcgid。两者均保持一定数量的PHP执行进程, Apache将请求发送到这些端口来处理PHP的执行。由于这些库限制了存活的PHP进程的数量, 从而大大减少了内存使用而没有影响性能。

一些聪明的人创建一个fastcgi的实现,专门为真正与PHP工作良好而设计,他们称之为 PHP-FPM。PHP 5.3.0之前,为安装它, 你得跨越许多障碍,但幸运的是,PHP 5.3.3的核心包含了PHP-FPM,因此在Ubuntu 12.04上安装它非常方便。

如下示例是针对Apache 2.2.22的,但PHP-FPM也能用于其他web服务器如Nginx。

安装PHP-FPM和Apache

在Ubuntu 12.04上你可以使用如下命令安装PHP-FPM和Apache:

user@localhost: sudo apt-get install apache2-mpm-worker
libapache2-mod-fastcgi php5-fpm
user@localhost: sudo a2enmod actions alias fastcgi

注意我们必须使用apache2-mpm-worker,而不是apache2-mpm-prefork或apache2-mpm-threaded。

接下来配置Aapache虚拟主机将PHP请求路由到PHP-FPM进程。将如下配置语句放入Apache 配置文件(在Ubuntu 12.04上默认配置文件是/etc/apache2/sites-available/default)。

    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -idle-timeout 120 -pass-header Authorization

 最后,重启Apache和FPM进程:

user@localhost: sudo service apache2 restart && sudo service php5-fpm
restart

进一步阅读

发送邮件

使用PHPMailer

经PHPMailer 5.1测试

PHP提供了一个mail()函数,看起来很简单易用。 不幸的是,与PHP中的很多东西一样,它的简单性是个幻象,因其虚假的表面使用它会导致 严重的安全问题。

Email是一组网络协议,比PHP的历史还曲折。完全可以说发送邮件中的陷阱与PHP的mail() 函数一样多,这个可能会令你有点“不寒而栗”吧。

PHPMailer是一个流行而 成熟的开源库,为安全地发送邮件提供一个易用的接口。它关注可能陷阱,这样你可以专注 于更重要的事情。

示例

Sender = 'bbaggins@example.com';
$mailer->AddReplyTo('bbaggins@example.com', 'Bilbo Baggins');
$mailer->SetFrom('bbaggins@example.com', 'Bilbo Baggins');
$mailer->AddAddress('gandalf@example.com');
$mailer->Subject = 'The finest weed in the South Farthing';
$mailer->MsgHTML('

You really must try it, Gandalf!

-Bilbo

');
 
// Set up our connection information.
$mailer->IsSMTP();
$mailer->SMTPAuth = true;
$mailer->SMTPSecure = 'ssl';
$mailer->Port = 465;
$mailer->Host = 'my smpt host';
$mailer->Username = 'my smtp username';
$mailer->Password = 'my smtp password';
 
// All done!
$mailer->Send();
?>

验证邮件地址

使用filter_var()函数

Web应用可能需要做的一件常见任务是检测用户是否输入了一个有效的邮件地址。毫无疑问 你可以在网上找到一些声称可以解决该问题的复杂的正则表达式,但是最简单的方法是使用 PHP的内建filter_val()函数。

示例

进一步阅读

查看其它分页:

最新评论

我也要发表评论

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。