swoole 学习之旅

1.php7源码安装

1).获取源码
	wget http://59.80.44.98/cn2.php.net/distributions/php-7.3.2.tar.gz
2).解压
	tar -xjf php-7.2.10.tar.bz2
	cd php-7.2.10
3).配置
	./configure --prefix=/usr/local/php
	
	遇到问题:
		yum install libxml2-devel -y
4).make && make install

5).设置PHP的执行方式 取别名
	a.Linux下环境变量配置
		(1).修改/etc/profile文件
		
			vim /etc/profile
			
			export PATH=$PATH:/usr/local/php/bin
			
			source  /etc/profile
		(2).修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别
		
			vim /root/.bashrc
			
			export PATH=$PATH:/usr/local/php/bin
			
			source  /root/.bashrc
			
		####################################################################################
			/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
			/etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
			~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
			~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
			~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
			 
			另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
		########################################################################################
		
			这里采用
				vi ~/.bash_profile
					alias php=/usr/local/php/bin/php
				source ~/.bash_profile//通知一下这个文件
6).踩坑
	a.首先要有gcc autoconfig
	
	b.php.ini的位置 
	
		使用 php -i|grep php.ini 查找PHP使用的配置文件在哪
		cp 源码目录/php.ini-production /usr/local/php/lib/php.ini
		cp 源码目录/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

2.安装swoole扩展
1).获取源码
没有Git 先安装 yum install git-core
git clone https://gitee.com/swoole/swoole.git

2).进入swoole源码目录 生成configure
	执行 
	/usr/local/php/bin/phpize
3).配置
	./configure --with-php-config=/usr/local/php/bin/php-config
	
	遇到问题:
		a.configure: error: C++ preprocessor "/lib/cpp" fails sanity check
		解决办法:
		
		yum install glibc-headers
		yum install gcc-c++
		b.Cannot find autoconf. Please check your autoconf installation and the
			$PHP_AUTOCONF environment variable. Then, rerun this script.

		解决办法:yum -y  install autoconf
4).make && make install

5).修改
	vi php.ini 
6).测试
	a.命令行测试
	
		cd /data/soft/swoole/examples/server
		
		php echo.php
		
		##############################################################
			查看端口占用
			 提前安装
			 yum install net-tools
			 
			 执行命令
			 netstat -anp|grep 9501	
	b.把虚拟机Linux目录映射到windows里 写代码测试
		
		(1).利用samba服务器映射
			
			安装 
				yum  install samba* --skip-broken
			
			配置
				vi /etc/samba/smb.conf
				
					[web]
						path = /data/www
						browseable = yes
						writable = Yes
			重启
				service smb restart
			
			设置跟随系统重启

3.创建tcp服务
1).写好服务文件
php tcp.php
2).查看服务是否启动

	a.方式一
		netstat -anp|grep 9501
	b.方式二 、启动新客户端 
		telnet 127.0.0.1 9501
		
		##################################################
			先检查是否安装: telnet-server和xinetd
				(1).rpm -qa telnet-server
				(2).rpm -qa xinetd
			没有则安装
				(1).yum list |grep telnet
				(2).yum list |grep xinetd
			执行安装:
				(1).yum -y install telnet-server.x86_64
				(2).yum -y install telnet.x86_64
				(3).yum -y install xinetd.x86_64
				
			设置开机启动:
	
				(1).systemctl enable xinetd.service
				
				(2).systemctl enable telnet.socket
			开启service:
				(1).systemctl start telnet.socket

				(2).systemctl start xinetd
			开启防火墙端口:

				(1).firewall-cmd --permanent --add-port=23/tcp
				
				(2).firewall-cmd --reload
		########################################################

3).关闭服务
	netstat -anp|grep 9501 
	kill 29309

4.tcp客户端
1).查看服务端开启了几个进程
ps aft|grep tcp.php

5.UDP服务
1).启动udp服务
2).测试是否启动成功
先安装nc
yum -y install nc

	nc -u 127.0.0.1 9502
	
3).用浏览器访问
	a.firewall-cmd --permanent --add-port=23/tcp
	b.firewall-cmd --reload
	c.192.168.1.16:8811

6.webSocket服务
1).

