mac-redis

/usr/local/redis-5.0.5

默认-php7.1.23

配置文件: vi /private/etc/php.ini (cp php.ini.default php.ini)
扩展文件: /usr/lib/php/extensions/no-debug-non-zts-20160303

brew-php5.6

配置文件: /usr/local/etc/php/5.6/php.ini
扩展文件: /usr/local/Cellar/php@5.6/5.6.40/pecl/20131226/

下载php扩展源码: php-redis-4.3.0.tgz

解压并安装(错误看错误处理):

tar -xzvf redis-4.3.0.tgz

phpize

./configure 

sudo make && sudo make install

复制编译好的redis.so到php扩展文件夹中 sudo cp /Users/jw/Downloads/redis-4.3.0/modules/redis.so /usr/lib/php/extensions/no-debug-non-zts-20160303/

错误处理

执行phpize出现错误的话

错误1处理

grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:  
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

xcode-select --install 执行命令安装

错误2处理

cd /Library/Developer/CommandLineTools/Packages/
// 不同的mac系统, 可能名字不一样
open macOS_SDK_headers_for_macOS_10.14.pkg

错误3处理

访问127.0.0.1:8080正常 访问80出现拒绝访问(ERR_CONNECTION_REFUSED) 执行命令sudo nginx (原因php-fpm使用sudo启动 nginx普通启动)

相关资料

Mac环境下安装Redis
mac 中安装redis扩展过程
mac-PHP5.6 redis扩展

如何计算单台服务最大并发数

公式:带宽X等待时间/页面大小=并发人数.

  • 假定你的阿里云服务器带宽为1M。(如果你的带宽是N兆的话,计算结果乘N就好了)
  • 假定用户等待网页响应的最长时间为8S。(八秒定律:在互联网领域存在的一个定律,即指用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过70%的用户放弃等待。)
  • 忽略服务器计算和处理的时间,仅考虑网页文件从服务器下载到客户端的速度。
  • 假设所有用户访问的页面平均大小为60KB(如果你的网页含有大量的图片、视频、下载文件等,请酌情考虑页面大小)

阿里云服务器1M带宽最多能支持多少人同时在线?

计算1M带宽在8S中之内能传送多少个60KB的页面,10248/60=136.53 也就是大约为137个。这意味着,如果每一个用户都愿意等到极限的8秒钟,那么我们可以满足137个人同时在线。如果想要每个人平均等1秒钟的话,这个数字大概是17(10241/60).

阿里云服务器1M带宽一天最多能支持多少个PV及多少个独立用户访问?

计算1M带宽一天时间能传输多少个60KB的页面,10242460*60=1474560

其实是1M带宽的服务器发挥到极致每天所能承受的PV(Page View)。如果再假设每个用户平均访问我们网站上的5个页面的话,我们可以算出1M带宽的服务器每天最极限能支持1474560/5=294912个用户的访问

1M带宽每天能有2000+IP已经是非常非常不错

相关资料

阿里云服务器1M带宽能承受多少人在线

mac安装lnmp(lamp)-php环境

安装方式

  • 编译安装
  • brew安装
  • 安装包引导安装

服务

  • php(多个版本)
  • nginx
  • apache
  • MySql(多个版本)
  • redis
  • memcahce
  • composer
  • rabbitmq
  • beanstalkd
  • mongo
  • nodejs

nginx

brew install nginx

/usr/local/var/www 页面项目位置
/usr/local/etc/nginx/nginx.conf 配置文件
/usr/local/etc/nginx/servers 虚拟主机

php5.6

brew tap exolnet/homebrew-deprecated 增加安装源
brew install exolnet/deprecated/php@5.6

错误信息

Error: Your Xcode (10.1) is too outdated.
Please update to Xcode 10.2.1 (or delete it).
Xcode can be updated from the App Store.

A: 打开App Store -> 更新 -> xcode 更新.

nginx+php 配置

