PHP 运行机制和 LNMP 架构

最近了解了一下PHP基本运行原理和常用架构,这里整理出来方便回顾。 PHP的设计理念及特点 多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早已支持多线程模型。 弱类型语言:和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。一个变量的类型并不是一开始就确定不变,运行中才会确定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中非常方便、高效。 引擎(Zend)+组件(ext)的模式降低内部耦合。 中间层(sapi)隔绝web server和PHP。 语法简单灵活,但没有强制规范。(由社区发起的PSR规范可以了解下) 注:和Java Go进程模型对比 PHP 多进程 -> 单线程 Java 单进程 -> 多线程 Go 单进程 -> 多线程(cpu数量相等)-> goroutine PHP的四层体系 PHP的核心架构如下图: PHP的执行流程&Opcode 拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(Opcode),然后ZEND虚拟机顺次执行这些指令完成操作。 常用LNMP架构 Nginx作为请求入口,对前后端流量进行分发,PHP文件通过fastcgi协议转发给PHP-FPM。 PHP-FPM: 先启动一个master进程,加载和解析PHP配置,具体请求分发到worker进程执行,worker进程是阻塞式的,完成一个请求才能接收下一个请求。 当请求并发较多时,所有worker进程都在running状态,就会出现504错误了。 常用LNMP架构如下图: 参考内容: PHP底层的运行机制与原理 PHP源码分析 - PHP-FPM运行原理

Nginx “Too many open files”错误解决办法

最近发现生产服nginx产生一些errorr日志:Too many open files… 出现这个错误一般是,打开文件数量限制不够导致,可以调整worker_rlimit_nofile解决。这里理解一下worker_connections,worker_rlimit_nofile等概念。 基本概念: worker_process worker进程数量,一般设置为CPU核心数 worker_connections 单个worker最大连接数 worker_rlimit_nofile 单个worker 最大可以打开文件数量 举个栗子🌰 1 2 3 4 5 6 7 worker_processes 4; worker_rlimit_nofile 400000; events { worker_connections 65535; } 解释: 每个worker进程最大连接数为65535,每个worker进程最大打开文件数量为400000。4个worker最大连接数为655354,打开文件数量为4000004。 注意: worker_connections不能超过系统打开socket限制: 1 2 ulimit -n 65535 worker_rlimit_nofile * worker_processes < 系统可打开文件总数

Windows部署go exe应用笔记

最近一个项目需要在windows下部署,技术选型就使用go来开发,打包exe运行,但是部署到服务器后,遇到一个奇怪的bug,当双击cmd窗口时,进程会被挂起,回车又恢复执行。起初以为时go的标准输入导致的,后尝试关掉stdout也无济于事,一番Google后,原来win10或者win server 2016新增了feature 快速编辑模式,当使用该模式时即双击可以挂起程序,回车恢复。🤬 快速编辑模式 这里简单演示下: func main() { for { fmt.Println(time.Now()) time.Sleep(time.Second) } } 打包 go build test-cmd.go 双击执行 2020-06-12 17:14:13.5464216 +0800 CST m=+0.008998901 2020-06-12 17:14:14.5743305 +0800 CST m=+1.036907801 ... 取消快速编辑模式即可。 将exe注册成服务 尝试SC CREATE注册服务,总是起不来,下面介绍传统方式。 首先要下载instsrv.exe和srvany.exe(下载地址),然后进入cmd命令窗口 输入命令如D:\stack\instsrv.exe 服务名 D:\stack\srvany.exe(exe需要绝对路径) win+R输入regedit,进入注册列表,进入HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> 服务名 新建Parameters项,在Parameters项里面新建AppDirectory和Application 字符串值Application的字符串的值需要指向exe文件(例如:D:\stack\test.

Go命令调用使用CommandContext控制超时

在Go 1.7之前,根据超时结束外部流程需要一些工作。 随着上下文包移入标准库,诸如os / exec之类的标准包可以利用其提供的超时和取消功能。 这里先看在Go 1.7之前使用channel控制超时。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 package main import ( "bytes" "fmt" "os/exec" "time" ) func main() { // 试用ping来做测试,win平台去掉"-c 2", "-i 1"参数 cmd := exec.

免费域名邮箱postale.io简介

最近注册了postale.io免费域名邮箱,试用下来还不错,特此分享下。 postale免费套餐规格如下: 单个域名 5个用户或别名 每个用户1G存储 注册 https://postale.io/ 配置DNS MX和TXT记录生效可能会需要点时间,耐心等待。 配置好会生成密码发到你的私人邮箱。就可以登录试用了。 客户端设置 SMTP 配置项 值 HOST mail.postale.io PORT 587 for TLS or 465 for SSL SSL/TLS Yes, with authentication required USERNAME *john.