1、准备
# 安装之前先检查一下系统是否有默认安装的`apache`或者`php`
$ rpm -qa|grep httpd
$ rpm -qa|grep php
$ rpm -qa|grep mysql
# 把上面指令列出来的包删除
$ rpm -e ****(包名)
# 安装一些必备的包
$ yum -y install gcc gcc-c++ make screen wget net-tools curl python
$ screen -S bt
# 编译安装`hiredis`
$ git clone https://github.com/redis/hiredis.git
$ cd hiredis
$ make && make install
$ mkdir /usr/lib/hiredis
$ cp libhiredis.so /usr/lib/hiredis
$ mkdir /usr/include/hiredis
$ cp hiredis.h /usr/include/hiredis
$ echo '/usr/local/lib' >>/etc/ld.so.conf
$ ldconfig
2、修改CentOS
默认yum
源为国内yum
镜像源
- 备份
/etc/yum.repos.d/CentOS-Base.repo
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
- 下载
163
的yum
源配置文件到上面那个文件夹内$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
- 运行
yum makecache
生成缓存$ yum makecache
- 更新系统
$ yum -y update
3. 将已经挂载在 home
目录上的硬盘挂载到 data
目录上
$ df -h #(查看分区情况及数据盘名称)
$ mkdir /data #(如果没有data目录就创建,否则此步跳过)
$ umount /home #(卸载硬盘已挂载的home目录)
$ mount /dev/mapper/centos-home /data #(挂载到data目录)
$ vi /etc/fstab #(编辑fstab文件修改或添加,使重启后可以自动挂载)
$ mount /dev/mapper/centos-home /data ext3 auto 0 0
4. 交互式安装 OneinStack
- 安装
OneinStack
$ wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz $ tar xzf oneinstack-full.tar.gz $ cd oneinstack $ screen -S oneinstack # 如果网路出现中断,可以执行命令`screen -R oneinstack`重新连接安装窗口 $ ./install.sh # 安装 $ ./addons.sh # 添加附加组件 $ ./vhost.sh # 添加虚拟主机 $ ./pureftpd_vhost.sh # 管理FTP账号 $ ./backup_setup.sh # 备份 $ ./upgrade.sh # 更新版本 $ ./uninstall.sh # 卸载
- 管理服务
# webmin $ rpm -Uvh https://prdownloads.sourceforge.net/webadmin/webmin-1.881-1.noarch.rpm # Nginx/Tengine/OpenResty $ service nginx {start|stop|status|restart|reload|configtest} # MySQL/MariaDB/Percona: $ service mysqld {start|stop|restart|reload|status} # PostgreSQL $ service postgresql {start|stop|restart|status} # MongoDB $ service mongod {start|stop|status|restart|reload} # PHP $ service php-fpm {start|stop|restart|reload|status} # HHVM $ service supervisord {start|stop|status|restart|reload} # Apache $ service httpd {start|restart|stop} # Tomcat $ service tomcat {start|stop|status|restart} # Pure-Ftpd $ service pureftpd {start|stop|restart|status} # Redis $ service redis-server {start|stop|status|restart} # Memcached $ service memcached {start|stop|status|restart|reload}
5. 安装 Gearman
$ yum install -y uuid-devel libuuid libuuid-devel uuid boost-devel libevent libevent-devel gperf
$ wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz
$ tar zxvf gearmand-1.1.12.tar.gz
$ cd gearmand-1.1.12
$ ./configure --prefix=/usr/local/gearmand
$ make && make install
$ vi /etc/init.d/gearmand
#!/bin/bash
# chkconfig: - 85 15
#descrīption: service(/usr/local/gearmand/sbin/gearmand)
. /etc/rc.d/init.d/functions
start() {
echo -n $"Starting $prog"
echo -e " gearman : [确定]"
/usr/local/gearmand/sbin/gearmand &
sleep 1
echo -e "running..."
}
stop() {
echo -n $"Stopping $prog"
echo -e " gearman : [确定]"
kill -9 `ps -ef | grep "/usr/local/gearmand/sbin/gearmand" | awk '{print $2}' | awk 'NR==1'`
sleep 1
echo -e "stoped"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
ps -ef | grep "/usr/local/gearmand/sbin/gearmand"
;;
*)
echo $"Usage: $prog {start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0
$ chkconfig --add gearmand
$ chkconfig gearmand on
$ chkconfig --list
6. 安装 PostgreSQL
- 安装
$ yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm $ yum install postgresql96 postgresql96-server postgresql96-contrib postgresql96-devel postgresql96-libs
- 初始化
PostgreSQL
数据库$ mkdir /data/pgsql $ chown -R postgres:postgres /data/pgsql $ su postgres $ /usr/pgsql-9.6/bin/initdb -D /data/pgsql/data $ vi /usr/lib/systemd/system/postgresql-9.6.service Environment=PGDATA=/data/pgsql/data $ systemctl daemon-reload $ systemctl enable postgresql-9.6 $ systemctl start postgresql-9.6
- 配置默认
postgres
用户及密码并创建新的用户和数据库$ cd data $ su postgres $ createuser gadfly $ createdb gadfly_db $ psql psql (9.6) Type "help" for help. Postgres=# postgres=# \password postgres Enter new password: Enter it again: postgres=# CREATE EXTENSION adminpack; CREATE EXTENSION postgres=# alter user gadfly with encrypted password 'centos'; ALTER ROLE postgres=# grant all privileges on database gadfly_db to gadfly; GRANT postgres=# \q $ exit
- 配置
PostgreSQL
- 配置
PostgreSQL-MD5
认证$ vi /data/pgsql/data/pg_hba.conf # "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 192.168.1.0/24 md5 host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
- 配置
PostgreSQL-Configure TCP/IP
$ vi /data/pgsql/data/postgresql.conf [...] listen_addresses = '*’ [...] port = 5432 [...]
- 配置
- 安装
redis_fdw
外部表插件$ git clone -b REL9_6_STABLE https://github.com/pg-redis-fdw/redis_fdw.git $ cd redis_fdw $ export PATH=/usr/pgsql-9.6//bin:$PATH $ make USE_PGXS=1 $ make USE_PGXS=1 install $ su postgres bash-4.2$ psql -U postgres -d postgres postgres=# create extension redis_fdw; CREATE EXTENSION postgres=# CREATE SERVER redis_server postgres-# FOREIGN DATA WRAPPER redis_fdw postgres-# OPTIONS (address '127.0.0.1', port '6379'); CREATE SERVER postgres=# CREATE USER MAPPING FOR PUBLIC postgres-# SERVER redis_server postgres-# OPTIONS (password ''); CREATE USER MAPPING
redis_fdw
详细的用法介绍
1.CREATE SERVER
支持的option
(指定地址和端口)
address: The address or hostname of the Redis server. Default: 127.0.0.1 port: The port number on which the Redis server is listening. Default: 6379
2.CREATE USER MAPPING
支持的option
(指定密码)
password: The password to authenticate to the Redis server with. Default:
3.CREATE FOREIGN TABLE
支持的option
* 指定数据库ID
* 表类型(hash
,list
,set
,zset
或scalar
)
*key
前缀key
集合singleton_key
指定KEY
conf database: The numeric ID of the Redis database to query. Default: 0 tabletype: can be 'hash', 'list', 'set' or 'zset' Default: none, meaning only look at scalar values. tablekeyprefix: only get items whose names start with the prefix Default: none tablekeyset: fetch item names from the named set Default: none singleton_key: get all the values in the table from a single named object. Default: none, meaning don't just use a single object.
7. 安装MySQL 5.7
的UDF
函数
- 在
CentOS7
系统上安装mysql-udf-http
$ export PKG_CONFIG=/usr/bin/pkg-config $ export PKG_CONFIG_PATH=/usr/share/pkgconfig:/usr/lib/pkgconfig $ echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf $ /sbin/ldconfig $ git clone https://github.com/y-ken/mysql-udf-http.git $ cd mysql-udf-http $ chmod +x ./configure $ ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --prefix=/usr --libdir=/usr/local/mysql/lib/plugin $ make && make install $ cd ../
- 在
CentOS7
系统上安装mysql-udf-sys
$ git clone https://github.com/mysqludf/lib_mysqludf_sys.git $ cd lib_mysqludf_sys $ gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/local/mysql/include -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so $ cp lib_mysqludf_sys.so /usr/local/mysql/lib/plugin
- 在
CentOS7
系统上安装gearman-mysql-udf
$ wget https://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz $ tar xf gearman-mysql-udf-0.6.tar.gz -C ./ $ cd gearman-mysql-udf-0.6 $ ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --libdir=/usr/local/mysql/lib/plugin $ make && make install
- 创建
MySQL
自定义函数mysql> DROP FUNCTION IF EXISTS http_get; mysql> DROP FUNCTION IF EXISTS http_post; mysql> DROP FUNCTION IF EXISTS http_put; mysql> DROP FUNCTION IF EXISTS http_delete; mysql> create function http_get returns string soname 'mysql-udf-http.so'; mysql> create function http_post returns string soname 'mysql-udf-http.so'; mysql> create function http_put returns string soname 'mysql-udf-http.so'; mysql> create function http_delete returns string soname 'mysql-udf-http.so'; mysql> DROP FUNCTION IF EXISTS lib_mysqludf_sys_info; mysql> DROP FUNCTION IF EXISTS lib_mysqludf_sys_info; mysql> DROP FUNCTION IF EXISTS sys_set; mysql> DROP FUNCTION IF EXISTS sys_exec; mysql> DROP FUNCTION IF EXISTS sys_eval; mysql> CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so'; mysql> CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so'; mysql> CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so'; mysql> CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'; mysql> CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so'; mysql> DROP FUNCTION IF EXISTS gman_do_background; mysql> DROP FUNCTION IF EXISTS gman_servers_set; mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so'; mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
8. 安装RabbitMQ
-
安装Erlang
$ rpm --import https://packages.erlang-solutions.com/rpm/erlang_solutions.asc $ rpm -Uvh https://bintray.com/rabbitmq/rpm/download_file?file_path=erlang%2F21%2Fel%2F7%2Fx86_64%2Ferlang-21.0.2-1.el7.centos.x86_64.rpm
-
安装RabbitMQ
$ rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc $ wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el7.noarch.rpm $ yum install rabbitmq-server-3.7.7-1.el7.noarch.rpm
-
关于RabbitMQ的一些基本操作
$ chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务 $ service rabbitmq-server start # 启动服务 $ service rabbitmq-server status # 查看服务状态 $ service rabbitmq-server stop # 停止服务 # 查看当前所有用户 $ rabbitmqctl list_users # 查看默认guest用户的权限 $ rabbitmqctl list_user_permissions guest # 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户 $ rabbitmqctl delete_user guest # 添加新用户 $ rabbitmqctl add_user username password # 设置用户tag $ rabbitmqctl set_user_tags username administrator # 赋予用户默认vhost的全部操作权限 $ rabbitmqctl set_permissions -p / username ".*" ".*" ".*" # 查看用户的权限 $ rabbitmqctl list_user_permissions username
-
查看
RabbitMQ
日志- 日志中给出了
rabbitmq
启动的重要信息,如node
名,$home
目录,cookie
hash
值,日志文件,数据存储目录等; - 给出的信息会指出无配置文件(如下图),默认安装没有此文件
$ cat /var/log/rabbitmq/rabbit@rmq-node1.log
- 日志中给出了
-
开启web管理接口
通过浏览器访问 http://localhost:15672
shell $ rabbitmq-plugins enable rabbitmq_management
-
rabbitmq.conf
- 手工建目录,将配置样例文件拷贝到配置目录并改名
$ mkdir -p /etc/rabbitmq $ cp /usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
- 配置重启生效
$ systemctl restart rabbitmq-server
另外还可以建环境配置文件:
/etc/rabbitmq/rabbitmq-env.conf
- 手工建目录,将配置样例文件拷贝到配置目录并改名
-
设置
iptables
-
tcp4369
端口用于集群邻居发现; -
tcp5671
,5672
端口用于AMQP 0.9.1 and 1.0 clients
使用; -
tcp15672
端口用于http api
与rabbitadmin
访问,后者仅限在management plugin
开启时; -
tcp25672
端口用于erlang
分布式节点/工具通信
$ vi /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4369 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 5671 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 5672 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 15672 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 25672 -j ACCEPT $ service iptables restart
-
9、安装 kafka
-
安装
JDK
$ yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-javadoc $ vi /etc/profile export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin $ source /etc/profile #使配置文件立即生效
-
安装
zookeeper
$ cd /www/software $ wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz $ tar -zxvf zookeeper-3.4.9.tar.gz $ mv /www/software/zookeeper-3.4.9 /www/server/zookeeper $ vi /etc/profile export ZOOKEEPER_HOME=/www/server/zookeeper export PATH=$ZOOKEEPER_HOME/bin:$PATH export PATH $ source /etc/profile $ cd /www/server/zookeeper/conf $ cp zoo_sample.cfg zoo.cfg $ vi /www/server/zookeeper/conf/zoo.cfg # zookeeper 定义的基准时间间隔,单位:毫秒 tickTime=2000 # 数据文件夹 dataDir=/www/server/zookeeper/data # 日志文件夹 dataLogDir=/www/server/zookeeper/logs # 客户端访问 zookeeper 的端口号 clientPort=2181 $ /www/server/zookeeper/bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /www/server/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED # 安装 `zookeeper c client` $ cd /www/server/zookeeper/src/c $ ./configure $ make && make install
-
安装
kafka
$ cd /www/software $ wget https://archive.apache.org/dist/kafka/1.1.0/kafka_2.12-1.1.0.tgz $ tar -xzvf kafka_2.12-1.1.0.tgz $ mv /www/software/kafka_2.12-1.1.0 /www/server/kafka
-
配置
kafka
,修改server.properties
$ mkdir /www/wwwlogs/kafka #创建kafka日志目录 $ cd /www/server/kafka/config #进入配置目录 $ vi server.properties #编辑修改相应的参数 broker.id=0 port=9092 #端口号 host.name=192.168.137.254 #服务器IP地址,修改为自己的服务器IP log.dirs=/www/wwwlogs/kafka #日志存放路径,上面创建的目录 zookeeper.connect=localhost:2181 #zookeeper地址和端口,单机配置部署,localhost:2181
-
配置
kafka
下的zookeeper
$ mkdir /www/server/zookeeper #创建zookeeper目录 $ mkdir /www/wwwlogs/zookeeper #创建zookeeper日志目录 $ cd /www/server/kafka/config #进入配置目录 $ vi zookeeper.properties #编辑修改相应的参数 dataDir=/www/server/kafka/zookeeper #zookeeper数据目录 dataLogDir=/www/server/kafka/log/zookeeper #zookeeper日志目录 clientPort=2181 maxClientCnxns=100 tickTime=2000 initLimit=10
-
创建启动
kafka
脚本$ vi kafkastart.sh #!/bin/bash #启动zookeeper /www/server/kafka/bin/zookeeper-server-start.sh /www/server/kafka/config/zookeeper.properties & sleep 3 #等3秒后执行 #启动kafka /www/server/kafka/bin/kafka-server-start.sh /www/server/kafka/config/server.properties &
-
创建关闭
kafka
脚本$ vi kafkastop.sh #!/bin/bash #关闭zookeeper /www/server/kafka/bin/zookeeper-server-stop.sh /www/server/kafka/config/zookeeper.properties & sleep 3 #等3秒后执行 $ /www/server/kafka/bin/kafka-server-stop.sh /www/server/kafka/config/server.properties &
-
添加脚本执行权限
$ chmod +x kafkastart.sh $ chmod +x kafkastop.sh
-
设置脚本开机自动执行
$ vi /etc/rc.d/rc.local # 编辑,在最后添加一行 $ sh /www/server/kafka/kafkastart.sh & # 设置开机自动在后台运行脚本 $ sh /www/server/kafka/kafkastart.sh # 启动kafka $ sh /www/server/kafka/kafkastop.sh # 关闭kafka
-
-
测试
kafka
- 步骤1:启动
zookeeper
$ /www/server/zookeeper/bin/zkServer.sh start JMX enabled by default Using config: /home/laoyang/zookeeper/bin/../conf/zoo.cfg grep: /home/laoyang/zookeeper/bin/../conf/zoo.cfg: No such file or directory Starting zookeeper ... STARTED
- 步骤2:启动
kafka
$ ./kafkastart.sh
- 步骤3:测试创建
topic
$ cd /www/server/kafka/bin $ ./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
- 步骤4:通过
list
命令查看创建的topic
$ cd /www/server/kafka/bin $ ./kafka-topics.sh –list –zookeeper localhost:2181
- 步骤5:生产消息测试
$ ./kafka-console-producer.sh --broker-list localhost:9092 --topic test laoyang I love you!
- 步骤6:消费消息测试
$ ./kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning I'm laoyang #之前测试输入的内容 laoyang I love you!
经过以上6步,代表kafka安装成功。
- 停止
kafka
- 步骤1:停止
Kafka
$ cd /usr/local/kafka $ ./kafkastop.sh
- 步骤2:停止
Zookeeper server
$ /www/server/zookeeper/bin/zkServer.sh stop
- 步骤1:停止
- 步骤1:启动
10. 为 PHP
添加扩展
- 添加
PostgreSQL
扩展$ cd ~/oneinstack/src $ tar zxvf php-7.2.6.tar.gz $ cd php-7.2.6/ext/pgsql $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --with-pgsql=/usr/pgsql-9.6 $ make && make install
- 添加
PDO-PostgreSQL
扩展$ cd ~/oneinstack/src/php-7.2.6/ext/pdo_pgsql $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-pgsql=/usr/pgsql-9.6 $ make && make install
- 添加
Gearman
扩展$ git clone https://github.com/wcgallego/pecl-gearman.git $ cd pecl-gearman $ /usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --with-gearman=/usr/local/gearmand/ $ make && make install
- 添加rabbitmq扩展
- 安装rabbitmq-c
$ yum install libtool autoconf $ wget https://github.com/alanxz/rabbitmq-c/archive/v0.9.0.tar.gz $ tar zxvf v0.9.0.tar.gz $ cd rabbitmq-c-0.9.0/ $ autoreconf -i #这一步是在rabbitmq-c的根目录下创建一个build子目录 $ mkdir build && cd build # 这一步是让cmake根据../CMakeList.txt,即rabbitmq-c的根目录下的CMakeList.txt创建Makefile文件 # Makefile文件会被创建到build目录中 $ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c .. # 这一步是真正的build rabbitmq-c库的,注意,不要漏掉点 ‘.‘ $ cmake --build . --target install $ ln -s /usr/local/rabbitmq-c/lib64 /usr/local/rabbitmq-c/lib
- 安装amqp扩展
$ wget http://pecl.php.net/get/amqp-1.9.3.tgz $ tar zxvf amqp-1.9.3.tgz $ cd amqp-1.9.3 $ phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c $ make $ make install
- 安装rabbitmq-c
- 为
PHP
添加zookeeper
扩展- 为
PHP
添加libzookeeper
扩展$ git clone https://github.com/Timandes/libzookeeper.git $ cd libzookeeper $ /www/server/php/72/bin/phpize $ ./configure --with-php-config=/www/server/php/72/bin/php-config --with-libzookeeper=/usr/local/bin/cli_mt $ make && make install
- 为
PHP
添加zookeeper
扩展$ git clone -b php7 https://github.com/jbboehr/php-zookeeper.git $ cd /www/server/php-zookeeper $ /www/server/php/72/bin/phpize $ ./configure --with-php-config=/www/server/php/72/bin/php-config $ make && make install
- 为
- 配置
PHP
支持自定义扩展$ vi /usr/local/php/etc/php.d/90-pgsql.ini extension=pgsql.so extension=pdo_pgsql.so extension=gearman.so extension=amqp.so $ service httpd restart
11. Composer安装和使用
- 安装
Composer
# 下载composer.phar $ wget https://dl.laravel-china.org/composer.phar -O /usr/local/bin/composer # 把composer.phar移动到环境下让其变成可执行 $ chmod a+x /usr/local/bin/composer $ composer config -g repo.packagist composer https://packagist.phpcomposer.com # 测试 $ composer -V
- 使用
Composer
安装ThinkPHP 5.1
$ composer create-project topthink/think thinkphp5.1 --prefer-dist $ cd thinkphp5.1 $ composer require topthink/think-swoole $ composer require flc/alidayu $ composer require topthink/think-helper $ composer require topthink/think-image $ composer require topthink/think-captcha $ composer require nmred/kafka-php $ composer require adodb/adodb-php $ composer require phpoffice/phpspreadsheet $ composer require phpoffice/phpexcel $ composer require phpoffice/phpword $ composer require tecnickcom/tcpdf $ composer require mpdf/mpdf $ composer require gmars/tp5-qiniu $ composer require apache/log4php $ composer require ccampbell/chromephp $ composer require php-amqplib/php-amqplib
网友评论