server {

    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name spike.test;
    root /usr/local/var/www/spike;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

mac-php 默认安装

cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
cp /private/etc/php-fpm.d/www.conf.default /private/etc/php-fpm.d/www.conf

php-fpm -D 启动php

lnmp 启动及关闭

  • brew services stop mysql@5.6 关闭
  • nginx -s stop 关闭
  • brew services stop php@5.6 关闭

实验操作记录

mac-php-最新源码编译安装、模块安装

MySQL-脏读

事务在高并发执行的时候可能会发生脏读、不可重复读、幻读, 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

事务隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted)
不可重复读(read committed)
可重复读(repeatable read
串行化(serializable)
  • 未提交读(READUNCOMMITTED)另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)
  • 提交读(READCOMMITTED)本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)
  • 可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。

MySQL中默认是可重复读(repeatable read)

查看当前session事务级别 show variables like '%tx_isolation%';

查看全局事务隔离级别 show global variables like '%tx_isolation%';

相关资料

MySQL 事务隔离实验-认识:脏读、不可重复读、幻读
MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

MySQL-锁

乐观锁、悲观锁、共享锁、排他锁、行锁、表锁、死锁

疑问难点

  • 什么是锁?
  • 为什么会出现锁情况?
  • 如果模拟锁情况?

基础知识

锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。

加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是否已解除、释放锁等。

相关资料

MySQL-InnoDB-锁概念的理解
MySQL锁总结

mysql 死锁模拟测试
MySQL单表模拟锁和事务的几个场景

http-https代理之AnyProxy

安装部分

  1. 安装node.js
  2. npm install -g anyproxy

命令使用

启动anyproxy服务: anyproxy -i 加i参数可以抓取https
Tip: 关于https在iphone中需要设置信任: [设置] -> [通用] -> [关于本机] -> [证书信任设置]

手中中安装ca证书-启动anyproxy后访问电脑中的局域网ip:8002, 在打开的页面中右侧有RootCA文件下载或手机扫描二维码下载安装.

筛选部分

  • 域名筛选 将域名放置右侧筛选输入框中.

相关资料

AnyProxy抓取http/https请求
Python爬虫五:微信公众号爬虫-使用AnyProxy

人人商城_Base_EweiShopV2Model_not found

请求地址: app/index.php?i=3&c=entry&m=ewei_shopv2&do=mobile&r=oilrebate.register
错误信息: Fatal error: Class 'Base_EweiShopV2Model' not found in /var/www/renren/addons/ewei_shopv2/core/model/oilcarduser.php on line 13
错误备注: windows-10 phpstudy运行正常 laradock中运行报错.

  • include
  • include_once
  • require
  • require_once

关于include函数

php.ini 关于包含文件可配置项: include-path

查看脚本包含过那些文件get_required_files() return array


测试代码: svn://svn.majianwei.com/less/_php phpstudy 与 laradock 运行都正常.

人人商城相关文件及代码片段

  • renren\addons\ewei_shopv2\core\model\oilcarduser.php
if (!defined('IN_IA')) {
    exit('Access Denied');
}
require_once 'base.php';
class Oilcarduser_EweiShopV2Model extends Base_EweiShopV2Model
{
...
  • renren\addons\ewei_shopv2\plugin\oilrebate\core\mobile\register.php
if (!defined('IN_IA')) {
    exit('Access Denied');
}

require_once 'base.php';
require_once 'Captcha.php';
class Register_EweiShopV2Page extends Base_EweiShopV2Page
{
...

ab-压力测试-laradock

  1. docker-compose build apache2
  2. docker run -it --name apache2 --net=host laradock_apache2 bash
  3. ab -n 100 -c 10 http://test.com/
  • 其中-n表示请求数,-c表示并发数
  • Requests per second: 19.66 [#/sec] (mean) 吞吐率 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
  • Time per request: 5087.180 [ms] (mean) 用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
  • Time per request: 50.872 [ms] (mean, across all concurrent requests) 服务器平均请求处理时间,大家最关心的指标之三

相关资料

ab工具
apahce的ab工具测试nginx服务