Ubuntu上搭建PHP+Mysql+Nginx环境(apt-get方式)

 更新时间:2016年11月25日 15:29  点击:1719

Ubuntu上搭建PHP+Mysql+Nginx环境(apt-get方式)

ubuntu版本:Ubuntu 10.04 LTS

1、首先使用apt-get下载Nginx,php教程,mysql教程,phpmyadmin,spawn-fcgi。

sudo apt-get install nginx php5-cgi php5-cli mysql-server-5.1 phpmyadmin  spawn-fcgi

期间可能要输入mysql的密码,按照提示一步一步安装就是了。

OK后,你在Firefox中访问http://127.0.0.1/或者http://localhost/应该就能看见Nginx的欢迎界面了。

2、此时Nginx并不能跑PHP程序。需要修改一些配置文件。

$ cd /etc/nginx

$ sudo vim fastcgi_params,修改如下(红色部分):

fastcgi_ignore_client_abort  on;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_FILENAME      $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

修改Nginx 配置文件nginx.conf

sudo vim nginx.conf,最后如下:

user codebean codebean;  #用户和用户组
worker_processes  2;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;

    access_log    /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6].(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

3、接下来我们来配置一个默认站点:

cd /etc/nginx/sites-available

sudo vim default

修改后如下:

server {
    listen   80 default;  #default表示是默认站点
    server_name  localhost;   #访问的名称
    root   /var/www/nginx-default; #网站根目录

    access_log  /var/log/nginx/localhost.access.log;

    location / {       
        index  index.php index.html index.htm;
    }

    location ~ .php$ {
        include fastcgi_params;  #这个很重要
    }

}

接下来你在目录/var/www/nginx-default新建一个index.php,输入:

phpinfo();然后重启nginx服务和开启fastcgi:

$ sudo /etc/init.d/nginx restart
$ /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 /usr/bin/php-cgi

再访问http://127.0.0.1/或者http://localhost/看看

 

下载的apache要记得下OPENSSL的
httpd-2.2.19-win32-x86-openssl-0.9.8r.msi
下载的PHP记得下线程安全的,这样才便于搭建http服务
php教程-5.2.17-Win32-VC6-x86.msi
下面就是转载的了
 
此文章的安装方法适用于Windows XP下的Apache+PHP+MySQL安装,同时也适用于Windows 2003系统下的安装和配置。
1. 安装环境
操作系统是 Windows XP 中文版, Apache, PHP, MySQL 的最新版本是截止到 2007.09.07,分别在其官网下载的:
* Apache 2.2.6:http://apache.mirror.111cn.net/httpd/binaries/win32/
* PHP 5.2.4 (Windows Binaries PHP 5.2.4 zip package): http://www.php.net/downloads.php
* MySQL 5.0.45 Windonws: http://dev.mysql教程.com/downloads/
2. 安装的目录结构规划
为了方便维护,可以将服务器软件安装在系统盘(C盘)而把自己的文件定位到其他盘,这样对于以后的维护很重要。
3. 在 Windows XP 下安装 Apache 2.2.6
Windows XP 下的安装
1. 运行 apache 2.2.6 的安装程序,根据提示一路 Next 即可。在 Server Information 的 Network Domain、Server Name 字段随便填上一个域名即可,如php.com,然后根据提示一路 Next 完成即可。
2. 在安装结束时,会弹出一个 DOS 窗口,然后就消失了,这是系统apache自动启动了。
4. 在 Windows XP 下安装 php 5.2.4
1. 将下载的 php 5 ZIP 包直接解压,我直接将 PHP 5.2.4 zip 文件解压到 d:php 目录下面。安装 php 不建议使用 win32 安装程序(主要是以后安装扩展麻烦)。
2. 在资源管理器中进入 php 的安装目录,将 php.ini-dist 或 php.ini-recommended 复制一份,命名为 php.ini。然后打开 php.ini。
3. 找到:
;extension=php_mysql.dll
将前面的 ; 号去掉, 改成:
extension=php_mysql.dll
4. 找到:
extension_dir = “./”
将其改为你的 php 安装目录下 ext 子目录的绝对路径。例如我的:
extension_dir = “D:/php/ext/”
这步很重要 。否则接下来 php 会找不到 php_mysql.dll 模块,无法装载。
5. 在“控制面板”->“系统”->“高级”->“环境变量”,在“系统变量”里面找到path,编辑path的变量值,添加你的php目录D:php,前面一定要用分号(;)把它和前面的值分开。 
5. 配置 Apache 和 PHP
打开 Apache 安装目录下的 conf 子目录中的 httpd.conf 文件。
1. 找到:
DocumentRoot “xxxxxxx”
改成你本机的网站内容的目录。例如我的:
DocumentRoot “E:/web”
改完之后往下稍微拉动一下,找到“# This should be changed to whatever you set DocumentRoot to.”,然后把下面这个地方也改过来
<Directory “E:/web”>
2. 找到 LoadModule,根据你的 php 安装目录,在下面空白处加上这两行:
LoadModule php5_module “D:/PHP/php5apache2_2.dll”
PHPIniDir “D:/PHP”这个不要了,免得apache服务器启动不起
3. 找到:
DirectoryIndex index.html
修改为:
DirectoryIndex index.php index.html
4. 找到:
AddType application/x-gzip .gz .tgz
添加这两行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html
5. 保存 httpd.conf
6. 在你的网站目录中(例如我的是 E:/Web/),手工建立一个 index.php 的文件,内容:
<?php
phpinfo();
?>
7. 在 dos 窗口中启动 apache 服务(假设Apache安装在了C:Program FilesApache Software FoundationApache2.2)
#如果之前启动了,先将其 stop
C:Program FilesApache Software FoundationApache2.2bin> httpd -k stop
或者是:net stop apache2.2
#启动 apahce 服务
C:Program FilesApache Software FoundationApache2.2bin> httpd -k start
或者是:net start apache2.2
8. 打开 http://localhost/index.php,即可看到测试输出结果。
6. Windows XP 下安装 MySQL 5.0.45
MySQL 的安装比较简单,它提供了一个 win32 的安装包。下载后根据提示一路安装,也可以在安装类型处选 Custom,指定安装目录,这里直接默认安装在了C盘。
安装完成后,会问你要不要到官网注册,跳过即可。然后会问你是否 Configure the MySQL Server now,选中并继续,然后根据提示,设定 字符集,以及 root 管理员的密码即可。

之前我曾经写过一篇名为《PHP 实现多服务器共享 SESSION 数据》文章,文中的 SESSION 是使用数据库教程保存的,在并发访问量大的时候,服务器的负载会很大,经常会超出 MySQL 最大连接数,利用 memcached,我们可以很好地解决这个问题,工作原理如下:

用户访问网页时,查看 memcached 中是否有当前用户的 SESSION 数据,使用 session_id() 作为唯一标识符;如果数据存在,则直接返回,如果不存在,再进行数据库连接,获取 SESSION 数据,并将此数据保存到 memcached 中,供下次使用;
当前的 PHP 运行结束(或使用了 session_write_close())时,会调用 My_Sess::write() 方法,将数据写入数据库,这样的话,每次仍然会有数据库操作,对于这个方法,也需要进行优化。使用一个全局变量,记录用户进入页面时的 SESSION 数据,然后在 write() 方法内比较此数据与想要写入的 SESSION 数据是否相同,不同才进行数据库连接、写入数据库,同时将 memcached 中对应的对象删除,如果相同的话,则表示 SESSION 数据未改变,那么就可以不做任何操作,直接返回了;
那么用户 SESSION 过期时间怎么解决呢?记得 memcached 的 add() 方法有个过期时间参数 $exp 吗?把这个参数值设置成小于 SESSION 最大存活时间即可。另外别忘了给那些一直在线的用户延续 SESSION 时长,这个可以在 write() 方法中解决,通过判断时间,符合条件则更新数据库数据。

今天我们就来看看win 下memcached的方法

将memcache服务器安装包解压到C:memcached文件夹后,使用cmd命令窗口安装。

1>开始>运行:CMD(确定)

2>cd C:memcached(回车)

3>memcached -d install(回车 这步执行安装)

4>memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存,使用11211端口)

