当前位置: 编程技术>php
本页文章导读:
▪PHP OPCode缓存 APC详细介绍
APC的介绍 The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code. APC官方网站:http://www.php.net/manual/en/book.apc.ph.........
▪并发下常见的加锁及锁的PHP具体实现代码
在最近的项目中有这样的场景 1.生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个.........
▪PHP开发的一些注意点总结
Linux系统的使用 现在标配的系统是 Linux + Nginx + PHP + MySQL ,这样的配置越来越多的大公司在用的了说到配置不同的是一个公司的规约,比如说挂载一般分为2个盘, / 下面划分为系统用的分区10G 足.........
[1]PHP OPCode缓存 APC详细介绍
来源: 互联网 发布时间: 2013-11-30
APC的介绍
The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.
APC官方网站:http://www.php.net/manual/en/book.apc.php
WIN下最新版本的下载地址:http://downloads.php.net/pierre/
下载连接:http://downloads.php.net/pierre/php_apc-3.1.4-5.3-VC6-x86.zip 根据自己的PHP编译版本使用相对应的DLL
APC配置
APC配置主要讲解在WIN下的配置,类linux下的配置网上文章比较多
1.下载php_apc.dll 到PHP的ext目录下
2.修改php.ini 添加extension=php_apc.dll
在php.ini尾部添加配置项
; APC Setting
[APC]
;开启stat会报错
;apc.stat=0
apc.enabled=”1″
apc.shm_segments=”1″
;这里的问题,这里修改了默认内存配置WIN7下出错,不知道大家遇到没的?
;apc.shm_size=”128″
; apc.ttl=7200
; apc.user_ttl=7200
; 修正參數
apc.ttl=”300″
apc.user_ttl=”300″
apc.num_files_hint=”1024″
apc.mmap_file_mask=”E:/Wamp/tmp/apc.XXXXXX”
apc.enable_cli=”1″
3.重新启动apache服务器,查看phpinfo中是否有apc的配置项目,有的话就配置成功了.
The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.
APC官方网站:http://www.php.net/manual/en/book.apc.php
WIN下最新版本的下载地址:http://downloads.php.net/pierre/
下载连接:http://downloads.php.net/pierre/php_apc-3.1.4-5.3-VC6-x86.zip 根据自己的PHP编译版本使用相对应的DLL
APC配置
APC配置主要讲解在WIN下的配置,类linux下的配置网上文章比较多
1.下载php_apc.dll 到PHP的ext目录下
2.修改php.ini 添加extension=php_apc.dll
在php.ini尾部添加配置项
; APC Setting
[APC]
;开启stat会报错
;apc.stat=0
apc.enabled=”1″
apc.shm_segments=”1″
;这里的问题,这里修改了默认内存配置WIN7下出错,不知道大家遇到没的?
;apc.shm_size=”128″
; apc.ttl=7200
; apc.user_ttl=7200
; 修正參數
apc.ttl=”300″
apc.user_ttl=”300″
apc.num_files_hint=”1024″
apc.mmap_file_mask=”E:/Wamp/tmp/apc.XXXXXX”
apc.enable_cli=”1″
3.重新启动apache服务器,查看phpinfo中是否有apc的配置项目,有的话就配置成功了.
APC控制面板,控制文件来自APC-3.1.4.tgz
未使用缓存之前
使用缓存后
常见问题:
1.在fcgi下的OPCode的缓存清除问题?
[2]并发下常见的加锁及锁的PHP具体实现代码
来源: 互联网 发布时间: 2013-11-30
在最近的项目中有这样的场景
1.生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来.
2.在用了cache的时候,cache失效可能导致瞬间的多数并发请求穿透到数据库此时也可以得需要用锁在同一并发的过程中将这个操作锁定.
针对以上的2种情况,现在的解决方法是对处理过程进行锁机制,通过PHP实现如下
用到了Eaccelerator的内存锁 和 文件锁,原理如下
判断系统中是否安了EAccelerator 如果有则使用内存锁,如果不存在,则进行文件锁
根据带入的key的不同可以实现多个锁直接的并行处理,类似Innodb的行级锁
使用如下:
$lock = new CacheLock('key_name');
$lock->lock();
//logic here
$lock->unlock();
//使用过程中需要注意下文件锁所在路径需要有写权限.
具体类如下:
<?php
/**
* CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库
* 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定
* 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁
* 使用了eaccelerator则在内存中处理,性能相对较高
* 不同的锁之间并行执行,类似mysql innodb的行级锁
* 本类在sunli的phplock的基础上做了少许修改 http://code.google.com/p/phplock
* @author yangxinqi
*
*/
class CacheLock
{
//文件锁存放路径
private $path = null;
//文件句柄
private $fp = null;
//锁粒度,设置越大粒度越小
private $hashNum = 100;
//cache key
private $name;
//是否存在eaccelerator标志
private $eAccelerator = false;
/**
* 构造函数
* 传入锁的存放路径,及cache key的名称,这样可以进行并发
* @param string $path 锁的存放目录,以"/"结尾
* @param string $name cache key
*/
public function __construct($name,$path='lock\\')
{
//判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率
$this->eAccelerator = function_exists("eaccelerator_lock");
if(!$this->eAccelerator)
{
$this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt';
}
$this->name = $name;
}
/**
* crc32
* crc32封装
* @param int $string
* @return int
*/
private function _mycrc32($string)
{
$crc = abs (crc32($string));
if ($crc & 0x80000000) {
$crc ^= 0xffffffff;
$crc += 1;
}
return $crc;
}
/**
* 加锁
* Enter description here ...
*/
public function lock()
{
//如果无法开启ea内存锁,则开启文件锁
if(!$this->eAccelerator)
{
//配置目录权限可写
$this->fp = fopen($this->path, 'w+');
if($this->fp === false)
{
return false;
}
return flock($this->fp, LOCK_EX);
}else{
return eaccelerator_lock($this->name);
}
}
/**
* 解锁
* Enter description here ...
*/
public function unlock()
{
if(!$this->eAccelerator)
{
if($this->fp !== false)
{
flock($this->fp, LOCK_UN);
clearstatcache();
}
//进行关闭
fclose($this->fp);
}else{
return eaccelerator_unlock($this->name);
}
}
}
本类在孙立同学的类的基础上做了小点改进的了.具体可以看 http://code.google.com/p/phplock 感谢孙同学的分享精神!
1.生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来.
2.在用了cache的时候,cache失效可能导致瞬间的多数并发请求穿透到数据库此时也可以得需要用锁在同一并发的过程中将这个操作锁定.
针对以上的2种情况,现在的解决方法是对处理过程进行锁机制,通过PHP实现如下
用到了Eaccelerator的内存锁 和 文件锁,原理如下
判断系统中是否安了EAccelerator 如果有则使用内存锁,如果不存在,则进行文件锁
根据带入的key的不同可以实现多个锁直接的并行处理,类似Innodb的行级锁
使用如下:
$lock = new CacheLock('key_name');
$lock->lock();
//logic here
$lock->unlock();
//使用过程中需要注意下文件锁所在路径需要有写权限.
具体类如下:
代码如下:
<?php
/**
* CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库
* 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定
* 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁
* 使用了eaccelerator则在内存中处理,性能相对较高
* 不同的锁之间并行执行,类似mysql innodb的行级锁
* 本类在sunli的phplock的基础上做了少许修改 http://code.google.com/p/phplock
* @author yangxinqi
*
*/
class CacheLock
{
//文件锁存放路径
private $path = null;
//文件句柄
private $fp = null;
//锁粒度,设置越大粒度越小
private $hashNum = 100;
//cache key
private $name;
//是否存在eaccelerator标志
private $eAccelerator = false;
/**
* 构造函数
* 传入锁的存放路径,及cache key的名称,这样可以进行并发
* @param string $path 锁的存放目录,以"/"结尾
* @param string $name cache key
*/
public function __construct($name,$path='lock\\')
{
//判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率
$this->eAccelerator = function_exists("eaccelerator_lock");
if(!$this->eAccelerator)
{
$this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt';
}
$this->name = $name;
}
/**
* crc32
* crc32封装
* @param int $string
* @return int
*/
private function _mycrc32($string)
{
$crc = abs (crc32($string));
if ($crc & 0x80000000) {
$crc ^= 0xffffffff;
$crc += 1;
}
return $crc;
}
/**
* 加锁
* Enter description here ...
*/
public function lock()
{
//如果无法开启ea内存锁,则开启文件锁
if(!$this->eAccelerator)
{
//配置目录权限可写
$this->fp = fopen($this->path, 'w+');
if($this->fp === false)
{
return false;
}
return flock($this->fp, LOCK_EX);
}else{
return eaccelerator_lock($this->name);
}
}
/**
* 解锁
* Enter description here ...
*/
public function unlock()
{
if(!$this->eAccelerator)
{
if($this->fp !== false)
{
flock($this->fp, LOCK_UN);
clearstatcache();
}
//进行关闭
fclose($this->fp);
}else{
return eaccelerator_unlock($this->name);
}
}
}
本类在孙立同学的类的基础上做了小点改进的了.具体可以看 http://code.google.com/p/phplock 感谢孙同学的分享精神!
[3]PHP开发的一些注意点总结
来源: 互联网 发布时间: 2013-11-30
Linux系统的使用
现在标配的系统是 Linux + Nginx + PHP + MySQL ,这样的配置越来越多的大公司在用的了说到配置不同的是一个公司的规约,比如说挂载一般分为2个盘, / 下面划分为系统用的分区10G 足够 剩余空间划给/home的了.这点我感觉比较好的,原来我划的太多的了,其次是对于系统的安全登陆,现在小公司或者个人的做法是通过网络,直接使用帐号或者密码直接登陆而相对大公司的做法是,先登陆relay中转服务器,然后通过中转服务器登陆到目标服务器,这样帐号会被记录,安全性比较高,现在一般用了TOKEN,RSASecurID进行密码登陆,提高了整体的安全性了.
PHP调用shell命令
在之前没有使用到php调用到shell来执行一些额外的任务,现在会经常用到的了,这样就可以做脚本之外的事情了,这点感觉比较方便
编码习惯上对于编码习惯,每个公司和团队往往使用的都不同,特别是编程IDE的不同导致了编码规范的不同而约定也就不同的了,不过对于整体的习惯经过团队全体人员的决议,就定下来了,这点在原来的小公司没有要求的很严格,现在也是这样的,看来这个和团队文化还是有很大关系的了,这点团队的人相处久了,自然就熟悉的了.
函数返回值
一般对于获取失败的返回值都返回的是false,对于出现的多种情况,返回int的数值,如果是数据则返回的是array或者其他,对于现在的函数由于memcache的使用,现在用了很多的函数内的cache操作,返回值也是先从cache取得,如果没有在到数据库中取得,然后写入cache,然后返回数据
对于处理数据写入原来的写法是在$_POST && $_GET 过来的数据,然后进行addslashes处理,现在的做法是直接接收,然后进行数据判断是否符合要求,然后在拼接sql,然后对sql语句进行mysql_escape_string处理,然后在读出数据的时候,使用htmlspecialchars进行处理,这样显示就没有问题的了.
锁机制的PHP实现
前段时间写过一篇文章并发下常见的加锁及锁的PHP具体实现
关于队列的分发问题
使用了MQ进行Memcache数据的分发,这点还没弄明白,具体的实现,得在请教的了
关于PHP的错误级别的认识
原来对于错误级别,在开发的时候用的都是比较轻的E_ALL | E_STRICT 现在换成了E_ALL & ~E_STRICT 养成变量定义的好习惯,使用时候初始化是比较必要的.
对于防止用户发表违法信息及广告的控制及用户行为频率的控制
对于用户发布的广告,违法信息都用SPAM系统进行了控制,防止出现问题,对于用户行为进行了限制,防止用户过多的控制资源,对于系统中的变量不能使用自增的唯一ID,需要进行加密处理,返回系统信息被其他人获得.包括用户ID,数据信息ID的加密处理
现在标配的系统是 Linux + Nginx + PHP + MySQL ,这样的配置越来越多的大公司在用的了说到配置不同的是一个公司的规约,比如说挂载一般分为2个盘, / 下面划分为系统用的分区10G 足够 剩余空间划给/home的了.这点我感觉比较好的,原来我划的太多的了,其次是对于系统的安全登陆,现在小公司或者个人的做法是通过网络,直接使用帐号或者密码直接登陆而相对大公司的做法是,先登陆relay中转服务器,然后通过中转服务器登陆到目标服务器,这样帐号会被记录,安全性比较高,现在一般用了TOKEN,RSASecurID进行密码登陆,提高了整体的安全性了.
PHP调用shell命令
在之前没有使用到php调用到shell来执行一些额外的任务,现在会经常用到的了,这样就可以做脚本之外的事情了,这点感觉比较方便
编码习惯上对于编码习惯,每个公司和团队往往使用的都不同,特别是编程IDE的不同导致了编码规范的不同而约定也就不同的了,不过对于整体的习惯经过团队全体人员的决议,就定下来了,这点在原来的小公司没有要求的很严格,现在也是这样的,看来这个和团队文化还是有很大关系的了,这点团队的人相处久了,自然就熟悉的了.
函数返回值
一般对于获取失败的返回值都返回的是false,对于出现的多种情况,返回int的数值,如果是数据则返回的是array或者其他,对于现在的函数由于memcache的使用,现在用了很多的函数内的cache操作,返回值也是先从cache取得,如果没有在到数据库中取得,然后写入cache,然后返回数据
对于处理数据写入原来的写法是在$_POST && $_GET 过来的数据,然后进行addslashes处理,现在的做法是直接接收,然后进行数据判断是否符合要求,然后在拼接sql,然后对sql语句进行mysql_escape_string处理,然后在读出数据的时候,使用htmlspecialchars进行处理,这样显示就没有问题的了.
锁机制的PHP实现
前段时间写过一篇文章并发下常见的加锁及锁的PHP具体实现
关于队列的分发问题
使用了MQ进行Memcache数据的分发,这点还没弄明白,具体的实现,得在请教的了
关于PHP的错误级别的认识
原来对于错误级别,在开发的时候用的都是比较轻的E_ALL | E_STRICT 现在换成了E_ALL & ~E_STRICT 养成变量定义的好习惯,使用时候初始化是比较必要的.
对于防止用户发表违法信息及广告的控制及用户行为频率的控制
对于用户发布的广告,违法信息都用SPAM系统进行了控制,防止出现问题,对于用户行为进行了限制,防止用户过多的控制资源,对于系统中的变量不能使用自增的唯一ID,需要进行加密处理,返回系统信息被其他人获得.包括用户ID,数据信息ID的加密处理
最新技术文章: