windows配置memcache的方法

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

之前我曾经写过一篇名为《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

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/看看

 

.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

windows和linux环境下php教程 apache mysql教程 环境的搭建教程
 
详解如何正确配置php开发环境
php语言在进行开发之前,需要将开发环境配置妥当,这样才能实现我们的程序完美运行。那么,如何正确的配置php开发环境呢?文章将介绍apache、mysql、php的下载、安装及配置,分别讲述在windows和linux环境下开发环境的搭建。

  一、下载apache、mysql和php

  1、apache的下载

  apache服务器可以通过官方提供的镜像地址来下载windows的apache安装程序,不过都是英文版的,而且下载速度太慢。我建议大家去华军、天空或者中关村下载最新版的安装程序,速度很快。

  2、mysql的下载

  mysql的官方网站是http://www.mysql.com。可以下载最新版本的mysql,还是那句话,建议大家去华军、天空或者中关村下载。

  3、php的下载

  php的官方网站是http://www.php.net。可以下载最新的版本。

  二、在windows下配置php开发环境

  1、apache、mysql和php的安装像安装windows其他软件一样,这里建议把apache和php软件安装在d盘目录下,把mysql软件安装在c盘,这样不需要做任何设置,mysql就可以顺利启动运行。

  2、配置开发环境

  为了让windows可以执行php,需要做进一步的工作,按以下步骤搭建好环境:

  1)在php安装目录下,找到文件php5ts.dll,将其复制到c盘system32目录下。

  2)在php安装目录下,找到文件libmysql.dll,将其复制到c盘system32目录下。

  3)在php安装目录下,找到文件php.ini,将其复制到c:windows下。这个文件是配置php的基本文件,如设置服务器根目录配置,用文本编辑器打开php.ini文件,找到"doc_root=",因为我把apache默认安装在d盘根目录下,所以,修改这个配置项的值为:doc_root=d:apache2htdocs

  提示:用户根据自己安装apache的路径,修改该配置项的值。

  4)在php.ini中找到“extension_dir ="./"”,这个配置项用来载入php的扩展模块,修改该配置项如下:extension_dir = d:phpext,(需要按自己的安装目录修改php的载入位置)。

  5)在php.ini中找到“;extension=php_mysql.dll”,把这项前面的分号去掉,表示使这个项生效。这个配置项用来使php支持mysql,这里分号起注释作用。修改完php的配置文件php.ini后,保存退出该文件。

  6)进行apache的配置。转到apache的安装目录下的conf目录,用文本编辑器打开apache的配置文件http.conf。在此文件中找到 dynamic shared object(dos) support,在loadmodule行的最后添加如下配置项:loadmodule php5_module d:/php/php5apache2.dll,(需要按自己的安装目录修改php的载入位置)。该项是通过apache来载入php模块php5apache2.dll,即php以apache的一个模块来运行。

  7)为了让apache支持.php后缀的文件,在http.conf中找到addtype项,在最后添加如下配置项:addtype application/x-httpd-php.php。找到directoryindex,在最后添加index.php。为了支持中文,找到adddefaultcharset iso-8859-1改为adddefaultcharset gb2312。修改完后保存http.conf。即完成apache的基本配置。

  注意:强烈建议对apache配置文件http.conf进行修改时,一定遵守修改一点测试一点的原则,即每次修改完一项并保存http.conf后,要重启一下apache,如果apache正常启动,则可以进行后续修改,否则,说明本次修改有误,仔细检查并重新修改。

  三、在linux下配置配置php开发环境

  1、mysql的安装

  在mysql官网下载mysql的安装文件mysql-server-4.0.20-0.i386.rpm,执行下面的命令完成mysql的安装。

  rpm -ivh mysql-server-4.0.20-0.i386.rpm

  在没有设置mysql密码的情况下,通过以下命令测试mysql是否安装成功。

  mysql -u root

  出现类似welcome to the mysql mointor. commands end with;or g的字样,说明安装成功。

  2、apache的安装

  从apache的官网下载unix版本的压缩包,以httpd-2.0.52.tar.gz为例,假设资源包放在/usr/local/src下,进入这个目录后解压缩,命令如下:

  cd /usr/local/src

  tar -zxvf httpd-2.0.52.tar.gz

  解压缩后,进入目录httpd-2.0.52,执行以下命令:

  ./configure --prefix=/usr/local/apache2 --enable--module=so

  其中--prefix=/usr/local/apache2用来指定apache的安装目录。接下来进行编译,执行一下命令完成安装。

  make

  mae install

  3、配置php开发环境的安装

  1)从php官网下载php5.1.4.tar.gz的压缩包,解压缩该文件包,命令如下:

  tar -zxf php5.1.4.tar.gz

  2)转到解压缩后的目录,执行以下命令完成php安装目录等相关配置:

  ./configure --prefix=/usr/local/php -with-mysql=/var/lib/mysql

  3)接着编译php,命令如下:

  make

  make install

  4)复制当前目录下的文件php大安装目录的lib目录下,并改名为php.ini,命令如下:

  cp php.ini-dist /usr/local/php/lib/php.ini

  5)以上配置php开发环境的安装完后,参见windows下配置的内容进行相关配置,配置项和配置方法类似。

[!--infotagslink--]

相关文章

  • Windows VPN服务器配置图文教程 超详细版

    VPN可以虚拟出一个专用网络,让远处的计算机和你相当于处在同一个局域网中,而中间的数据也可以实现加密传输,用处很大,特别是在一些大公司,分公司处在不同的区域。...2016-01-27
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04