7.异步redis

	1.安装redis
		1).下载redis 
			http://120.52.51.19/download.redis.io/releases/redis-5.0.3.tar.gz
			
			tar -xvf redis-5.0.3.tar.gz 
			cd redis-5.0.3
			make
			cd src
			nohup ./redis-server & //	启动服务

	2.hiredis 库
		1).下载hiredis
			https://github.com/redis/hiredis/archive/v0.14.0.tar.gz
			
			tar -xzvf v0.14.0.tar.gz
			
			cd hiredis-0.14.0
			
			make -j
			
			make install
			
	3.从新编译swoole
		1).从新下载最新 https://github.com/swoole/swoole-src/releases
			a.https://github.com/swoole/swoole-src/archive/v4.2.12.tar.gz
			
			tar -xzvf v4.2.12.tar.gz
			
			cd swoole-src-4.2.12
			
			/usr/local/php/bin/phpize
			
			./configure --with-php-config=/usr/local/php/bin/php-config --enable-async-redis
			
			make clean
			
			make -j
			
			make install

8.Nginx代理
server {
root /data/www/es;
server_name es.com;
location / {
proxy_http_version 1.1;
proxy_set_header Connection “keep-alive”;
proxy_set_header X-Real-IP $remote_addr;
if (!-e $request_filename) {
proxy_pass http://127.0.0.1:9501;
}
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:9501;
}
}
}

9.重新编译 开启OpenSSL

		cd swoole-src-4.2.13
		
		/usr/local/php/bin/phpize
		
		./configure --with-php-config=/usr/local/php/bin/php-config --enable-async-redis --enable-openssl
		
		make clean
		
		make -j
		
		make install

10.mongodb
1).获取源码 安装MongoDB

	参考文章 https://blog.youkuaiyun.com/lu8000/article/details/83149063

	a.基本安装 & 配置
		wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.1.8.tgz
					
		tar -xzvf xxx
		
		mongodb-src-r4.1.8
		//将解压后的文件移动到  安装目录下
		mv mongodb-src-r4.1.8 /usr/local/mongodb
		//添加到 PATH 
		vi /etc/profile
			最后追加
				
			export MONGODB_HOME=/usr/local/mongodb
			 
			export PATH=$PATH:$MONGODB_HOME/bin
			
		source /etc/profile(立即生效)
	
	b.创建数据相关目录
	
		创建数据根目录
		mkdir /usr/local/mongodb/mongodb_data
		创建数据目录
		mkdir /usr/local/mongodb/mongodb_data/data
		创建日志目录
		mkdir /usr/local/mongodb/mongodb_data/log
		创建配置目录
		mkdir /usr/local/mongodb/mongodb_data/conf
		
		cd conf

		vim mongo.conf
		
			配置内容:
				
				dbpath=/usr/local/mongodb/mongodb_data/data #数据文件存放目录

				logpath=/usr/local/mongodb/mongodb_data/log/mongod.log #日志文件存放目录

				port=201910 #端口,默认201910,可以自定义

				logappend=true #开启日志追加添加日志

				fork=true #以守护程序的方式启用,即在后台运行

				bind_ip=0.0.0.0 #本地监听IP,0.0.0.0表示本地所有IP

				auth=true #是否需要验证权限登录(用户名和密码)


	c.启动 
		cd /usr/local/mongodb
		/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb_data/conf/mongo.conf
	d.关闭 
		pkill mongod
	
