安装
zanphp 的安装详细步骤具体在 http://zanphpdoc.zanphp.io/,但是安装的时候,还是踩了一些坑,Mac 和 Ubuntu 我都安装过, 分享大家注意一下。
PHP 版本 >= 5.6,不然的话 composer 代码拉不下来。
Zan编译安装的时候,最好--disable-async-redis,如果不加这个参数,在 Ubuntu下面我编译失败,编译失败后,我删掉原来的代码,我又重新拉一份源码,再编译,成功了。 重新在原来基础上编译依,扩展依然安装不成功。编译完成后修改 php.ini 增加 extension=zan.so
在php.ini 配置 zanphp 的运行模式 zanphp.RUN_MODE = test
Mac 源码安装 apcu 的时候,因为我本地PHP 版本是 5.6 ,下载最新版本的时候,编译失败,下来一个 4 版本的安装成功。 编译完成。 配置 php.ini
测试并发
zanphp 解决的问题高并发和服务化的问题(我的理解),于是就写简单的代码测试一下并发
//操作数据库示例
public function dbOperation()
{
$demo = new GetDBData();
//执行sql语句
$result = (yield $demo->mySql());
if ($result[0]['score'] > 0) {
$score = $result[0]['score'];
$score--;
yield $demo->updateSql(['var' => ['id' => $result[0]['id'], 'score' => $score]]);
}
yield $this->r(0, 'json string', $result);
}
逻辑很简单,就是 表字段score > 0 的时候才会更新,如果不支持并发,会出现 score < 0 的情况。
siege -c 100 -r 10 127.0.0.1:8030/index/my/dbOperation (100 并发重复执行 10)
结果全部请求成功,score 没有出现负值,支持并发真是杠杠的。
同时写了一个 golang 的脚本,测试思路一样,主要比较一下性能。
package main
import (
"fmt"
"net/http"
"html/template"
"strings"
"database/sql"
"log"
_ "github.com/go-sql-driver/mysql"
)
func checkErr(err error) {
if err != nil {
panic(err)
}
}
func testSQL(w http.ResponseWriter, r *http.Request) {
db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
checkErr(err)
//查询数据
rows, err := db.Query("SELECT * FROM test limit 1 ")
checkErr(err)
stmt, err := db.Prepare("update test set score=? where id=?")
checkErr(err)
for rows.Next() {
var id int
var score int
err = rows.Scan(&id, &score)
checkErr(err)
if score > 0 {
score--
_, err := stmt.Exec(score, id)
checkErr(err)
}
}
}
func main() {
http.HandleFunc("/", sayhelloName) //设置访问的路由
http.HandleFunc("/login",login) //设置访问的路由
http.HandleFunc("/testsql",testSQL) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
用同样的并发量,go 的一些请求失败。说明 zanphp 比 go 要高?我认为应该是的。
结束
zanphp 还是很强大的,对于需要高并发,服务化的提供解决方案。值得好好研究。