2019
07-08

MySQL事务相关整理

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务。

事务控制语句:
BEGIN 或 START TRANSACTION 显式地开启一个事务;

COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACK TO identifier 把事务回滚到标记点;

SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

** MYSQL 事务处理主要有两种方法
1、用 BEGIN, ROLLBACK, COMMIT来实现

BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交**

使用保留点 SAVEPOINT

savepoint 是在数据库事务处理中实现“子事务”(subtransaction),也称为嵌套事务的方法。事务可以回滚到 savepoint 而不影响 savepoint 创建前的变化, 不需要放弃整个事务。

ROLLBACK 回滚的用法可以设置保留点 SAVEPOINT,执行多条操作时,回滚到想要的那条语句之前。

使用 SAVEPOINT

SAVEPOINT savepoint_name; // 声明一个 savepoint

ROLLBACK TO savepoint_name; // 回滚到savepoint
删除 SAVEPOINT

保留点再事务处理完成(执行一条 ROLLBACK 或 COMMIT)后自动释放。

MySQL5 以来,可以用:

RELEASE SAVEPOINT savepoint_name; // 删除指定保留点

查看全文 >
2019
07-05

GatewayWorker 异步非阻塞

gateway收到请求后是通过socket长连接异步非阻塞发送给worker的

问题1:常规而言,一个gateway进程,通常能维持多少连接呢?

1、单个gateway进程可以维持上万的tcp连接

问题2:这种异步非阻塞 跟 nginx 的那种异步非阻塞 是不是相同的机制,gateway收到请求后,转发给worker进程,不会一直阻塞等待worker进程返回结果,转而马上处理下一个请求,worker进程处理完毕后,会主动通知gateway进程,然后gateway进程 再把结果返回给客户端

2、正确

问题3:gateway 与 worker 进程,每个进程里面,都是单线程的吗?

3、每个进程里都是单线程

问题4:所有的业务,都在worker进程中处理,那么如果,其中一个请求,处理时间很长,这个时候,worker进程就会阻塞,直到把这个请求处理完毕之后,才会处理下一个请求吧?

4、是的

总体而言,感觉跟 nginx & php-fpm 有点点类似,nginx 通过事件驱动机制,与 后端的 php-fpm 进行异步非阻塞通信,如果 php-fpm 处理一个请求,稍慢,就会阻塞下一个请求处理

理解很正确

查看全文 >
2019
06-14

PHP:根据二维数组中的某个字段进行排序

首先了解下以下两个函数:
1.array_column() 返回输入数组中某个单一列的值。
2.array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。

<?php
$data = array(
    array(
        'id' => 5698,
        'first_name' => 'Bill',
        'last_name' => 'Gates',
    ),
    array(
        'id' => 4767,
        'first_name' => 'Steve',
        'last_name' => 'Aobs',
    ),
    array(
        'id' => 3809,
        'first_name' => 'Mark',
        'last_name' => 'Zuckerberg',
    )
);

//根据字段last_name对数组$data进行降序排列
$last_names = array_column($data,'last_name');
array_multisort($last_names,SORT_DESC,$data);
查看全文 >
2019
06-10

php如何实现负载均衡?

PHP实现负载均衡的方法有很多种,在这里,我将给大家介绍一下php的负载均衡,话不多说,我们就来直接看看关于php负载均衡的实现。

  1. PHP文件

第一个问题是,如果你有大量的小型服务器,你怎么把你的php文件上传到所有的服务器上?有如下的方法供你参考:

1.分别上传所有的文件到每一个服务器 ,这种方法带来的问题是:想像一下你有20个服务器,那么上传过程中这将很容易导致错误,并且更新时极有可能导致不同服务器上有不同版本的文件。

  1. 使用‘rsync ‘ (或类似的软件) . 这样的工具能同步本地目录和多个远程主机目录上的文件。
    3.使用版本控制软件(如subversion ) .这是我最喜欢的方法。用它可以很好地维护我得代码,当发布我的应用时,可以在每一个服务器上运行svnupdate命令同步。这种方法也使切换服务器得代码到过去的某一个版本更加容易。
    4.使用一个文件服务器(你可能发现NFS 非常适合做这件事情). 这种方式是使用一个文件服务器来存放你的web应用.当然,如果你的文件服务器宕机,那么多所有你的站点将不能使用。这时,你就需要花费更多的开支来恢复它。

