嘔心蒐集總結的15個“swoole”常見問題(一)

it阿布發表於2020-07-27

一、升級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)

今日就暫時分享到這,明天持續更新

更多學習內容可以訪問從碼農成為架構師的修煉之路

相關文章