欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

呕心搜集总结的15个“swoole”常见问题(一)

程序员文章站 2022-05-17 22:41:06
...

一、升级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 aaa@qq.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 进程

aaa@qq.com:~/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)

今日就暂时分享到这,明天持续更新

进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

我的官方群点击此处加入群聊【PHP高级学习交流群953224940】,一起学习,相互讨论。群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。

这套精品PHP教程绝不是市场上的那些妖艳贱货可比,作为web开发的佼佼者PHP并不逊色其他语言,加上Swoole后更加是如虎添翼!进军通信 、物联网行业开发百度地图、百度订单中心、虎牙、战旗TV等!寒冬裁员期过后正是各大企业扩大招人的时期,现在市场初级程序员泛滥,进阶中高级程序员绝对是各大企业急需的人才,这套学习教程适合那些1-5年以内的PHP开发者正处于瓶颈期,想要突破自己进阶中高级、架构师!名额有限,先到先得!

部分资料截图:

呕心搜集总结的15个“swoole”常见问题(一)
呕心搜集总结的15个“swoole”常见问题(一)
呕心搜集总结的15个“swoole”常见问题(一)

还有限时精品福利:

★腾讯高级PHP工程师笔试题目

★亿级PV高并发场景订单的处理

★laravel开发天猫商城组件服务

★战旗TV视频直播的架构项目实战

扫描下面二维码领取

正在跳转(二维码自动跳转)

对PHP后端技术,对PHP架构技术感兴趣的朋友,我的的官方群953224940,一起学习,相互讨论。

群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎免费领取。

本课程深度对标腾讯T3-T4标准,贴身打造学习计划为web开发人员进阶中高级、架构师提升技术,为自己增值涨薪!加入BAT特训营还可以获得内推大厂名额以及GO语言学习权限!!!

更多学习内容可以访问从码农成为架构师的修炼之路