实现基于Memcache存储的Session类

使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache扩展,能够支持分布式的Memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。

说明:以下代码基于Memcache来保存Session数据,客户端必须安装有PHP的Memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。

<?php
//===========================================
// 程序:Memcache-Based Session Class
// 功能:基于Memcache存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-23
//===========================================

/**
* 类名: FileSession Class
* 功能: 自主实现基于Memcache存储的 Session 功能
* 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
*         然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,
*         然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
*
*        本方式适合Memcache内存方式存储Session数据的方式,同时如果构建分布式的Memcache服务器,
*        能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
* 注意: 本类必须要求PHP安装了Memcache扩展, 获取Memcache扩展请访问: http://pecl.php.net
*/
class MemcacheSession
{
var $sessId                = '';
var $sessKeyPrefix         = 'sess_';
var $sessExpireTime        = 86400;
var $cookieName         = '__SessHandler';
var $cookieExpireTime     = '';
var $memConfig             = array('host'=>'192.168.0.200', 'port'=>11211);
var $memObject            = null;

/**
* 构造函数
*
* @param bool $isInit - 是否实例化对象的时候启动Session
*/
function MemcacheSession($isInit = false){
if ($isInit){
$this->start();
}
}

//-------------------------
//   外部方法
//-------------------------

/**
* 启动Session操作
*
* @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
*/
function start($expireTime = 0){
$sessId = $_COOKIE[$this->cookieName];
if (!$sessId){
$this->sessId = $this->_getId();
$this->cookieExpireTime = ($expireTime > 0) ? time() + $expireTime : 0;
setcookie($this->cookieName, $this->sessId, $this->cookieExpireTime, "/", '');
$this->_initMemcacheObj();
$_SESSION = array();
$this->_saveSession();
} else {
$this->sessId = $sessId;
$_SESSION = $this->_getSession($sessId);
}
}

/**
* 判断某个Session变量是否注册
*
* @param string $varName -
* @return bool 存在返回true, 不存在返回false
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return true;
}

/**
* 注册一个Session变量
*
* @param string $varName - 需要注册成Session的变量名
* @param mixed $varValue - 注册成Session变量的值
* @return bool - 该变量名已经存在返回false, 注册成功返回true
*/
function register($varName, $varValue){
if (isset($_SESSION[$varName])){
return false;
}
$_SESSION[$varName] = $varValue;
$this->_saveSession();
return true;
}

/**
* 销毁一个已注册的Session变量
*
* @param string $varName - 需要销毁的Session变量名
* @return bool 销毁成功返回true
*/
function unregister($varName){
unset($_SESSION[$varName]);
$this->_saveSession();
return true;
}

/**
* 销毁所有已经注册的Session变量
*
* @return 销毁成功返回true
*/
function destroy(){
$_SESSION = array();
$this->_saveSession();
return true;
}

/**
* 获取一个已注册的Session变量值
*
* @param string $varName - Session变量的名称
* @return mixed - 不存在的变量返回false, 存在变量返回变量值
*/
function get($varName){
if (!isset($_SESSION[$varName])){
return false;
}
return $_SESSION[$varName];
}

/**
* 获取所有Session变量
*
* @return array - 返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION;
}

/**
* 获取当前的Session ID
*
* @return string 获取的SessionID
*/
function getSid(){
return $this->sessId;
}

/**
* 获取Memcache的配置信息
*
* @return array Memcache配置数组信息
*/
function getMemConfig(){
return $this->memConfig;
}

/**
* 设置Memcache的配置信息
*
* @param string $host - Memcache服务器的IP
* @param int $port - Memcache服务器的端口
*/
function setMemConfig($host, $port){
$this->memConfig = array('host'=>$host, 'port'=>$port);
}

//-------------------------
//   内部接口
//-------------------------

/**
* 生成一个Session ID
*
* @return string 返回一个32位的Session ID
*/
function _getId(){
return md5(uniqid(microtime()));
}

/**
* 获取一个保存在Memcache的Session Key
*
* @param string $sessId - 是否指定Session ID
* @return string 获取到的Session Key
*/
function _getSessKey($sessId = ''){
$sessKey = ($sessId == '') ? $this->sessKeyPrefix.$this->sessId : $this->sessKeyPrefix.$sessId;
return $sessKey;
}
/**
* 检查保存Session数据的路径是否存在
*
* @return bool 成功返回true
*/
function _initMemcacheObj(){
if (!class_exists('Memcache') || !function_exists('memcache_connect')){
$this->_showMessage('Failed: Memcache extension not install, please from http://pecl.php.net download and install');
}
if ($this->memObject && is_object($this->memObject)){
return true;
}
$mem = new Memcache;
if (!@$mem->connect($this->memConfig['host'], $this->memConfig['port'])){
$this->_showMessage('Failed: Connect memcache host '. $this->memConfig['host'] .':'. $this->memConfig['port'] .' failed');
}
$this->memObject = $mem;
return true;
}

/**
* 获取Session文件中的数据
*
* @param string $sessId - 需要获取Session数据的SessionId
* @return unknown
*/
function _getSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
$sessData = $this->memObject->get($sessKey);
if (!is_array($sessData) || empty($sessData)){
$this->_showMessage('Failed: Session ID '. $sessKey .' session data not exists');
}
return $sessData;
}