选择哪种方式依赖于你的需求和你掌握的技能。如果你使用版本控制系统,那么你可能得计划一个方法如果同时执行一个更新命令更新所有服务器上的代码。然而,如果使用文件服务器,你就要实现一些失败恢复机制,防止万一服务器宕机导致请求失败。

  1. 文件上传

当只有一台服务器时,文件上传不是一个问题。但是当我们有多台服务器时,那么上传的文件应该怎么存放呢?上传文件的问题和跨服务器php文件存储是类似的。下面是几种可能的方案:

  1. 把文件存储到数据库中 。

大多数数据允许存储二进制数据。当你请求文件下载时,访问数据把二进制数据和相应的文件名和类型输出给用户。在使用这种方案前应该考虑数据库怎样存储你 的文件。该方法的问题在于如果数据库服务器宕机将使文件不可用。

  1. 在一个文件服务器上存储上传的文件 .

与前面的介绍一样,你要安装一个文件服务器让所有web服务器共享,把所有上传的文件上传到这里,上传后所有的web服务器就都可以使用它。但是,如果文 件服务器宕机,那么可能发生图像文件下载中断。

  1. 设计你自己的上传机制传输文件到服务器到每一个服务器 .

这个方法没有单个文件服务器或者数据库方案的缺陷,但是将增加你代码的复杂度。例如,如果上传到多个服务器过程中,服务器宕机,你要怎么处理?

用数据库存储上传文件但是设计一个文件缓存机制是一个不错的方案。当服务器接收一个文件下载请求时,首先检查缓存系统中是否有该文件,如果发现那么从缓存系统下载,否则从数据库读取并把它缓存到文件系统中。

  1. 会话(Sessions)

如果你熟悉php的session处理,你将可能知道默认情况下,它存储session数据在服务器的临时文件里。而且,这个文件仅仅在你请求处理的那个服务器上,但是接下来的请求可能被另外一个服务器处理,这将在另一个服务器上生成新的session。这导致session频繁地不被识别,如登录用户总是要求重新登录。

我推荐的方案是,要么重新php内建的session处理机制存储session数据到数据库,或者实现你自己的机制保证发送一个用户的请求到同一台服务器。

  1. 配置(Configuration)

尽管这个话题不是和php特别相关,我感觉还是有必要提及。当运行集群服务器时,用某种方法保持服务器之间的配置文件同步是一个好主意。如果配置文件不一致,可能导致一些非常奇怪的断断续续的行为导致很难排查这些问题。

我推荐使用版本控制系统单独管理他们。这样你可以为不同的项目安装存储不同的php配置文件,也可以保持所有服务器配置文件同步。

  1. 日志(Logging)

像配置问题一样,logging不是仅仅和php相关。但是对于保持服务器健康运行它仍然是非常重要的。没有正确的logging系统,你怎么知道如果PHP代码开始产生错误(在系统正式运行时,你总是关闭display_errors 设置,不是吗?)

有几种方法你可以实现logging:

1.在每一个服务器上记录日志。这是最简单的方法。每一个机器仅仅记录一个文件。好处是简单,可能只要很少的配置。但是,随着服务器数量的增多,监控每台服务器上的日志文件将变得非常困难。
2.记录日志到一个共享这种方法每一个服务器仍然有这个日志文件,但是他们通过共享机制被存储在一个中央文件服务器上,这将使监控日志变得更简单。该方案的问题在于,如果文件服务器不可用将导致一个简单的日志不能写入问题最终导致整个应用崩溃。
3.记录日志到logging服务器 你可以使用一个logging软件,如syslog来把所有的日志写到一个中央服务器。尽管这个方法要求更多的配置,但是他也提供了最健壮的方案。