此时memcache服务器已经可以正常使用了。


在服务端运行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。

又如:memcached -d -m 10 -u root -l 192.168.105.73 -p 12000 -c 256 -P /tmp/memcached.pid

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.105.73 ,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid

memcache服务器安全:

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

现在就关于修改memcache服务器配置的问题说明如下:

1>用内网ip的方式提供web应用服务器调用,不允许直接通过外网调用,如将memcache服务器放在192.168.1.55的服务器上

2>修改端口,如改为11200

3>分配内存,如分配1024M(1G内存)

方法如下:

 

1>开始>运行:CMD(确定)

2>cd C:memcached(回车)

3>memcached -m 1024 -p 11200 -l 192.168.1.55(回车)

注意,此时命令行不会回到C:memcached>状态,并且实际上memcache服务器悄悄变为stop状态了。此窗口不可以关闭。新开一个cmd窗口

4>开始>运行:CMD(确定)

5>cd C:memcached(回车)

6>memcached -d start(回车)可以关闭此cmd窗口。

此时可以使用新配置的memcache服务器了。


上述方法虽然解决了修改默认配置的问题,但是始终会有一个cmd窗口不可以关闭,否则就回到11211端口的默认配置。

更好的解决方案是通过修改服务的注册表配置:

1>开始>运行:regedit(回车)