/**
* 把当前的Session数据保存到Memcache
*
* @param string $sessId - Session ID
* @return 成功返回true
*/
function _saveSession($sessId = ''){
$this->_initMemcacheObj();
$sessKey = $this->_getSessKey($sessId);
if (empty($_SESSION)){
$ret = @$this->memObject->set($sessKey, $_SESSION, false, $this->sessExpireTime);
}else{
$ret = @$this->memObject->replace($sessKey, $_SESSION, false, $this->sessExpireTime);
}
if (!$ret){
$this->_showMessage('Failed: Save sessiont data failed, please check memcache server');
}
return true;
}

/**
* 显示提示信息
*
* @param string $strMessage - 需要显示的信息内容
* @param bool $isFailed - 是否是失败信息, 缺省是true
*/
function _showMessage($strMessage, $isFailed = true){
if ($isFailed){
exit($strMessage);
}
echo $strMessage;
}
}
?>

 

转自:http://hi.baidu.com/dyp82/blog/item/67f8f05532d3263542a75b82.html

全解:解决Apache下403 Forbidden错误

解决Apache下403 Forbidden错误

出现这样的问题一般有两种可能性。

一种可能性是DocumentRoot选项的设置,如果在安装好apache2后修改了该选项,并且忘记了配置该新目录的访问权限就会出现这样的情况。

比如apache2安装好后默认的参数如下:

DocumentRoot /usr/local/www/data
<directory "/usr/local/www/data">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</directory>

我们常常会重新指定web文件存放的目录,比如设定DocumentRoot /var/www这时往往会忽略了对后面的Directory 项的修改,必须将里面的路径同时修改为 /var/www才行,否则将会访问所有目录都出现 403 forbidden错误。

今天在公司电脑上安装Apache,版本2.2.8,装完刚测试可以;配置了下php的php.in文件再次localhost打开发现错误:HTTP 错误 403 - 禁止访问,即403 Forbidden:You don't have permission to access / on this server.权限又不够了?
马上打开apache的配置文件httpd.conf,逐行检查。在大约快一半的地方有以下这段代码:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

发现了吧。

由于配置了php后,这里的“Deny from all”已经拒绝了一切连接。把该行改成“allow from all”,修改后的代码如下,问题解决。

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    allow from all
</Directory>

另外一种可能性出现在我们配置了不同的VirtualHost,并且有某个VirtualHost的DocumentRoot不在全局的DocumentRoot目录下,这时必须在全局种单独增加对该目录的Directory 项进行设置,否则该VirtualHost下的所有访问均会出现403 forbidden错误。

这个问题是因为Apache2对于权限和安全的更高要求,对分布在不同磁盘上的目录文件进行严格管理,我们进行web规划的时候必须注意这一点。
试试下面的步骤:

  • 第一:看看是不是Directory配置错了,好像一般不会是这个原因
  • 第二:看看User Group指定的用户有没有权限访问那个目录,否则用chown修改目录的所有者
  • 第三:看看是不是seLinux搞得鬼,一般没事把selinux停了再重启linux,selinux的配置文件在/etc/selinux/config,改成disable
  • 第四:我把所有的都做了发现还是不行,那么可能是apache是用root安装的,把apache卸了用一个非root用户重新安装。

终极解决办法:如果以上都不行的话!!!

Forbidden You don't have permission to access / ~ web on this server. Additionally, a 403 Forbidden error was encountered while trying to use an Error Document to handle the request.

Apache/2.0.54 (CentOS) Server at 127.0.0.1 Port 80

  一般出现这个问题,直观地会想到的目录的存取权限问题,查了很久,调了很久也没有解决问题。

其间曾想到是否Selinux的问题,进去看了一圈,没有发现什么要改的地方。(后来的事实证明,有时候直觉是很准的,能否找到答案,区别往往是:是否在直觉上走的更深入)。

  问题的解决用Google以Apache 403搜了好一会,终于在一个博客里看到,作者遇到和我完全相同的问题:Apache、目录的配置都没问题,但就是不能显示页面。

而解决方法恰恰就是修改Selinux对public_html的访问控制。