php负载均衡实例

如果要使用负载均衡的话,可以修改配置http节点如下:

#设定http服务器,利用它的反向代理功能提供负载均衡支持

        http {

        #设定mime类型,类型由mime.type文件定义

        include       /etc/nginx/mime.types;

        default_type  application/octet-stream;

        #设定日志格式

        access_log    /var/log/nginx/access.log;

#省略上文有的一些配置节点

#。。。。。。。。。。

#设定负载均衡的服务器列表

        upstream mysvr {

        #weigth参数表示权值,权值越高被分配到的几率越大

        server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口

        server 192.168.8.2x:80  weight=1;

        server 192.168.8.3x:80  weight=6;

        }

upstream mysvr2 {

        #weigth参数表示权值,权值越高被分配到的几率越大

server 192.168.8.x:80  weight=1;

        server 192.168.8.x:80  weight=6;

        }

#第一个虚拟服务器

        server {

        #侦听192.168.8.x的80端口

        listen       80;

        server_name  192.168.8.x;

#对aspx后缀的进行负载均衡请求

        location ~ .*\.aspx$ {

root   /root;      #定义服务器的默认网站根目录位置

        index index.php index.html index.htm;   #定义首页索引文件的名称

proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表

#以下是一些反向代理的配置可删除.

proxy_redirect off;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 10m;    #允许客户端请求的最大单文件字节数

        client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,

        proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)

        proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)

        proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)

        proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小

        proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置

        proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)

        proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传

}

}
查看全文 >
2019
06-02

Deepin15.9安装Docker,及操作小结

1 深度Deepin系统中的Docker

Ubuntu系统安装docker时可以通过 $(lsb_release -cs) 命令获取Ubuntu信息,但是Deepin系统是基于Debian系统制作的,通过此命令获取不到Deepin版本信息,显示为unstable,Docker官方源中并没有提供这种unstable版本的Docker,因此需要利用其它方法安装Docker。

2 深度Deepin系统安装Docker方法

2.1 卸载以前老版本Docker

sudo apt-get remove docker.io docker-engine

2.2 安装docker-ce与密钥管理及相关下载工具

sudo apt-get install apt-transport-https ca-certificates curl python-software-properties software-properties-common

注意:主要包括curl命令、add-apt-reposiory工具(利用software-properties-common提供该工具)和密钥管理工具。

2.3 安装密钥

国外Docker网络速度较慢,可以利用国内源。可选的国内源包括中国科技大学开源镜像站和清华大学开源软件镜像站。
添加软件源CPG密钥:

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -

2.4 查看密钥是否安装成功

sudo apt-key fingerprint 0EBFCD88

如果安装成功,显示如下信息:

pub   rsa4096 2017-02-22 [SCEA]
            9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid   [ 未知 ] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

2.5 添加docker官方仓库(利用中科大开源镜像仓库)

修改可以利用命令或修改相应的文件即可,修改的文件位于:/etc/apt/source.list,命令为:

sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian jessie stable"

其中:jessie为Debian版本号,这个和Ubuntu系统利用 $(lsb_release -cs)命令设置系统版本号不同,需要手动指定Debian版本号。

查看Deepin系统中Debian版本号可以用查看:

cat /etc/debian_version

根据查看的版本号替换对应的版本名称即可:

Debian 9("stretch") — 当前的稳定版
Debian 8("jessie") — 被淘汰的稳定版
Debian 7("wheezy") — 被淘汰的稳定版
Debian 6.0("squeeze") — 被淘汰的稳定版
Debian GNU/Linux 5.0("lenny") — 被淘汰的稳定版
Debian GNU/Linux 4.0("etch") — 被淘汰的稳定版
Debian GNU/Linux 3.1("sarge") — 被淘汰的稳定版
Debian GNU/Linux 3.0("woody") — 被淘汰的稳定版
Debian GNU/Linux 2.2("potato") — 被淘汰的稳定版
Debian GNU/Linux 2.1("slink") — 被淘汰的稳定版
Debian GNU/Linux 2.0("hamm") — 被淘汰的稳定版

