呕心搜集总结的15个“swoole”常见问题(一)
一、升级Swoole版本
可以使用 pecl 进行安装和升级
pecl upgrade swoole
也可以直接从 github/gitee/pecl 下载一个新版本,重新安装编译。
- 更新 Swoole 版本,不需要卸载或者删除旧版本 Swoole,安装过程会覆盖旧版本
- Swoole 编译安装后没有额外的文件,仅有一个 swoole.so,如果是在其他机器编译好的二进制版本。直接互相覆盖 swoole.so,即可实现版本切换
- git clone 拉取的代码,执行 git pull 更新代码后,务必要再次执行 phpize、./configure、make clean、make install
- 也可以使用对应的 docker 去升级对应的 Swoole 版本
二、在phpinfo中有在php -m中没有
先确认 CLI 模式下是否有,命令行输入 php --ri swoole
如果输出了 Swoole 的扩展信息就说明你安装成功了!
99.999% 的人在此步成功就可以直接使用 swoole 了
不需要管 php -m 或者 phpinfo 网页打印出来是否有 swoole
因为 Swoole 是运行在 cli 模式下的,在传统的 fpm 模式下功能十分有限
fpm 模式下任何异步 / 协程等主要功能都不可以使用,99.999% 的人都不能在 fpm 模式下得到想要的东西,却纠结为什么 fpm 模式下没有扩展信息
先确定你是否真正理解了 Swoole 的运行模式,再继续追究安装信息问题!
原因
编译安装完 Swoole 后,在 php-fpm/apache 的 phpinfo 页面中有,在命令行的 php -m 中没有,原因可能是 cli/php-fpm/apache 使用不同的 php.ini 配置
解决办法
1.确认 php.ini 的位置
在 cli 命令行下执行 php -i | grep php.ini 或者 php --ini 找到 php.ini 的绝对路径
php-fpm/apache 则是查看 phpinfo 页面找到 php.ini 的绝对路径
2.查看对应 php.ini 是否有 extension=swoole.so
cat /path/to/php.ini | grep swoole.so
三、pcre.h:No such file or directory
编译 Swoole 扩展出现
fatal error: pcre.h: No such file or directory
原因是缺少 pcre,需要安装 libpcre
ubuntu/debian
sudo apt-get install libpcre3 libpcre3-dev
centos/redhat
sudo yum install pcre-devel
其他Linux
到 PCRE官方网站 下载源码包,编译安装 pcre 库。
安装好 PCRE 库后需要重新编译安装 swoole,然后使用 php --ri swoole 查看 swoole 扩展相关信息中是否有 pcre => enabled
四、'__builtin_saddl_overflow' was not declared in this scope
error: '__builtin_saddl_overflow' was not declared in this scope
if (UNEXPECTED(__builtin_saddl_overflow(Z_LVAL_P(op1), 1, &lresult))) { note: in definition of macro 'UNEXPECTED'
# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)
这是一个已知的问题。问题是 CentOS 上的默认 gcc 缺少必需的定义,即使在升级 gcc 之后,PECL 也会找到旧的编译器。
要安装驱动程序,必须首先通过安装 devtoolset 集合来升级 gcc,如下所示:
sudo yum install centos-release-scl
sudo yum install devtoolset-7
scl enable devtoolset-7 bash
五、fatal error: 'openssl/ssl.h' file not found
请在编译时增加 --with-openssl-dir 参数指定 openssl 库的路径
使用 pecl 安装 Swoole 时,如果要开启 openssl 也可以增加 --with-openssl-dir 参数,如:enable openssl support? [no] : yes --with-openssl-dir=/opt/openssl/
六、make 或 make install 无法执行或编译错误
NOTICE: PHP message: PHP Warning: PHP Startup: swoole: Unable to initialize module
Module compiled with module API=20090626
PHP compiled with module API=20121212
These options need to match
in Unknown on line 0
PHP 版本和编译时使用的 phpize 和 php-config 不对应,需要使用绝对路径来进行编译,以及使用绝对路径来执行 PHP。
/usr/local/php-5.4.17/bin/phpize
./configure --with-php-config=/usr/local/php-5.4.17/bin/php-config /usr/local/php-5.4.17/bin/php server.php
七、安装xdebug
git clone git@github.com:swoole/sdebug.git -b sdebug_2_9 --depth=1 cd sdebug phpize
./configure
make clean
make
make install #如果你的phpize、php-config等配置文件都是默认的,那么可以直接执行
./rebuild.sh
修改 php.ini 加载扩展,加入以下信息
zend_extension=xdebug.so
查看是否加载成功
php --ri sdebug
八、Swoole性能如何
QPS 对比
使用 Apache-Bench 工具 (ab) 对 Nginx 静态页、Golang HTTP 程序、PHP7+Swoole HTTP 程序进行压力测试。在同一台机器上,进行并发 100 共 100 万次 HTTP 请求的基准测试中,QPS 对比如下:
软件QPS软件版本Nginx164489.92nginx/1.4.6 (Ubuntu)Golang166838.68go version go1.5.2 linux/amd64PHP7+Swoole287104.12Swoole-1.7.22-alphaNginx-1.9.9245058.70nginx/1.9.9
注:Nginx-1.9.9 的测试中,已关闭 access_log,启用 open_file_cache 缓存静态文件到内存
测试环境
- CPU:Intel® Core™ i5-4590 CPU @ 3.30GHz × 4
- 内存:16G
- 磁盘:128G SSD
- 操作系统:Ubuntu14.04 (Linux 3.16.0-55-generic)
压测方法
ab -c 100 -n 1000000 -k http://127.0.0.1:8080/
VHOST 配置
server {
listen 80 default_server;
root /data/webroot;
index index.html;
}
测试页面
<h1>Hello World!</h1>
进程数量
Nginx 开启了 4 个 Worker 进程
htf@htf-All-Series:~/soft/php-7.0.0$ ps aux|grep nginx
root 1221 0.0 0.0 86300 3304 ? Ss 12月07 0:00 nginx: master process /usr/sbin/nginx
www-data 1222 0.0 0.0 87316 5440 ? S 12月07 0:44 nginx: worker process
www-data 1223 0.0 0.0 87184 5388 ? S 12月07 0:36 nginx: worker process
www-data 1224 0.0 0.0 87000 5520 ? S 12月07 0:40 nginx: worker process
www-data 1225 0.0 0.0 87524 5516 ? S 12月07 0:45 nginx: worker process
Golang
测试代码
package main import (
"log"
"net/http"
"runtime"
) func main() {
runtime.GOMAXPROCS(runtime.NumCPU() - 1) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Last-Modified", "Thu, 18 Jun 2015 10:24:27 GMT")
w.Header().Add("Accept-Ranges", "bytes")
w.Header().Add("E-Tag", "55829c5b-17")
w.Header().Add("Server", "golang-http-server")
w.Write([]byte("<h1>\nHello world!\n</h1>\n"))
}) log.Printf("Go http Server listen on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
PHP7+Swoole
PHP7 已启用 OpCache 加速器。
测试代码
$http = new Swoole\Http\Server("127.0.0.1", 9501, SWOOLE_BASE); $http->set([
'worker_num' => 4,
]); $http->on('request', function ($request, Swoole\Http\Server $response) {
$response->header('Last-Modified', 'Thu, 18 Jun 2015 10:24:27 GMT');
$response->header('E-Tag', '55829c5b-17');
$response->header('Accept-Ranges', 'bytes');
$response->end("<h1>\nHello Swoole.\n</h1>");
}); $http->start();
全球 Web 框架权威性能测试 Techempower Web Framework Benchmarks
最新跑分测试结果地址: techempower
Swoole 领跑动态语言第一
数据库 IO 操作测试,使用基本业务代码无特殊优化
性能超过所有静态语言框架 (使用 MySQL 而不是 PostgreSQL)
今日就暂时分享到这,明天持续更新
呕心搜集总结的15个“swoole”常见问题(一)的更多相关文章
- [swoole]swoole常见问题总汇
1.在daemon模式下Task异步任务写入文件需要采用绝对路径: 1.Task异步任务中操作数据库,如果仅仅只是在启动程序之初进行一次数据库链接,链接会在一定的时间后自动断开,应对这样的情况的最好办 ...
- DB2常见问题
15.1实例常见问题和诊断案例 1.实例无法启动问题 db2nodes.cfg文件,主要是为了数据库分区设计的.如果实例无法启动,要检查db2nodes.cfg,看配置是否正常.db2systm实例配 ...
- LIBSVM的使用方法
[原文:http://wenku.baidu.com/view/7e7b6b896529647d27285276.html] 目 录 1 Libsvm下载... 3 2 Libsvm3.0环境变量设 ...
- Entity Framework 学习总结之十一:POCO
POCO Entity Framework 4.0 为实体提供了简单传统 CLR 对象( Plain Old CLR Object / POCO )支持.实体对象可以独立于 EF 存在,由此 EF 更 ...
- 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
<实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明 辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...
- ES scroll(ES游标) 解决深分页
ES scroll(ES游标) 解决深分页. Why 当Elasticsearch响应请求时,它必须确定docs的顺序,排列响应结果.如果请求的页数较少(假设每页20个docs), Elasticse ...
- PHP Swoole长连接常见问题
连接失效问题例子其中,Redis常见的报错就是: 配置项:timeout报错信息:Error while reading line from the serverRedis可以配置如果客户端经过多少秒 ...
- MacBook Pro 15寸常见问题及修复
苹果MacBook Pro更换SSD硬盘攻略教程 MacBook pro开机黑屏解决 苹果电脑 MAC PRO 开机黑屏了 MacBook Pro 开机后黑屏,怎么办啊 如果 Mac 无法开机 Mac ...
- C++面试常见问题——15函数的值传递、指针传递、引用传递
函数的值传递.指针传递.引用传递 值传递 形参是实参的拷贝,该表形参的值并不会影响外部的实参.值传递是单向的(实参-->形参),参数的值只能传入,不能传出.当函数内部需要修改参数并且不影响调用者 ...
随机推荐
- 【总结】Array、ArrayList、List
一.Array(数组) 1.申明时必须要指定数组长度. 2.数据类型安全. 申明数组如下: 1 class Program 2 { 3 static void Main(string[] args) ...
- 队列的顺序存储与链式存储c语言实现
一. 队列 1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表. 2.循环队列:把存储队列的顺序队列在逻辑上视为一个环. 循环队列状态: 初始时:Q.front=Q.rear=0 ...
- Python3笔记004 - 2.1 python的语法特点
第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.1 python的语法特点 2.1.1 注释 注释的内容将被python解释器忽略,并不会在 ...
- 自适应高度输入框(contenteditable/textarea)
一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...
- JZOJ2018提高组-测绘
测绘 题目大意 为了研究农场的气候, \(Betsy\) 帮助农夫 \(John\) 做了 \(N(1 <= N <= 100)\) 次气压测量并按顺序记录了结果 \(M_1...M_N( ...
- 最简单的博弈论——HDU - 5963 朋友 (博弈)
OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...
- [POJ3613] Cow Relays(Floyd+矩阵快速幂)
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...
- Uni-app页面路由区分注意事项
总结Tips: (1)navigateTo,redirectTo 只能打开非 tabBar页面 (2)switchTab只能打开 TabBar 页面 (3)reLaunch可以打开任意界面 (4)页面 ...
- MCU 51-5中断
中断概念 : 计算机执行某程序时,发生了紧急事件或有特殊请求,CPU暂停某程序的执行, 转而去处理上述事件或请求,处理完毕后再重新执行某程序的过程叫做中断. 数据的输入/输出传送方式: (1)无条件传 ...
- java 面向对象(十六):Object类的使用
1.java.lang.Object类的说明: * 1.Object类是所Java类的根父类 * 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object ...