2>在注册表中找到:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached Server

3>默认的ImagePath键的值是:"c:memcachedmemcached.exe" -d runservice,改为:"c:memcachedmemcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(确定,关闭注册表)

4>我的电脑(右键)>管理>服务 找到memcache的服务,重新启动一次即可生效。


此时,同网段内的电脑仍然可以利用这台memcache服务器,我们限定指定的web应用服务器才能够使用,通过防火墙的方式。如只允许192.168.1.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接

设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做


很多时候需要监控服务器上的Memcached运行情况,比如缓存的查询次数,命中率之类的。但找到的
那个memcached-tool是linux下用perl写的,我也没试过windows能不能用。后来发现个简单的办法可以做到,就是使用Telnet。

1、windows系统连接memcached端口 cmd命令行中键入telnet 192.168.1.1 11211 11211是memcached绑定的端口号。
2、连接上端口后输入 stats命令,即可得到描述Memcached服务器运行情况的参数。
STAT pid 4356 服务器进程ID
STAT uptime 56625 服务器运行时间,单位秒
STAT time 1225249079 服务器当前的UNIX时间
STAT version 1.1.0 服务器的版本号
STAT pointer_size 64
STAT rusage_user 151.845489 该进程累计的用户时间(秒:微妙)
STAT rusage_system 121.667603 该进程累计的系统时间(秒:微妙)
STAT ibuffer_size 4096
STAT curr_connections 13 连接数量
STAT total_connections 54136 服务器运行以来接受的连接总数
STAT connection_structures 318 服务器分配的连接结构的数量
STAT cmd_get 100595 取回请求总数
STAT cmd_set 6510 存储请求总数
STAT get_hits 96543 请求成功的总次数
STAT get_misses 4052 请求失败的总次数
STAT bytes_read 4427679 服务器从网络读取到的总字节数
STAT bytes_written 6585596 服务器向网络发送的总字节数

1>、uptime 是memcached运行的秒数,
2>、cmd_get是查询缓存的次数。
3>、这两个数据相除一下就能得到平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,
这么点大的压力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。
4>、下面的cmd_set 就是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内
容,就会调用一下cmd_set写进缓存里。
5>、紧跟着是get_hits,就是缓存命中的次数。缓存命中率 = get_hits/cmd_get * 100%。
6>、下面的get_misses的数字加上get_hits应该等于cmd_get。
7>、而total_itemscurr_items表示现在在缓存中的键值对个数.
8>、在图上total_items == cmd_set == get_misses,不过当可用最大内存用光时,memcached就会删掉一些内容,上面的等式就不成立了

好了,下面来段测试代码

