推特 阿里云技术文档正文

PHP: memcached_客户端连接实例_快速入门_云数据库 Memcache 版

admin 阿里云技术文档 2020-02-11 189 0
阿里云服务器优惠

PHP: memcached

客户端下载

客户端下载

客户端介绍

客户端版本介绍

系统要求及环境配置

注意:您已经有 php memcache 等环境,请注意教程中的一些提示,以免生产环境被覆盖,导致业务不可用,在升级及再编译环境前请做好环境备份。

windows 系列版本

如果采用标准的 php memcached 扩展不能成功搭建,可以考虑换成手工拼包的形式来访问云数据库 Memcache,连接方式请参考如下链接,示例代码非常简单,与 php memcached 的区别就是仅支持主流接口,需自己补充某些特定接口,安装及使用方法请参见这里

Centos 及 Aliyun Linux 6系列版本

注意:Memcached 2.2.0 扩展必须使用 libmemcached 1.0.x 的库,低于1.0的库不再能够成功编译。编译 libmemcached 时 GCC 要求在4.2及以上。

  1. 确认是否安装了gcc-c++ 等组件(使用 gcc –v 查看版本是否为4.2及以上)。如没有请执行 yum install gcc+ gcc-c++

  2. 执行 rpm –qa | grep php 查看系统中是否有 PHP 环境,如果没有则执行 yum install php-devel,php-common,php-cli 安装包含源码编译的 PHP。

    建议使用 php 5.3及以上版本。php 5.2部分版本系列源代码会有 zend_parse_parameters_none 函数会出错,如需使用请参照 php 官方相关文档。如是源代码编译,请按照官方 php 编译升级的办法进行。

  3. 检测是否有已安装了 SASL 相关环境包,如没有,则执行 yum install cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib 安装 SASL 相关环境。

  4. 检测下是否有已安装了 libmemcached 源码包,若没有,则执行以下命令安装 libmemcached 源码包(推荐版本 libmemcached-1.0.18)。

    1. wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
    2. tar zxvf libmemcached-1.0.18.tar.gz
    3. cd libmemcached-1.0.18
    4. ./configure --prefix=/usr/local/libmemcached --enable-sasl
    5. make
    6. make install
    7. cd ..
  5. 执行 yum install zlib-devel 安装 memcached 源码包(推荐版本为 memcached-2.2.0)。

    注意

    • 安装 memcached 前需要确认是否有 zlib-devel 包需要执行。

    • 请先检测下是否已安装了 memcached 客户端包(包含源码包)。如有则不需要安装,但需要重新编译增加 -enable-memcached-sasl 这个扩展。

      1. wget http://pecl.php.net/get/memcached-2.2.0.tgz
      2. tar zxvf memcached-2.2.0.tgz
      3. cd memcached-2.2.0
      4. phpize(如果系统中有两套PHP环境,需绝对路径调用该命令/usr/bin/phpize,该路径为使用云数据库MemcachePHP环境路径)
      5. ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl(注意这个参数)
      6. make
      7. make install
  6. 修改 php.ini 文件(locate 找该文件,如果系统中有两套 PHP 环境,需找到使用云数据库 Memcache 的 PHP 环境路径,对应修改之),增加 extension=memcached.so memcached.use_sasl = 1

  7. 使用该页面最后的测试代码测试下是否环境部署成功,请修改代码中相应的地址、端口、用户名及密码。

Centos及 Aliyun Linux 5系列版本 【64位版本】

  1. 确认是否安装了 gcc-c++ 等组件。如没有请执行 yum install gcc+ gcc-c++

  2. 执行rpm –qa | grep php 查看系统中是否有 php 环境,如果没有则执行 yum install php53 php53-devel 安装包含源码编译的 php;如有 php 则不要安装。建议使用 php 5.3(含)以上版。

    php 5.2部分版本系列源代码会有 zend_parse_parameters_none 函数会出错,如需使用请参照 php 官方相关文档。

  3. 执行 yum install cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib 安装 SASL 相关环境。

  4. 检测下是否已安装了 libmemcached(包含源码包),如有则不需要安装,如没有则执行以下命令安装(推荐版本 libmemcached 1.0.2)。

    1. wget http://launchpad.net/libmemcached/1.0/1.0.2/+download/libmemcached-1.0.2.tar.gz
    2. tar -zxvf libmemcached-1.0.2.tar.gz
    3. cd libmemcached-1.0.2
    4. ./configure --prefix=/usr/local/libmemcached --enable-sasl
    5. make
    6. make install
    7. cd ..
  5. 执行 yum install zlib-devel 安装源码包 memcached(推荐版本 memcached 2.0)。

    注意

    • 安装 memcached 前需要确认是否有 zlib-devel 包需要执行。

    • 请先检测下是否有已安装了 memcached 客户端包(包含源码包)。如有则不需要安装,但需要重新编译增加 -enable-memcached-sasl 这个扩展。

      1. wget http://pecl.php.net/get/memcached-2.0.0.tgz tar -zxvf memcached-2.0.0.tgz
      2. cd memcached-2.0.0 phpize(如果系统中有两套PHP环境,需绝对路径调用该命令/usr/bin/phpize,该路径为使用云数据库MemcachePHP环境路径,请在memcached源码目录内执行phpize
      3. ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl(注意这个参数)
      4. make
      5. make install
  6. 修改 php.ini 文件(locate 找该文件,yum 安装的一般在 /etc/php.ini。 如果系统中有两套 PHP 环境,需找到使用云数据库 Memcache 的 PHP 环境路径,对应修改之),增加 extension=memcached.so memcached.use_sasl = 1

  7. 执行 php –m |grep ,memcached ,若显结果有 memcache 表示环境已支持 memcache。

  8. 使用该页面最后的测试代码测试下是否环境部署成功,请修改代码中相应的地址、端口、用户名及密码。

Ubuntu Debian 等系列版本

  1. 变更 ubuntu 源。

    方案一:执行 vim /etc/apt/source.list,在最前面添加以下内容。

    1. deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
    2. deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
    3. deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
    4. deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
    5. deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
    6. deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
    7. deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
    8. deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
    9. deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
    10. deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
    11. apt-get update //更新一下列表

    方案二: 通过 wget http://oss.aliyuncs.com/aliyunecs/update_source.zip 下载 update_source 的压缩包,解压后予执行权限 chmod 777 文件名 ,然后执行该脚本进行自动变更源操作。

  2. 通过 ape-get 配置 GCC,G++ 。

    首先需要使用 dpkg –s 安装包名,例如 dpkg –s gcc,确认是否安装了 gcc-c++ 等组件。如没有请执行 apt-get build-dep gcc apt-get install build-essential

  3. 安装 php5, php5-dev。

    首先需要使用 dpkg –s 安装包名,例如 dpkg –s php,确认是否安装了 php 等组件。如没有请执行 apt-get install php5 php5-dev (同时会自动安装php5-cli和php5-common)。

  4. 安装配置 sasl 支持。

    首先需要使用 dpkg –s 安装包名, 例如 dpkg –s libsasl2,确认是否安装了 libsasl2 cloog-ppl 等组件,如没有请执行以下命令。

    1. apt-get install libsasl2-dev cloog-ppl
    2. cd /usr/local/src
  5. 执行以下命令安装指定版本的 libmemcache。

    注意:请先检测下是否有已安装了这些包(包含源码包),如有则不需要安装。

    1. wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
    2. tar -zxvf libmemcached-1.0.18.tar.gz
    3. cd libmemcached-1.0.18
    4. ./configure --prefix=/usr/local/libmemcached
    5. make
    6. make install
    7. cd ..
  6. 执行以下命令安装指定版本的 memcached。

    注意:请先检测下是否有已安装了 memcached 客户端包(包含源码包),如有则不需要安装,但需要重新编译增加 -enable-memcached-sasl 这个扩展。

    1. wget
    2. http://pecl.php.net/get/memcached-2.2.0.tgz tar zxvf memcached-2.2.0.tgz
    3. cd memcached-2.2.0 phpize5
    4. ./configure --with-libmemcached-dir=/usr/local/libmemcached --enable-memcached-sasl
    5. make
    6. make install
  7. 配置 php 支持 memcached,然后测试。

    1. echo "extension=memcached.so" >>/etc/php5/conf.d/pdo.ini echo "memcached.use_sasl = 1" >>/etc/php5/conf.d/pdo.ini
    2. php -m |grep mem memcached

    如果显示出该组件代表安装完成,配置完毕。

PHP 代码示例

示例1:基本的连接云数据库 Memcache 及 set/get 操作

  1. <?php
  2. $connect = new Memcached; //声明一个新的memcached链接
  3. $connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
  4. $connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二进制协议
  5. $connect->setOption(Memcached::OPT_TCP_NODELAY, true); //重要,php memcached有个bug,当get的值不存在,有固定40ms延迟,开启这个参数,可以避免这个bug
  6. $connect->addServer('aaaaaaaaaa.m.yyyyyyyyyyy.ocs.aliyuncs.com', 11211); //添加OCS实例地址及端口号
  7. $connect->setSaslAuthData('aaaaaaaaaa', 'password'); //设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤;新版OCS的username为实例id
  8. $connect->set("hello", "world");
  9. echo 'hello: ',$connect->get("hello");
  10. $connect->quit();
  11. ?>

示例2:在云数据库 Memcache 中缓存一个数组

  1. <?php
  2. $connect= new Memcached; //声明一个新的memcached链接
  3. $connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
  4. $connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true);//使用binary二进制协议
  5. $connect->setOption(Memcached::OPT_TCP_NODELAY, true); //重要,php memcached有个bug,当get的值不存在,有固定40ms延迟,开启这个参数,可以避免这个bug
  6. $connect->addServer('xxxxxxxx.m.yyyyyyyy.ocs.aliyuncs.com', 11211);//添加OCS实例地址及端口号
  7. $connect->setSaslAuthData('xxxxxxxx', 'bbbbbbbb');//设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤
  8. $user = array(
  9. "name" => "ocs",
  10. "age" => 1,
  11. "sex" => "male"
  12. ); //声明一组数组
  13. $expire = 60; //设置过期时间
  14. test($connect->set('your_name',$user,$expire), true, 'Set cache failed');
  15. if($connect->get('your_name')){
  16. $result =$connect->get('your_name');
  17. }else{
  18. echo "Return code:", $connect->getResultCode();
  19. echo "Retucn Message:", $connect->getResultMessage (); //如出现错误,解析出返回码
  20. $result=" ";
  21. }
  22. print_r($result);
  23. $connect->quit();
  24. function test($val, $expect, $msg)
  25. {
  26. if($val!= $expect) throw new Exception($msg);
  27. }
  28. ?>

示例3:云数据库 Memcache 与 MySQL 数据库结合使用

  1. <?php
  2. $connect = new Memcached; //声明一个新的memcached链接
  3. $connect->setOption(Memcached::OPT_COMPRESSION, false);//关闭压缩功能
  4. $connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true);//使用binary二进制协议
  5. $connect->setOption(Memcached::OPT_TCP_NODELAY, true); //重要,php memcached有个bug,当get的值不存在,有固定40ms延迟,开启这个参数,可以避免这个bug
  6. $connect->addServer('xxxxxx.m.yyyyyyyy.ocs.aliyuncs.com', 11211);//添加实例地址 端口号
  7. $connect->setSaslAuthData('xxxxxx', 'my_passwd');//设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤
  8. $user = array(
  9. "name" => "ocs",
  10. "age" => 1,
  11. "sex" => "male"
  12. ); //定义一组数组
  13. if($connect->get('your_name'))
  14. {
  15. $result =$connect->get('your_name');
  16. print_r($result);
  17. echo "Found in OCS, get data from OCS"; //如果获取到数据,则打印此数据来源于OCS
  18. exit;
  19. }
  20. else
  21. {
  22. echo "Return code:", $connect->getResultCode();
  23. echo "Retucn Message:", $connect->getResultMessage ();//抛出code返回码
  24. $db_host='zzzzzz.mysql.rds.aliyuncs.com'; //数据库地址
  25. $db_name='my_db'; //database name
  26. $db_username='db_user'; //数据库用户名
  27. $db_password='db_passwd';//数据库用户密码
  28. $connection=mysql_connect($db_host,$db_username,$db_password);
  29. if (!mysql_select_db($db_name, $connection))
  30. {
  31. echo 'Could not select database'; //数据库连接不成功则抛出错误信息
  32. exit;
  33. }
  34. $sql = "SELECT name,age,sex FROM test1 WHERE name = 'ocs'";
  35. $result = mysql_query($sql, $connection);
  36. while ($row = mysql_fetch_assoc($result))
  37. {
  38. $user = array(
  39. "name" => $row["name"],
  40. "age" => $row["age"],
  41. "sex" => $row["sex"],
  42. );
  43. $expire = 5; //设置数据在缓存中的过期时间
  44. test($connect->set('your_name',$user,$expire), true, 'Set cache failed'); //写入OCS缓存
  45. }
  46. mysql_free_result($result);
  47. mysql_close($connection);
  48. }
  49. print_r($connect->get('your_name')); //打印出 获取到的数据
  50. echo "Not Found in OCS,get data from MySQL"; //确认从数据库获取的数据
  51. $connect->quit();
  52. function test($val, $expect, $msg)
  53. {
  54. if($val!= $expect) throw new Exception($msg);
  55. }
  56. ?>
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

-----