代码改变世界

zanphp 初探----安装篇

2017-12-06 17:16  掸尘  阅读(832)  评论(0编辑  收藏  举报

   安装

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 还是很强大的,对于需要高并发,服务化的提供解决方案。值得好好研究。