<?php教程
//   包含 memcached 类文件
require_once(‘memcached-client.php’);
//   选项设置
$options = array(
    ’servers’ => array(‘192.168.1.1:11211′), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
    ‘debug’ => true,  //是否打开 debug
    ‘compress_threshold’ => 10240,  //超过多少字节的数据时进行压缩
    ‘persistant’ => false  //是否使用持久连接
    );
//   创建 memcached 对象实例
$mc = new memcached($options);
//   设置此脚本使用的唯一标识符
$key = ‘mykey’;
//   往 memcached 中写入对象
$mc->add($key, ’some random strings’);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->add() ’, 60, ‘_’).“n”;
var_dump($val);
//   替换已写入的对象数据值
$mc->replace($key, array(’some’=>‘haha’, ‘array’=>‘xxx’));
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->replace() ’, 60, ‘_’).“n”;
var_dump($val);
//   删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo “n”.str_pad(‘$mc->delete() ’, 60, ‘_’).“n”;
var_dump($val);
?>


Memcache 方法列表:

Memcache::add — Add an item to the server
Memcache::addServer — Add a memcached server to connection pool
Memcache::close — Close memcached server connection
Memcache::connect — Open memcached server connection
memcache_debug — Turn debug output on/off
Memcache::decrement — Decrement item’s value
Memcache::delete — Delete item from the server
Memcache::flush — Flush all existing items at the server
Memcache::get — Retrieve item from the server
Memcache::getExtendedStats — Get statistics from all servers in pool
Memcache::getServerStatus — Returns server status
Memcache::getStats — Get statistics of the server
Memcache::getVersion — Return version of the server
Memcache::increment — Increment item’s value
Memcache::pconnect — Open memcached server persistent connection
Memcache::replace — Replace value of the existing item
Memcache::set — Store data at the server
Memcache::setCompressThreshold — Enable automatic compression of large values
Memcache::setServerParams — Changes server parameters and status at runtime

.mysql教程

在如下页面下载mysql的for linux rpm包

http://www.mysql.com/downloads/down...3.52-1.i386.rpm
http://www.mysql.com/downloads/down...3.52-1.i386.rpm

存至/home/tmp目录

命令列表:

cd /home/tmp
rpm -ivh mysql-3.23.52-1.i386.rpm           //#安装mysql server
rpm -ivh mysql-client-3.23.52-1.i386.rpm   //#安装mysql client
/usr/mysql/safe_mysqld &                   //#启动mysql server
mysql       //#运行mysql 客户端,并开放root用户的远程访问权限,以便调试
use mysql
update user set host = '%' where user = 'root' and host <> 'localhost';
flush privileges;
quit              //至此mysql安装完成

2.apache

在如下页面下载apache的for linux 的源码包

http://www.apache.org/dist/httpd/apache_1.3.26.tar.gz

存至/home/tmp目录

命令列表:

cd /home/tmp
tar -zxvf apache_1.3.26.tar.gz
mv apache_1.3.26.tar.gz apache
cd apache
./configure --prefix=/usr/local/apache --enable-module=so
make
make install 安装apache至/usr/local/apache //并配置apache支持dso方式

3.php教程

在如下页面下载php的for linux 的源码包

http://www.php.net/get_download.php?df=php-4.2.3.tar.gz

存至/home/tmp目录

命令列表:

cd /home/tmp
tar -zxvf php-4.2.3.tar.gz
mv php-4.2.3.tar.gz php
cd php
./configure --prefix=/usr/local/php --with-apxs=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/lib --enable-track-vars --with-xml --with-mysql
make
make install
cp php.ini-dist /usr/local/lib/php.ini

以dso方式安装php至/usr/local/php 设置配置文件目录为/usr/local/lib 开启mysql,xml支持

4.配置

vi /usr/local/apache/conf/httpd.conf

对apache做如下配置

#将ServerAdmin q3boy@younet.com一行改为您的邮箱地址
#DocumentRoot "/home/httpd/html/" 此处为html文件主目录
# 同上
#Options FollowSymLinks MultiViews 为安全起见,去掉"Indexes"
#
# DirectoryIndex default.php default.phtml default.php3 default.html default.htm
#
#设置apache的默认文件名次序
#AddType application/x-httpd-php .php .phtml .php3 .inc
#AddType application/x-httpd-php-source .phps教程
#设置php文件后缀