Deepin15.8对应的Debian版本号为8,版本代号为jessie,进行相应的替换即可。

2.6 更新仓库

sudo apt-get update

2.7 安装docker-ce

sudo apt-get install docker-ce

安装完成后,需要修改相应的文件:/lib/systemd/system/docker.service.
把如下位置内容:

ExecStart=/usr/bin/dockerd -H fd:// 

修改为:

ExecStart=/usr/bin/dockerd

启动docker:

systemctl start docker

2.8 查看Docker安装版本信息

docker version

2.9 验证Docker是否被正确安装且能正常使用

sudo docker run hello-world

如果能正常下载且能正常使用,说明Docker正常安装。

3 禁止Docker自启动

默认情况下Docker是开机自启动的,若要取消开机自启动可通过安装chkconfig命令管理Deepin自启动项。

# 安装chkconfig
sudo apt-get install chkconfig

# 移除自启
sudo chkconfig --del docker

4 添加非root用户到docker组

上述命令都是在root权限下进行的操作,如果用其它用户操作可能会出现错误。

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.35/version: dial unix /var/run/docker.sock: connect: permission denied

可以通过添加相应的用户到docker组中就可以。
查看docker用户组:

    cat /etc/group

注意:用户信息位于:/etc/passwd,用户组信息位于:/etc/group。
如果没有docker用户组,通过如下命令创建:

sudo groupadd -g docker

将当前用户添加到docker组:

sudo usermod -a -G docker ${USER}

将当前用户从docker组中删除:

sudo gpasswd -a ${USER} docker

设置docker.sock(/var/run文件下)文件普通用户的可执行权限:

sudo chmod a+rw /var/run/docker.sock

5 容器修改mysql密码

5.1进入 mysql 容器

docker exec -it mysql /bin/bash

5.2修改mysql容器的配置文件

打开配置文件的命令

vi /etc/mysql/my.cnf