用以下命令修改文件夹安全属性

chcon -R -t httpd_user_content_t public_html/

关联知识的总结:

Fedora Core 5 SELinux FAQ http://fedora.redhat.com/docs/selinux-faq-fc5/#faq-entry-public_html 

Q:  How do I make a user public_html directory work under SELinux?

A: This process presumes that you have enabled user public HTML directories in your Apache configuration file, /etc/httpd/conf/httpd.conf. 

    This process only covers serving static Web content. For more information about Apache HTTP and SELinux, refer to http://fedora.redhat.com/docs/selinux-apache-fc3/.If you do not already have a ~/public_html directory, create it and populate it with the files and folders to be served.cd ~mkdir public_htmlcp /path/to/content ~/public_htmlAt this point, httpd is configured to serve the contents, but you still receive a 403 forbidden error. This is because httpd is not allowed to read the security type for the directory and files as they are created in the user's home directory. Change the security context of the folder and its contents recursively using the -R option:ls -Z -d public_html/drwxrwxr-x  auser    auser    user_u:object_r:user_home_t      public_htmlchcon -R -t httpd_user_content_t public_html/ls -Z -d public_html/drwxrwxr-x  auser    auser    user_u:object_r:httpd_user_content_t public_html/ls -Z public_html/-rw-rw-r--  auser    auser    user_u:object_r:httpd_user_content_t bar.html-rw-rw-r--  auser    auser    user_u:object_r:httpd_user_content_t baz.html-rw-rw-r--  auser    auser    user_u:object_r:httpd_user_content_t foo.htmlYou may notice at a later date that the user field, set here to user_u, is changed to system_u. This does not affect how the targeted policy works. The field that matters is the type field.Your static webpages should now be served correctly. If you continue to have errors, ensure that the Boolean which enables user home directories is enabled. You can set it using system-config-securitylevel. Select the SELinux tab, and then select the Modify SELinux Policy area. Select Allow HTTPD to read home directories. The changes take effect immediately.

    所用命令解析:ls -Z -d public_html/#显示文件/目录的安全语境-Z, --contextDisplay  security context so it fits on most displays.  Displays only mode, user, group, security context and file name.-d, --directorylist directory entries instead of contents, and do not dereference symbolic linkschcon -R -t httpd_user_content_t public_html/#修改文件/目录的安全语境-R, --recursivechange files and directories recursively-t, --typeset type TYPE in the target security context   http://www.webjx.com/server/dns-524.html

sourceforge.net免费php空间无限容量可绑域名无广告

sourceforge

想要找一个免费空间,相信很多人都是希望找一个可以长期使用的免费空间,要不然,自己辛辛苦苦做好的网站,写好的文章,被那些一夜之间就消失的不稳定的空间付之一炬了。

找一个免费空间并不难,难得找到一个真正可以做站的空间。免费资源部落在这二年内给大家介绍了无数免费空间,总得来说国外的空间比国内的免费空间寿命长,稳定性好,故重点推荐。

今天我要介绍的免费php空间sourceforge.net,大有来头,网上关于它的免费空间教程也是满天飞。SourceForge是全球最大的开源软件开发和下载平台,Alexa全球排名100多位,Google Page Rank(PR)=9,它的Project Web项目为开源软件开发测试供给高个性能的免费空间。

sourceforge.net免费空间的特点有:

  • 1、空间稳定,无广告,访问速度快。无限空间容量,无限流量。
  • 2、空间支持PHP 、Perl、Python、 Ruby、shell等多种脚本。貌似不支持asp。
  • 3、sourceforge.net可以绑定域名,也提供免费二级域名。
  • 4、sourceforge.net提供无限数据库,支持在线管理数据库。
  • 5、可外链图片,安全模式关闭,allow_url_fopen开启,可自定义.htaccess。
  • 6、支持FTP,不支持在线管理文件。

能够和sourceforge.net这样的超级稳定的空间相提并论有:

sourceforge.net免费php空间无限容量可绑域名无广告申请方法与使用教程:

1、首先是打开注册地址:https://sourceforge.net/account/registration,直接填写你的个人基本信息,进行注册,如下图:

sourceforge.net用户注册

2、提交你的注册后,到你的注册邮箱收取激活邮件,点击邮件当中的激活链接,激活成功。接下来点击“Projects”当中的“Register a New Projects”,如下图:

sourceforge.net创建项目

3、接下来填写你的项目名称和网站域名地址,在下方是一些说明性的文字,如下图:

sourceforge.net项目说明

4、创建成功后,这时候你需要下载FTP软件WinSCP连接空间,这里是WinSCP下载地址