存盘退出

vi /usr/local/lib/php.ini

#register-golbals = On //存盘退出

5.启动服务

/usr/local/apache/bin/apachectl start

6.备注

apache在linux下的默认最大进程数为256,无论如何修改httpd.conf都不能超过这个限制。如果想加大这个限制,在编译 apache前编辑/home/tmp/apache/src/include/httpd.h,将其中#define HARD_SERVER_LIMIT 256 一行改为#define HARD_SERVER_LIMIT 2048后再编译apache,

apache 1.3.26中mod_so似乎已经不是默认模块了。编译时候需加上--enable-module=so,我第一次编译没加此参数,结果php编译时无法找到apxs

php 4.2.3中默认配置文件路径似乎变了。编译时需加上 --with-config-file-path=/usr/local/lib 参数,我第一次编译完php.ini放了n个地方都没有用。不得已。只能加上这个参数。

p.s. 不保证本文所述步骤适用于其他版本

附:相关文件下载地址

php: http://www.php.net/get_download.php?df=php-4.2.3.tar.gz

apache: http://www.apache.org/dist/httpd/apache_1.3.26.tar.gz

mysql server:http://www.mysql.com/downloads/down...3.52-1.i386.rpm

mysql client: http://www.mysql.com/downloads/down...3.52-1.i386.rpm

 

一、mysql教程驱动mysqlnd
一直以来,php教程都是通过mysql客户端连接mysql,而现在mysql官方已经推出php版的mysql客户端,而这个mysqlnd有效降低内存的使用以及提高性能。具体可以看:
http://dev.mysql.com/downloads/connector/php-mysqlnd/
http://forge.mysql.com/wiki/PHP_MYSQLND
 
从图中可以看出,使用mysqlnd少了从mysql驱动中复制数据到php扩展这一步。mysqlnd使用copy-on-write,也就是写时复制,读引用。
mysqlnd已经内置在php5.3的源码中,编译的时候使用--with-mysql=mysqlnd、--with-mysqli=mysqlnd 和 --with-pdo-mysql=mysqlnd 安装mysqlnd驱动。
mysqlnd的优点
编译php更方便了,不需要libmysql,已经内置在源码中
  1. 编译php更方便了,不需要libmysql,已经内置在源码中
  2. 使用php许可,避免版权问题
  3. 使用php的内存管理,支持php内存限制(memory_limit)
  4. 所有数据在内存只有一份,之前的libmysql有两份,参考上图
  5. 提供性能统计功能,帮助分析瓶颈
  6. mysqli支持长连接(persistent connections)
  7. 性能绝对比libmysql要快
  8. 在驱动层增加缓存机制
看了这么多特点,有点矛盾,作为数据库教程抽象层的PDO能把不同后端的特点发挥出来吗?如果使用mysql作为数据库的话mysqli是不是更好的选择?我总觉得mysqli只是个过度产品,PDO才是未来的。
二、性能提高
  1. md5()大概提高了10%-15%的性能
  2. Better stack implementation in the engine,没明白
  3. 常量保存在ROM里(Constants moved to read-only memory),这里没明白意思
  4. 改进异常处理,操作码(opcode)更简洁
  5. 解决了include(require)_once重复打开的问题,之前once我都是用静态变量实现的,终于解决这个问题了
  6. 用gcc4编译的二进制文件将更小
  7. 整体性能提高了5%-15%
很多人觉得web的瓶颈在db,所以app应用的性能毫不在乎,我认为主要是因为app扩展比db扩展要容易得多,所以才会产生db瓶颈,但这并不意味着可以不顾虑app的性能,毕竟最终还是要在app里解决各种问题的,作为一名程序员编写高质量的代码是最基本的要求。程序的内存使用量少点和执行速度快点,在高并发下是有很效果的,有些时候你改动下实现方法,能提高几十倍也很正常,当然如果付出要很多收获很少的时候就不要太执着了,我觉得一定要有编写高质量代码的意识。
三、?:操作符
其实就是js里的||,返回的结果不是逻辑类型,而是返回本来变量的值,例如 false ?: 123返回123,而不是true。语法就是有点怪怪!