在最后一行添加如下代码( //跳过mysql的密码验证)

skip-grant-tables

5.3重启mysql容器

docker restart mysql

5.4重新进入容器输入命令root为用户名

mysql -u root -p

5.5修改密码的命令

update mysql.user set passwrd=“新密码” where ''User" = “username”;

6 常用命令总结

查看所有镜像

docker ps -a

启动镜像

docker start img_name

进入镜像

docker exec -it img_name /bin/bash
查看全文 >
2019
04-30

[Ueditor] 上传图片成功,但是提示上传失败

问题排除

查找图片发现上传的图片已经上传于服务器,因为不是图片上传的问题

浏览器F12开发者模式查看发现/php/controller.php?action=uploadimage报502错误

逐步断点排查发现如果注释掉iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED'])代码之后问题消失。图片可以正常上传问题原因

可能是iconv函数运行时抛出错误导致问题解决办法

ueditor的github上面已经更新了代码,但是最新版的ueditor的源码中的代码还没有更新。

iconv('unicode','utf-8',$this->stateMap['ERROR_TYPE_NOT_ALLOWED'])
替换为
mb_convert_encoding($this->stateMap['ERROR_TYPE_NOT_ALLOWED'],'utf-8','auto')

作者:门前槐树下的小稚童

链接:https://www.jianshu.com/p/5afc7aaa4bac

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

查看全文 >
2019
01-11

服务器优化配置精选

php.ini

output_buffering = 4096
max_execution_time = 300
max_input_time = 60
memory_limit = 1024M
post_max_size = 50M
upload_max_filesize = 50M
max_file_uploads = 20
cgi.fix_pathinfo=1

disable_functions = scandir,passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
删除对应想要使用的函数即可

php-fpm.conf

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = 4096
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm.max_requests = 10240
pm = dynamic
pm.max_children = 300
pm.start_servers = 30
pm.min_spare_servers = 30
pm.max_spare_servers = 60
request_terminate_timeout = 0
request_slowlog_timeout = 0
slowlog = var/log/slow.log

最后执行/etc/init.d/php-fpm restart重启下

nginx.conf

user  www www;
worker_processes auto;
error_log  /home/wwwlogs/nginx_error.log  crit;
pid        /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
    {
    use epoll;
    worker_connections 51200;
    multi_accept on;
    }
http{
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    sendfile   on;
    tcp_nopush on;

    keepalive_timeout 60;

    tcp_nodelay on;

    fastcgi_connect_timeout 1200;
    fastcgi_send_timeout 1200;
    fastcgi_read_timeout 1200;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;
    gzip_disable   "MSIE [1-6]\.";

    #limit_conn_zone $binary_remote_addr zone=perip:10m;
    ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.

    server_tokens off;
    access_log off;

    server{
        listen 80 default_server default backlog=4096;
        listen [::]:80 default_server ipv6only=on;

    }
}

如果是lnmp
fastcgi.conf

vim /usr/local/nginx/conf/fastcgi.conf
加入:
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
找到
fastcgi_param PHP_ADMIN_VALUE"open_basedir=$document_root/:/tmp/:/proc/";
改成:
fastcgi_param PHP_ADMIN_VALUE "open_basedir=NULL";
二.
vim /usr/local/nginx/conf/enable-php.conf
找到:
try_files $uri =404;
然后注释掉:

#try_files $uri =404;

mysql 5.7 sql_model 设置方法
在my.cnf 里面设置
[mysqld]
sql_mode='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
ps: 一定要添加 [mysqld] , 在语句最后 不要添加";" 切记!

优化linux内核参数,将如下参数写入/etc/sysctl.conf文件,使用sysctl -p命令生效

net.ipv4.tcp_max_syn_backlog = 65535 //表示SYN队列的长度,默认为1024,加大队列长度为65535,可以容纳更多等待连接的网络连接数
net.core.netdev_max_backlog = 32768 //表示当网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn = 32768 //默认值是128,这个值不能调高系统的最大连接数,但是能调高系统同时发起连接的tcp连接数
net.core.wmem_default = 8388608 //默认的TCP数据发送缓冲大小
net.core.rmem_default = 8388608 //默认的TCP数据接收缓冲大小
net.core.wmem_max = 16777216 //默认的TCP数据发送缓冲大小
net.core.rmem_max = 16777216 //默认的TCP数据接收缓冲大小
net.ipv4.tcp_timestamps = 0 //时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包
上述‘core’参数如果找不到就在/proc/sys/net/core中查找对应文件。
再设置 使用 echo 21323 > wmem_default 这种方式即可 因为上述文件都加载在内存中。

查看全文 >
2018
11-30

中文数字转换阿拉伯数字

private function numToWord($num)
{
    $chiNum = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $chiUni = array('','十', '百', '千', '万', '亿', '十', '百', '千');
    $chiStr = '';
    $num_str = (string)$num;
    $count = strlen($num_str);
    $last_flag = true; //上一个 是否为0
    $zero_flag = true; //是否第一个
    $temp_num = null; //临时数字
    $chiStr = '';//拼接结果
    if ($count == 2) {//两位数
        $temp_num = $num_str[0];
        $chiStr = $temp_num == 1 ? $chiUni[1] : $chiNum[$temp_num].$chiUni[1];
        $temp_num = $num_str[1];
        $chiStr .= $temp_num == 0 ? '' : $chiNum[$temp_num]; 
    }else if($count > 2){
        $index = 0;
        for ($i=$count-1; $i >= 0 ; $i--) { 
            $temp_num = $num_str[$i];
            if ($temp_num == 0) {
                if (!$zero_flag && !$last_flag ) {
                    $chiStr = $chiNum[$temp_num]. $chiStr;
                    $last_flag = true;
                }
            }else{
                $chiStr = $chiNum[$temp_num].$chiUni[$index%9] .$chiStr;
                $zero_flag = false;
                $last_flag = false;
            }
            $index ++;
        }
    }else{
        $chiStr = $chiNum[$num_str[0]]; 
    }
    return $chiStr;
}
查看全文 >
微信扫一扫