5、将WinSCP下载下来后,直接解压,然后双击WinSCP.exe直接运行FTP,不需要安装。你需要在FTP地址填写的是: web.sourceforge.net ,FTP用户名为“用户名,项目名”,FTP密码和登录密码一样,空间根目录在“htdocs”文件夹下,如下图:

sourceforge.net用FTP登录

6、如何为你的网站创建免费的数据库和绑定自己的域名呢?首先是打开https://sourceforge.net/develop ,点击网页右边“My Projects”的“Develop”,如下图:

sourceforge.net创建数据库

7、再点击“Project Admin”进入控制面板。然后点击“Feature Settings”管理空间,如下图:

sourceforge.net管理面板

8、如果想要创建数据库的话,点击“Project Database (MySQL)”的“Manage”,如下图:

sourceforge.net设置数据库密码

9、你可以为你的数据库设置数据库密码,有三种权限选择,如下图:

sourceforge.net密码管理

10、PhPMyAdmin地址是:https://mysql-s.sourceforge.net,在这里你可以在线管理你的数据库。下图我刚刚创建好的数据库:

sourceforge.net在线管理数据库

11、如果你想要绑定域名的话,可以点击“Feature Settings”管理空间,然后点击“Virtual Hosts (VHOSTs)”的“Manage”绑定域名,支持绑定10个独立域名,域名解析可添加A记录指向IP地址216.34.181.97,或者添加CNAME别名指向vhost.sourceforge.net,如下图:

sourceforge.net绑定域名

12、这里是sourceforge.net免费php空间演示:http://freehao123.sourceforge.net/

13、这里是sourceforge.net免费php空间php探针演示:http://freehao123.sourceforge.net/info.php

14、这里是sourceforge.net免费空间的图片外链演示:

sourceforge.net图片

15、这里是WinSCP下载地址,链接网站:https://sourceforge.net/

文章出自:免费资源部落 http://www.freehao123.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。

www.000webhost.com免费PHP空间申请方法与教程

000webhost.com在中国是家喻户晓了。它的空间非常的有名而且稳定(除非你违反了对方的规定).空间几年前就在国内的论坛发布了,正所谡物以稀为贵,现在老外的免费空间算是感受到了咱中国人上网的巨大力量,如果直接申请的话是申请不到的,这时候我们就需要代理了。000webhost.com

我下面来详细介绍如何申请到这个空间:

000webhost.com提供的免费服务: 全能PHP空间1.5G ,支持PHP(不支持ASP),支持绑定顶级域名,无任何广告,独立控制面板,免费创建Mysql数据库,FTP上传下载,在线压缩解压,支持fopen()函数。可正常安装Wordpress,PHPWind,Discuz ,Joomla等软件。

国内的朋友想申请的话,必须通过代理申请才行,申请成功后就无需代理可直接访问了。笔者亲自测试过了,国内访问的速度没有任何问题。

000webhost注册网址:www.000webhost.com

一、如何使用代理申请000webhost免费空间:

1、搜索代理,最好是美国、英国或加拿大的:也要可以用免费WEN网页代理http://www.netevader.com,想要使用其它免费代理的朋友可以点击:免费代理

step1:打开http://www.netevader.com

step2:将http://www.000webhost.com拷贝到如上网址

step3:修改代理为:php8,hhad,usa(当然也可以不用代理)

step4:点击安全浏览,进入000webhost注册界面。 注意: 如果申请不成功,请尝试其他代理;或者留言,如有时间,我会帮申请下。

二、如何注册000webhost.com的免费1.5Gphp全能空间:英文不好的朋友,可用google 翻译一下:

1、首页点击上方的order onw或者signup,进入注册页: 2、填写相关信息:注意域名可以是绑定你自己的独立域名或者是网站的2级域名,

2者选1(这个我最喜欢了,不像有的免费网站,尽管你有自己的域名,但是最终都会跳转到该空间的2级域名那) 注意: 如果是绑定你自己的域名,请首先修改你的域名DNS为000webhost的,主:ns01.000webhost.com;辅:ns02.000webhost.com; 填写完毕,点击create my account即可,申请24小时后可以继续添加域名,绑定域名没有限制; 3、点击create my account,自动跳入下一个网页,显示你的网站建设情况: 注意:如果顺利的话会很快跳到下一步,如果显示等待审核等,则说明申请失败,需要另外寻找代理。 本人经验:没有到达上一步的话,说明你用代理申请的方法失败了,此时你可以再申请,但是你需要做是的:用另外一个邮箱,最好是gmail邮箱,删除浏览器的cookie,换另外一个代理。

4、账号创建成功,会显示你的详细信息,空间信息、网址,FTP服务器等 至此,000webhost.com的1.5G全能无广告免费PHP空间,就轻松到手了,下面就开始你的建站之旅吧。