2).安装mongodb php 扩展
	参考文章https://blog.youkuaiyun.com/u010615629/article/details/80757079
	
	1).去https://pecl.php.net/package/mongodb 下载最新的扩展包
	
		这里下载了
		wget https://pecl.php.net/get/mongodb-1.6.0alpha1.tgz 
		
		tar -xzvf mongodb-1.6.0alpha1.tgz
		
		cd mongodb-1.6.0alpha1/
		//编译协程
		vim src/libmongoc/src/libmongoc/src/mongoc/mongoc-socket.c
		
			#include "mongoc/mongoc-counters-private.h"
			#include "mongoc/mongoc-errno-private.h"
			#include "mongoc/mongoc-socket-private.h"
			#include "mongoc/mongoc-host-list.h"
			#include "mongoc/mongoc-socket-private.h"
			#include "mongoc/mongoc-trace-private.h"
			#ifdef _WIN32
			#include <Mstcpip.h>
			#include <process.h>
			#endif
			#include "swoole/include/socket_hook.h" //加入这行
	
		//PHP配置
		/usr/local/php/bin/phpize
		
		./configure --with-php-config=/usr/local/php/bin/php-config 
		
		make -j 
		
		make install

		
		vi /usr/local/php/lib/php.ini
		
		在extension=swoole.so下方加入extension=mongodb.so
			
			
	3).连接使用
	
		a.使用mongo自带的mongo 来登录数据库
			./bin/mongo 127.0.0.1:27017
			
			*退出登录
				(1).kill -15 进程号 关闭client
				(2).
					use admin//切换到admin数据库
					db.shutdownServer()
				
			*基本命令
			
				//查看当前数据库中有哪些数据库
				show dbs 
				
				//删除数据库
				use test
				db.dropDatabase()
				
				//创建数据库
				use test_jqx
				
				//向集合写入数据 
				db.coupon.insert({title:'yifu'})
				
				//查看数据库中有哪些集合
				show collections
				
				
				//查看数据
				db.coupon.find()
				
				//插入指定 _id 的数据
				db.coupon.insert({title:'yifu',_id:1})
				
				//条件查询
				db.coupon.find({title:'yifu'})
				
				//使用js语法操作数据库插入多条数据
				for(let i=3;i<100;i++) {
					db.coupon.insert({title:'yifu'+i})
				}
				
				//统计数据
				db.coupon.find().count()
				
				//分页 排序
				db.coupon.find().skip(3).limit(5).sort({title:1})
				
				//更新 只会更新第一条查找到的数据
				db.activity.update({price:10},{price:12})//会覆盖其它字段
				
				db.activity.update({price:10},{$set:{info1:15}}) //其它字段不变 只改变Sset的字段
				
				db.activity.update({price:14},{prcie:25,info:48},true) //更新一条不存在的数据时 true 自动改为插入
				
				//更新所有的文档
				db.activity.update({prcie:25},{$set:{info:45,info1:31}},false,true) //更新字段只能在$set 下 args4 = true;
				
				//数据的删除
				db.activity.remove({price:12}) //删除一条
				
				//清空表
				db.activity.drop() //用show tables 看不到 activity
				
			*索引
				//查看索引
				db.coupon.getIndexes() 
				
				//创建索引
				db.coupon.ensureIndex({size:-1}) // 最好在创建数据表之前就创建好索引
				
				//索引的种类
				单建索引 多建索引
				
				db.coupon.insert({title:'maozi',size:[1,2,3,4,5]}) //size 多建索引
				
				//复合索引 
				db.coupon.insert({title:'pidai',size:[2,5],width:[8,9],color:'red'})
				db.coupon.ensureIndex({size:1,color:-1},{name:attr}) //创建复合索引 
				
				//过期索引 索引过期后数据会被删除 可以代替session
				db.user.insert({logintime:new Date(),name:'hh'}) //登陆一段时间后的索引logintime
				db.user.ensureIndex({logintime:1},{expireAfterSeconds:1000}) //1000秒后过期 logintime必须是 ISODate 数据类型 或者 ISODate数组,[ISODate1,ISODate2,ISODate3],按其最小时间进行过期删除,不能是复合索引,有时间误差60s
				
				//全文索引
				db.article.insert({author:'longge',title:'我是祖国的花朵哦',content:'花朵啥的算啥'})
				db.article.ensureIndex({author:'text'}) //创建一个字段的索引
				db.article.ensureIndex({author:'text',title:'text'})  // 多个字段的索引
				db.article.ensureIndex({"$**":'text'}) //全局的索引
				
				//索引的属性
				db.coupon.ensureIndex({size:1,color:-1},{name:attr}) //给索引指定名字
				db.coupon.ensureIndex({size:1,color:-1},{unique:true/false}) // 唯一性
				db.coupon.ensureIndex({width:1},{sparse:true/false}) //稀疏性 稀疏性用来处理 索引存在但文档中不存在的处理方法 [比如 第一条数据包含 color 第二条不包含 color 当sparse=true就不必为第二条创建索引]
				
				//$exists 属性存在的文档记录
				db.coupon.find({width:{$exists:1}})
				db.coupon.find({width:{$exists:1}}).hint("width_1") //强制使用索引
				
				db.coupon.find({width:{$exists:0}}).hint("width_1")//返回结果空 不能再稀疏索引上查找不存在的值
				
				
				//地理位置索引  2D平面索引 & 球面 2Dsphere索引 点
				
				db.location.createIndex({w:'2d'})//创建位置索引
				
				//$near 查询 距离某个点附近的点 $maxDistance  限制距离
				db.location.find({w:{$near:[1,1],$maxDistance:10}})
				
				//$geoWithin 查询某个形状内的点 
			
				db.location.find({w:{$geoWithin:{$box:[[0,1],[1,20]]}}}) //$box 矩形内
				
				db.location.find({w:{$geoWithin:{$center:[[2,30],10]}}}) //$center 圆圈内的点
				
				db.location.find({w:{$geoWithin:{$polygon:[[0,0],[20,20],[90,40]]}}}) //$polygon 多边形查询
				
				//geoNear 高级查询 db.runCommand
				db.runCommand(
				   {
					 geoNear: "location",
					 near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
					 spherical: true,
					 minDistance: 1,
					 maxDistance: 100
				   }
				)
				
				
				//2Dsphere索引
				
			*索引的合理评判
				1.使用工具 mongostat 查看mongo的状态
				2.profile集合
				3.日志
				4.explain分析
				
				//mongostat 开两个窗口 来测试
				./mongostat -h 127.0.0.1:27017 //实时抓取
				//
				./mongo 127.0.0.1:27017 //写个循环插入
					for(i=0;i<10000;i++) {
						db.
					}
				insert query update delete getmore command dirty used flushes vsize   res qrw arw net_in net_out conn                time
					*0    *0     *0     *0       0     2|0  0.0% 0.0%       0 1.43G 61.0M 0|0 1|0   159b   65.8k    2 Feb 16 22:04:13.175
					80    *0     *0     *0       0     1|0  0.0% 0.0%       0 1.43G 63.0M 0|0 1|0  12.6k   66.3k    2 Feb 16 22:04:14.218
				   513    *0     *0     *0       0     2|0  0.0% 0.1%       0 1.43G 67.0M 0|0 1|0  80.2k   91.5k    2 Feb 16 22:04:15.173
				   425    *0     *0     *0       0     1|0  0.1% 0.1%       0 1.43G 75.0M 0|0 1|0  66.5k   82.5k    2 Feb 16 22:04:16.205
				   439    *0     *0     *0       0     2|0  0.1% 0.1%       0 1.43G 81.0M 0|0 1|0  69.1k   85.6k    2 Feb 16 22:04:17.198
				   403    *0     *0     *0       0     2|0  0.1% 0.1%       0 1.43G 87.0M 0|0 1|0  63.4k   83.9k    2 Feb 16 22:04:18.193
				   467    *0     *0     *0       0     1|0  0.2% 0.2%       0 1.43G 87.0M 0|0 1|0  73.6k   86.2k    2 Feb 16 22:04:19.197
				   472    *0     *0     *0       0     2|0  0.2% 0.2%       1 1.43G 87.0M 0|0 1|0  74.4k   87.6k    2 Feb 16 22:04:20.183
				   474    *0     *0     *0       0     2|0  0.2% 0.2%       0 1.43G 87.0M 0|0 1|0  74.6k   86.7k    2 Feb 16 22:04:21.183
				   462    *0     *0     *0       0     2|0  0.2% 0.2%       0 1.43G 87.0M 0|0 1|0  72.8k   86.8k    2 Feb 16 22:04:22.173
				   
			   //profile 操作日志集合 用于测试阶段
			   db.getProfilingLevel() //查看记录日志的级别 0 :不记录 1 :记录超过slows值得记录 2:记录所有
			   db.setProfilingLevel(2)
			
			//系统日志 mongo.log
			在mongo.conf  
				verbose vvvvv //1~5 个 v 代表日志的详细程度
			
			
			//explain()
			db.user.find().explain()
			
		*安全隔离
			
		*创建用户
			参考文章:https://www.cnblogs.com/xiaopingfeng/p/7602439.html
			//添加
			db.createUser({user:'root',pwd:'root',roles:[{role:'userAdmin',db:"admin"},{role:'read',db:'test_jqx'}]})
			
			//聚抢先的用户	
			db.createUser({user:'jqxadmin',pwd:'adfddfa13396491234_!',roles:[{role:'userAdmin',db:"admin"},{role:'dbOwner',db:'jqx'}]})
				
			//修改
				db.updateUser('jqxadmin',{roles:[{role:'userAdmin',db:"admin"},{role:'dbOwner',db:'jqx'},{role:'dbOwner',db:'quan'},{role:'dbOwner',db:'seller'}]})
			//修改密码
			 db.changeUserPassword("jqxadmin","adfddfa13396491234_!")
			 
			
	4).	//加载php的MongoDB驱动
	composer mongo/mongo 
	遇到的问题  http://www.ericphp.cn/?p=336 参考文章
	1.删除操作系统中ipv6解析,删除/etc/hosts'中的'::1 localhost, 这一行

11.安装mbstring扩展

	1).进入PHP7源码目录
		/data/soft/php-7.2.10/ext/mbstring
		
		/usr/local/php/bin/phpize
		
		./configure --with-php-config=/usr/local/php/bin/php-config 	
		
		make && make install

/迁移*******/
导出
./mongodump -h 127.0.0.1 -d jqx -o /data/
导入
./mongorestore -h 127.0.0.1 -d jqx --dir /data/jqx
修改redis 内存
maxmemory =
maxmemory-policy volatile-lru

nohup /usr/local/redis-5.0.3/src/redis-server &

/*****************启动命令/
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb_data/conf/mongo.conf
systemctl restart mysqld.service
nohup /data/soft/redis-5.0.3/src/redis-server &
/usr/local/nginx/sbin/nginx
php /data/www/es/easyswoole start

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值