四、名字空间(namespace)

这是个很好的功能,没加入之前都是用前缀来解决命名污染的,方法有点山寨,呵呵。
五、延迟静态绑定(Late Static Binding)
我估计php的静态是在预编译时就固定好的,所以在继承的时候,父类里的self指的是父类,而不是子类。而php5.3加入了新的语法static,可以在运行时候捕捉当前类。
比较典型的例子就是单件模式了:
class ParentClass {    
static private $_instance;
private function __construct() {
}
static public function getInstance() {
if (!isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
}
如果继承这个父类,那子类的单件必须再重写覆盖父类的getInstance。5.3支持用static来延迟绑定,但是很遗憾,即使有static关键字却不能使用new static来实例化,不过有变通的方法
class ParentClass {    
static private $_instance;
private function __construct() {
}
static public function getInstance() {
if (!isset(self::$_instance)) {
$class = static::getClass();// 使用static延迟绑定
self::$_instance = new $class();
}
return self::$_instance;
}
static public function getClass() {
return __CLASS__;
}
}
这个新特性当前可能会有问题存在,暂时不建议使用。
六、新的魔法函数__callStatic
其实就是__call的静态版,调用的静态方法不存在会调用这个魔法函数,但是低效
七、通过变量调用静态(Variable Static Calls)
以前可以通过变量调用对象的方法,例如$instance->$method();,而静态方法不支持,5.3后就支持了可以通过$someClass::$method()调用了,但是低效。
八、日期函数date_create_from_format
把字符串转换成时间戳,如果使用strtotime的话,日期格式是php解析的,而5.3的date_create_from_format可以设置字符串的日期格式,
$date = strtotime("08-01-07 00:00:00");//php 认为格式 是年-月-日   
var_dump(date("Y-m-d", $date)); // string(10) "2008-01-07"
$date = date_create_from_format("m-d-y", "08-01-07");//告诉php格式是 月-日-年
var_dump($date->format('Y-m-d')); // string(10) "2007-08-01"
九、匿名函数(Lambda functions)和闭包(closures)
js有个很爽的地方就是支持函数式编程,php很不爽的地方就是函数太过正规了,不过5.3后php更自由了。
定义匿名函数的语法
$lambda = function () { echo "Hello World!n"; };
function replace_spaces ($text) {   
$replacement = function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
};
return preg_replace_callback ('/( +) /', $replacement, $text);
}
function replace_spaces ($text) {   
return preg_replace_callback ('/( +) /',
function ($matches) {
return str_replace ($matches[1], ' ', ' ').' ';
}, $text);
}
产生闭包的语法
function (normal parameters) use ($var1, $var2, &$refvar) {}
引入了use语法,并且支持引用变量
十、新魔法常量__DIR__
以前只有__FILE__,为了得到当前文件所在的路径,都是用dirname(__FILE__)来得到的,现在可以用__DIR__代替了
十一、NOWDOC
php定义字符串有一种格式叫定界符.
$foo = <<this is $fubar 
ONE;
这种方式称为HEREDOC,php会解析里面的变量,而有时候我们不需要解析变量,5.3加入了NOWDOC,其实就是定界符的单引号版
$bar = <<<'TWO' this is $fubar TWO;
这样,php只把它当作字符串,变量不会解析
十二、GC
因为php本身工作机制的原因,所以php的GC机制只要高效就够了,允许少量内存泄漏,毕竟程序执行完毕就会释放所有申请的内存,根本不会有内存泄漏的问题,但这只是对于短暂运行的程序而言,如果用php编写持久执行就要考虑内存泄漏问题了。
php的GC机制采用引用计数机制,引用计数是很简单高效的GC机制,不过缺点也很明显,不能完全回收所有已无效的变量,例如变量相互引用了,就无法回收了,5.3里加入的GC函数,其实就是起到增强GC机制的作用。
gc_enable(); // 激活GC,增强GC机制,回收循环引用的无效变量 
var_dump(gc_collect_cycles()); // 强制回收已无效的变量
gc_disable(); // 禁用GC
[!--infotagslink--]

相关文章

  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • PHP用DOM方式处理HTML之《Simple HTML DOM》

