嘔心蒐集總結的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 [email protected]: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)
今日就暫時分享到這,明天持續更新