主頁 > 軟體設計 > 運維實戰 LNMP框架安裝

運維實戰 LNMP框架安裝

2021-04-15 10:17:40 軟體設計

運維實戰 LNMP框架

  • 架構簡介
  • 前期準備
    • MySQL的安裝
    • MySQL的初始化
    • PHP的安裝
      • 引數的含義
    • Nginx與PHP的對接
    • PHPMyAdmin的安裝與配置
    • Memcache的安裝與配置
    • 構建Nginx高速快取
    • Tomcat結合Memcache
  • 操作記錄
    • MySQL初始化
    • Memcache的安裝與配置

架構簡介

LAMP=Linux+Apache+Mysql+PHP
LNMP=Linux+Nginx+Mysql+PHP

LAMP是一個多C/S架構的平臺,雖然這些開放源代碼程式本身并不是專門設計成同另幾個程式一起作業的,但由于它們的免費和開源,慢慢的被組合成為了一種解決方案.

實際上其中的每一個部分還可以根據業務或者作業系統需求進行調換,如Linux也可以改成Windows,Apache改為Nginx就變成了LNMP架構等等,這里采用了Nginx因此簡稱也就改成了LNMP.

專案所需打包檔案

前期準備

MySQL的安裝

這里使用的是社區版本mysql-boost-5.7.31,原因只是因為5.7在生產環境中用的更多而已.

與之前的類似不過這里解壓后會發現沒有configure,因為MySQL使用的是cmake而不是make.

##安裝cmake
yum install -y cmake

##如果程序中出錯則安裝缺失的依賴包
##重新執行編譯前請清楚cmake產生的快取檔案避免從停止處開始導致出現錯誤
yum install -y ncurses-devel.x86_64 
yum install -y gcc-c++
yum install -y bison
rm -fr CMakeCache.txt

##編譯
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DWITH_BOOST=/mnt/mysql-5.7.31/boost/boost_1_59_0

##引數解釋
DCMAKE_INSTALL_PREFIX						安裝路徑
DMYSQL_DATADIR								資料庫存放目錄
DMYSQL_UNIX_ADDR							Unix Socket檔案路徑
DWITH_INNOBASE_STORAGE_ENGINE				加載的資料庫引擎
DDEFAULT_CHARSET							受用UTF-8字符
DDEFAULT_COLLATION							檢驗UTF-8字符
DEXTRA_CHARSETS								安裝字符集選項(選擇所有)
DWITH_BOOST									指定Boost擴展原始碼路徑

##安裝
make && make install

##需要注意的檔案
/usr/local/mysql/support-files/mysql.server		啟動腳本
/etc/my.cnf										全域組態檔

MySQL的初始化

##復制啟動腳本到init.d并為以后的使用做準備
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/
mv /etc/init.d/mysql.server /etc/init.d/mysqld

##創建供MySQL使用的系統用戶mysql,指定加目錄并設定免登錄
useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql

##修改my.cnf,正確設定其中的資料目錄和socket位置
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0

##初始化資料目錄并指定私有用戶
##因為使用的命令位于/usr/local/mysql/bin中,為了便于以后使用我們修改.bash_profile中的系統變數并使之生效
##初始化時會生成隨機密碼,記錄下來下文會使用
vim ~/.bash_profile 
source ~/.bash_profile
mysqld --initialize --user=mysql

##啟動MySQL,為了進行安全初始化
/etc/init.d/mysqld start
mysql_secure_installation

##初始化結束后,就可以正常使用了
mysql -pwestos

PHP的安裝

目前生產環境PHP主流依然是用7,因此這里也用7作為實驗版本.

##安裝bzip2并解壓原始碼包
yum install -y bzip2
tar jxf php-7.4.12.tar.bz2 

##編譯安裝
cd php-7.4.12/
./configure --prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx  --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-inline-optimization --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring  --enable-bcmath --with-fpm-systemd

make
make install

##如果缺少依賴則進行安裝
yum install systemd-libs.x86_64 -y
yum install libxml2-devel.x86_64 -y
yum install sqlite-devel.x86_64 -y
yum install libcurl-devel.x86_64 -y
yum install libpng-devel.x86_64 -y

##缺少oniguruma-devel-6.8.2-1.el7.x86_64但是官方源并不包含
##從網路獨立下載符合需求的版本后安裝
yum install -y oniguruma-*

引數的含義

--prefix						安裝路徑

--with-config-file-path			主組態檔目錄

--enable-fpm					激活FPM的管理器

--with-fpm-user=nginx			以nginx身份運行,如果不設定則默認用戶為Apache

--with-curl						啟用curl模塊

--with-iconv					啟用iconv

--with-mhash 					啟用M哈希加密

--enable-mysqlnd 				啟用mysqlnd驅動

--with-mysqli 					啟用mysqli驅動

--disable-debug 				關閉debug

--enable-soap 					啟用soap動態模塊

--enable-inline-optimization	性能優化

--with-fpm-systemd 				生成systemd的啟動腳本
##添加/usr/local/lnmp/php/sbin進環境變數并激活
vim ~/.bash_profile 
source ~/.bash_profile

##使用模板撰寫組態檔
cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf
cp /usr/local/lnmp/php/etc/php-fpm.d/www.conf.default /usr/local/lnmp/php/etc/php-fpm.d/www.conf
vim php-fpm.conf
vim www.conf

##從原始碼包復制主組態檔模板并修改
cp /mnt/php-7.4.12/php.ini-production /usr/local/lnmp/php/etc/php.ini

##從原始碼包復制init.d需要的啟動腳本
##從原始碼包復制systemd需要的service檔案
cp /mnt/php-7.4.12/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm 
cp /mnt/php-7.4.12/sapi/fpm/php-fpm.service /usr/lib/systemd/system

##啟動方式
1)
/etc/init.d/php-fpm start
/etc/init.d/php-fpm stop
2)
systemctl daemon-reload 
systemctl start php-fpm.service 

如果直接使用systemctl start php-fpm.service會發現執行出錯,原因是系統啟用了保護,編輯php-fpm.service即可

vim php-fpm.service 

##注釋掉ProtectSystem
;ProtectSystem=full

systemctl daemon-reload 
systemctl start php-fpm.service 

修改php.ini,調整時區

vim php.ini
timeZone		Asia/Shanghai

這里由于使用的是原始碼編譯且開啟了FPM支持,因此安裝的軟體是支持FastCGI的.

CGI相比,FastCGI更快且有常駐后臺,回應更快且能實作平滑加載.

采用編譯方式安裝的原因也是如此.

Nginx與PHP的對接

經過剛才的實驗其實你已經可以通過訪問9000埠來訪問本機開啟的PHP測驗頁面了

但日常使用中我們顯然沒有這樣操作.

通過Nginx實作埠轉發明顯更加符合使用習慣.

但首先讓我們寫一個nginx.service方便啟動,官方已經提供了內容我們直接復制即可.

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

但如果你和我一樣將nginx獨立再/usr/local中使用了目錄,那么你應該修改上文的目錄,如下所示

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

之后測驗其運行情況

vim nginx.service
systemctl enable --now nginx.service
  • 更改nginx的組態檔,實作對于.php檔案的支持以及反向代理
  • 撰寫php測驗頁
vim /usr/local/nginx/conf/nginx.conf

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

location ~ \.php$ {
	root			html;
	fastcgi_pass	172.0.0.1:9000;
	fastcgi_index	index.php;
	#fastcgi_param	SCRIPT_FILENAME /scripts$fastcgi_script_name;
	include			fastcgi.conf;
}
vim index.php

<?php
phpinfo()
?>

PHP測驗頁面
同時,還應該修改php.ini中socket項的設定來實作與MySQL的對接.

##查看socket項的位置和權限
ll /usr/local/mysql/data/mysql.sock
srwxrwxrwx 1 mysql mysql 0 Apr  8 09:27 /usr/local/mysql/data/mysql.sock
##同時可以發現其所在目錄的other并沒有權限,因此nginx用戶無法呼叫它
ll /usr/local/mysql/data/ -d
drwxr-x--- 5 mysql mysql 4096 Apr  8 09:27 /usr/local/mysql/data/
##修改權限為775
chmod 775 /usr/local/mysql/data/

PHPMyAdmin的安裝與配置

unzip phpMyAdmin-5.0.2-all-languages.zip 
mv phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/phpMyAdmin
cd /usr/local/nginx/html/phpMyAdmin
vim conf/nginx.conf
systemctl reload nginx.service 

如果上文不修改mysql.sock所在目錄的權限則這里會出現登陸失敗的情況,修改則不會.
登陸權限失敗
正確賦予權限則登陸成功

Memcache的安裝與配置

Memcache是一種nosql資料庫,運行在記憶體中,擁有快取命中率高的特點.

默認運行埠11211,默認記憶體占用64M

##解壓原始碼包安裝依賴并執行編譯安裝,需要用到php目錄下的bin中的命令因此需要修改環境變數
tar zxf memcache-4.0.5.2.tgz 
cd memcache-4.0.5.2/
yum install autoconf
vim ~/.bash_profile 
source ~/.bash_profile 
cd ../memcache-4.0.5.2/
phpize 
./configure --enable-memcache
make
make install

##安裝完成后修改php主組態檔開啟插件,實作對memcache的支持
cd /usr/local/lnmp/php/etc/
vim php.ini 

extension=memcache

systemctl reload php-fpm.service 

yum install -y memcached
systemctl start memcached.service 

##查看組態檔可以看到其設定埠11211和記憶體占用64M
cat /etc/sysconfig/memcached 

##Memcache同時也提供簡易的監控頁面
##復制原始碼包中的測驗頁面和監控頁面到nginx發布目錄下
##修改監控頁面內容實作更改登錄資訊和memcache位置
cp /mnt//memcache-4.0.5.2/example.php /usr/local/nginx/html/
cp /mnt//memcache-4.0.5.2/memcache.php /usr/local/nginx/html/
vim /usr/local/nginx/html/memcache.php 
systemctl reload nginx.service 

自帶簡易監控界面

自定義memcache登陸賬號密碼

構建Nginx高速快取

OpenrestyNginx的一個發行版,增加對lua腳本的支持,同樣運行在80埠上,因此開啟時要注意80埠的占用情況.

在安裝Memcache后傳統快取策略是:

Client請求Nginx , Nginx使用fastcgi連接php-fpm, sapiphp互動.當存在快取時使用Memcache中的快取,不存在時查詢資料庫.

但這樣相當于沒有有效利用Nginx的高并發,請求的生命周期取決于請求到php之后的部分.

如果能夠實作 當Client請求Nginx時,Memcache快取命中則直接回傳,未命中才進行后續操作并存盤Memcache快取,顯然更加高效.

tar zxf openresty-1.19.3.1.tar.gz 
cd openresty-1.19.3.1/
./configure --prefix=/usr/local/openresty --with-http_ssl_module --with-http_stub_status_module
make
make install
systemctl stop nginx.service 
vim /usr/local/openresty/nginx/conf/nginx.conf
/usr/local/openresty/nginx/sbin/nginx -t
cp /usr/local/nginx/html/example.php .
cp /usr/local/nginx/html/memcache.php .
cp /usr/local/nginx/html/index.php .
/usr/local/openresty/nginx/sbin/nginx -s start

高效快取

upstream memcache {
        server 127.0.0.1:11211;
        keepalive 512;					//保持512個不立即關閉的連接用于提升性能
        }
        
location /memc {
        internal;						//表示只接受內部訪問
        memc_connect_timeout 100ms;
        memc_send_timeout 100ms;
        memc_read_timeout 100ms;
        set $memc_key $query_string;	//使用內置的$query_string來作為key
        set $memc_exptime 300;			//表示快取失效時間
        memc_pass memcache;
        }
        
location ~ \.php$ {
            set $key $uri$args;		
            srcache_fetch GET /memc $key;	
            srcache_store PUT /memc $key;
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

當所請求的url以“.php”結尾時,首先到Memcache中查詢有沒有以$uri$argskey的資料,如果有則直接回傳;否則執行location的邏輯,如果回傳的http狀態碼為200,則在輸出前以$uri$args為key,將輸入結果存入Memcache.

##進行壓力測驗
ab -c10 -n500

可以看到,當存在Memcache高速快取時壓力測驗每秒的通過數顯然更高.

Tomcat結合Memcache

上文中作為動態語言的PHP已經實作了與nginx的對接,這里來測驗jsp的對接情況.

首先需要安裝Tomcat.

Tomcat并不適合高并發,當流量過大時會有卡死的風險.

一般通過外部使用nginx進行調度和負載均衡,內部多開幾個Tomcat來實作性能提高.

但同時Memcache沒有集群的概念,無法通過借助集群等概念實作高可用和健康管理.

因此采用交叉存盤的邏輯來實作.

##舉例
一臺Nginx對應兩個Tomcat,分別位于兩臺主機上,稱為T1和T2
兩臺主機上同時存在2個Memcache,分別成為M1和M2
將T1的資料優先存在M2中,T2的資料優先存在M1中,稱為交叉存盤.

當T1出現問題時,Nginx通過健康管理將所有資料調度到T2,由于session保持的原因,之后的資料可以繼續寫入M2而不是M1.
當M2出現問題時,T1將本身的資料寫入備用的M1,之后的資料也都寫入M1,Y也實作了可持續使用.
  • 安裝Tomcat并配置
  • 復制測驗用的test.jspTomcat發布目錄并正常訪問
  • 配置Nginx(這里使用原版)的組態檔實作反向代理.jsp結尾的訪問到8080埠
  • Server2上也正確配置Tomcat
  • 在兩者的Tomcat中分別配置與Memcache的規則
  • 復制需要用到的jar包到/usr/local/tomcat/lib
  • Nginx中配置負載均衡
  • 重啟Tomcat, Memcache, Nginx
rpm -ivh jdk-8u121-linux-x64.rpm 
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
cd /usr/local/
ln -s apache-tomcat-7.0.37/ tomcat
cd tomcat/

##拷貝jar包到/usr/local/tomcat/lib目錄

##啟動和關閉腳本
bin/startup.sh 
bin/shutdown.sh 

##發布目錄
/usr/local/tomcat/webapps/ROOT/

##編輯Tomcat組態檔
##當出現問題時才使用n1節點,即優先使用n2節點
vim context.xml 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.5.1:11211,n2:172.25.5.2:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

##增加.jsp反向代理規則
/usr/local/openresty/nginx/sbin/nginx -s stop
vim /usr/local/nginx/conf/nginx.conf
nginx -t
nginx -s reload

location ~ \.jsp$ {
	proxy_pass	http://127.0.0.1:8080;
}

##帶有負載均衡的版本
    upstream Tomcat {
    	sticky;
    	server 172.25.5.1:8080;
    	server 172.25.5.2:8080;
    }
    
location ~ \.jsp$ {
	proxy_pass	http://Tomcat;
}

Memcache反饋
JSP的反映情況
實作了Nginx的反代理
后端交叉成功
down吊server1的情況
down掉M2的情況
使用Telnet查看保存的內容
由于Nosql采用鍵值對的方式進行存盤,直接查看ID即可看到加密的內容.

yum install telnet -y

[root@Server1 conf]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get 9FF0EA3C09605E9431D467D0D0852001-n1
VALUE 9FF0EA3C09605E9431D467D0D0852001-n1 2048 125
Wx����x���01x����x����#9FF0EA3C09605E9431D467D0D0852001-n1user1111user2222user3333
END

操作記錄

MySQL初始化

[root@Server1 mnt]# cd /usr/local/mysql/support-files/
[root@Server1 support-files]# ls
magic  mysqld_multi.server  mysql-log-rotate  mysql.server

##這里的mysql.server即為MySQL的啟動腳本

##初始化資料目錄并設定私有用戶
[root@Server1 init.d]# mysqld --initialize --user=mysql
2021-04-08T01:26:39.551569Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2021-04-08T01:26:39.954469Z 0 [Warning] InnoDB: New log files created, LSN=45790
2021-04-08T01:26:40.016385Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2021-04-08T01:26:40.078251Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 7806f80a-9809-11eb-ac50-52540079f81b.
2021-04-08T01:26:40.080460Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2021-04-08T01:26:40.363615Z 0 [Warning] CA certificate ca.pem is self signed.
2021-04-08T01:26:40.393868Z 1 [Note] A temporary password is generated for root@localhost: q/XmkIJ,e531

##啟動MySQL
[root@Server1 init.d]# ./mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/Server1.err'.
SUCCESS! 

##可以看到其正確啟動,運行在3306埠(使用netstat)
[root@Server1 init.d]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql     3733  0.9 17.5 1600940 177744 pts/0  Sl   09:27   0:00 /usr/local/mysql

##進行安全初始化,需要用到上文初始化資料目錄時生成的密碼
[root@Server1 init.d]# mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: 
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

 - Dropping test database...
   Success.

 - Removing privileges on test database...
   Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

##安裝及初始化結束,MySQL可以正常使用
[root@Server1 init.d]# mysql -pwestos
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.31 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> exit
Bye

Memcache的安裝與配置

[root@Server1 nginx]# cd /mnt/
[root@Server1 mnt]# tar zxf memcache-4.0.5.2.tgz 
[root@Server1 mnt]# cd memcache-4.0.5.2/
[root@Server1 memcache-4.0.5.2]# yum install autoconf
[root@Server1 memcache-4.0.5.2]# vim ~/.bash_profile 
[root@Server1 memcache-4.0.5.2]# source ~/.bash_profile 
[root@Server1 php-7.4.12]# cd ../memcache-4.0.5.2/
[root@Server1 memcache-4.0.5.2]# phpize 
[root@Server1 memcache-4.0.5.2]# ./configure --enable-memcache
[root@Server1 memcache-4.0.5.2]# make
[root@Server1 memcache-4.0.5.2]# make install
[root@Server1 memcache-4.0.5.2]# cd /usr/local/lnmp/php/lib/php/extensions/no-debug-non-zts-20190902/
[root@Server1 no-debug-non-zts-20190902]# ls
memcache.so  opcache.a  opcache.so
[root@Server1 no-debug-non-zts-20190902]# cd /usr/local/lnmp/php/etc/
[root@Server1 etc]# vim php.ini 
[root@Server1 etc]# systemctl reload php-fpm.service 
[root@Server1 etc]# php -m | grep memcache
memcache
[root@Server1 etc]# yum install -y memcached
[root@Server1 etc]# systemctl start memcached.service 
[root@Server1 etc]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
[root@Server1 etc]# cd /mnt/memcache-4.0.5.2/
[root@Server1 memcache-4.0.5.2]# cp example.php /usr/local/nginx/html/
[root@Server1 memcache-4.0.5.2]# cat example.php 
<?php

$memcache = memcache_connect('localhost', 11211);

if ($memcache) {
	$memcache->set("str_key", "String to store in memcached");
	$memcache->set("num_key", 123);

	$object = new StdClass;
	$object->attribute = 'test';
	$memcache->set("obj_key", $object);

	$array = Array('assoc'=>123, 345, 567);
	$memcache->set("arr_key", $array);

	var_dump($memcache->get('str_key'));
	var_dump($memcache->get('num_key'));
	var_dump($memcache->get('obj_key'));
}
else {
	echo "Connection to memcached failed";
}
?>

[root@Server1 memcache-4.0.5.2]# cp memcache.php /usr/local/nginx/html/
[root@Server1 memcache-4.0.5.2]# systemctl reload nginx.service 

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/276166.html

標籤:其他

上一篇:初步了解MyBatis

下一篇:云原生勢不可擋,華為云GaussDB加速企業數字化轉型

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more