    近经常需要采集一些网上的数据,发现一个PHP处理HTML的利器 simple html dom,看了一下文档,使用非常方便,关键是能够用CSS选择器来访问DOM树,和jquery相似,实在是难得的利器...2016-11-25
  • ps中怎么设置垂直罗马对齐方式?垂直罗马对齐方式设置方法

    photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
  • javascript 判断页面访问方式电脑或者移动端

    这篇文章主要介绍了 判断页面访问方式电脑或者移动端的相关资料,这里提供了三种方法,需要的朋友可以参考下...2016-10-03
  • Ubuntu Server 18.04.5 LTS服务器版安装配置图解教程

    Ubuntu分为桌面版(desktop)和服务器版(Server),下面为大家介绍服务器版本Ubuntu Server 18.04.5 LTS的详细安装过程,需要的朋友可以参考下...2021-02-01
  • Angularjs---项目搭建图文教程

    下面小编就为大家带来一篇Angularjs---项目搭建图文教程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-25
  • Linux环境下nginx搭建简易图片服务器

    这篇文章主要介绍了Linux环境下nginx搭建简易图片服务器,需要的朋友可以参考下...2016-01-27
  • 详谈Ubuntu PowerShell(小白入门必看教程)

    下面小编就为大家带来一篇详谈Ubuntu PowerShell(小白入门必看教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30
  • node.js利用express自动搭建项目的全过程

    这篇文章主要给大家介绍了关于node.js利用express自动搭建项目的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-09
  • ubuntu系统中安装mysql5.6(通过二进制)

    今天工作中需要对一台ubantu的系统安装mysql,因为以前一直使用的是centos,虽然它也是类unix但是和redhat或centos命令上还是有点差别。所以通过网上查阅资料,终于安装成功了,现在将步骤分享给大家,有需要的朋友们可以参考借鉴。...2016-10-20
  • 前端自动化开发之Node.js的环境搭建教程

    这篇文章主要介绍了前端自动化开发之Node.js环境搭建的相关资料,文中介绍的非常详细,对大家学习或者使用node.js具有一定的参考价值,需要的朋友们下面来一起看看吧。...2017-04-03
  • phpstudy2020搭建站点的实现示例

    这篇文章主要介绍了phpstudy2020搭建站点的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-30
  • 如何使用Vim搭建Lua开发环境详解

    这篇文章主要给大家介绍了关于如何使用Vim搭建Lua开发环境的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
  • 快速使用Bootstrap搭建传送带

    这篇文章主要介绍了快速使用Bootstrap搭建传送带的相关资料,非常具有参考借鉴价值,需要的朋友可以参考下...2016-05-09
  • 详解ASP.NET Core部署项目到Ubuntu Server

    这篇文章主要介绍了详解ASP.NET Core部署项目到Ubuntu Server ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式

    本篇文章主要介绍了buntu Server下启动停止重启MySQL数据库的三种方式,具有一定的参考价值,有兴趣的可以了解一下。 ...2017-01-15
  • Ubuntu上配置Ruby on Rails框架及RubyMine IDE开发环境

    Ruby on Rails是Ruby世界中当仁不让的Web框架代表,甚至可以说Rails推动了Ruby的流行,这里我们就来看一下如何在Ubuntu上配置Ruby on Rails框架及RubyMine IDE开发环境...2020-06-30
  • css的四种隐藏方式介绍

    小编推荐的这篇文章介绍了css的四种隐藏方式,有需要的同学赶快来看看吧 1.opacity:0只是把元素隐藏起来了 ,但是还是占有布局,所以还是对布局有影响 ...2017-01-22
  • php创建桌面快捷方式实现方法

    这篇文章主要介绍了php创建桌面快捷方式实现方法...2016-01-04
  • Ubuntu配置Pytorch on Graph (PoG)环境过程图解

    这篇文章主要介绍了Ubuntu配置Pytorch on Graph (PoG)环境过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-19