php多进程kuoqiPHP+KuoqiWorker实现可视化进程管理


【一天一个Linux运维知识点】 -- 关注我

【一天一个Linux运维知识点】 -- 关注我,持续学习Linux运维技能!

用ps命令查看系统进程
系统管理员一定要知道你所管理的系统都有哪些进程在运行,在Windows下只要打开任务管理器即可查看。那么在Linux下如何查看呢?其实使用前面介绍命令就可以,但是查看起来没有ps命令方便,它是专门显示系统进程的命令,如下所示:
# ps aux

阿铭也经常看到有人喜欢用命令ps -elf,但它们显示的信息基本上是一样的。ps命令还有更多的用法,你只要会用这个命令就足够了。下面介绍几个系统进程的参数。
PID:表示进程的ID,这个ID很有用。在Linux中,内核管理进程就得靠pid来识别和管理某一个进程。比如我想终止某一个进程,则用命令“kill 进程的pid”。有时这样并不能终止进程,需要加-9选项,即“kill -
9 进程的pid”,但这样有点暴力,严重的时候会丢数据,所以尽量还是别用。
STAT:进程的状态。进程状态分为以下几种(不要求记住,但要了解)。
D:不能中断的进程(通常为IO)。
R(run):正在运行中的进程,其中包括了等待CPU时间片的进程。
S(sleep):已经中断的进程。通常情况下,系统的大部分进程都是这个状态。
T:已经停止或者暂停的进程。如果我们正在运行一个命令,比如说sleep 10,我们按一下Ctrl+Z暂停进程时,用ps命令查看就会显示T这个状态。
W:(内核2.6xx以后不可用),没有足够的内存页分配。
X:已经死掉的进程(这个好像从来不会出现)。
Z:僵尸进程,即杀不掉、打不死的垃圾进程,占用系统一点资源,不过没有关系。如果占用太多(一般不会出现),就需要重视了。
<:高优先级进程。
N:低优先级进程。
L:在内存中被锁了内存分页。
s:主进程,后面阿铭讲到nginx或者php-fpm服务的时候,你就能更好地理解它了。
l:多线程进程。
+:在前台运行的进程,比如在当前终端执行ps aux就是前台进程。
ps命令是阿铭在工作中用得非常多的一个命令,所以请记住它。阿铭经常会将ps连同管道符一起使用,用来查看某个进程或者它的数量。示例命令如下:
# ps aux |grep -c sshd

【面试题】

【面试题】

1.说一说 MySQL事物的四个特性,以及各自的特点?

2.介绍一下 Nginx / Apache 如何与 PHP 进行交互的?

3.从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?

4.内存耗尽后Redis会发生什么?

5.说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景?


AI给出的答案如下,仅供参考:

1. MySQL事务的四个特性包括ACID,具体如下:
- 原子性(Atomicity):指事务是一个不可分割的操作单位,要么全部执行要么全部不执行。
- 一致性(Consistency):指事务执行前后,数据库从一个一致性状态变到另一个一致性状态。
- 隔离性(Isolation):指多个并发事务之间互不干扰,每个事务处理数据时,使用的是独立的、私有的临时空间,其它事务看不到。
- 持久性(Durability):指当事务完成后,它所对数据库所作的更改将永久保存在数据库中。


2. Nginx / Apache 与 PHP 交互有两种方式:CGI 和 FastCGI。CGI(通用网关接口)每次请求都需要创建一个新的进程,并且执行完毕后才会被销毁,这样频繁创建进程会消耗较多的资源。而FastCGI引入了进程池的概念,即预先创建好一定数量的进程等待请求,处理完成后不销毁进程,而是等待下一个请求的到来,提高了性能。


3. InnoDB的索引结构采用B+树算法,在B+树中,叶子节点存储了数据行的信息,非叶子节点只存储索引列的值和子节点的指针。而对于MySQL索引的key长度,InnoDB限制最大key长度为767字节,这是因为InnoDB中的索引结构中,每一个节点最多只能占用一页,而一个页的大小为16KB,因此在UTF-8编码下,一个字符最多占3个字节,767字节能够保证最大可能的索引树高不超过
4。


4. 当Redis内存耗尽时,Redis将启动内存回收机制。首先Redis会尝试释放一些过期键和设置了过期时间但未被访问的键,然后尝试使用LRU算法(Least Recently Used)将冷数据移除出内存,最后如果仍然无法腾出足够空间,Redis会停止接受写入请求,同时发出警告信息,等待管理员手动增加内存或者清理数据。


5. 互斥锁主要应用场景是在并发读写相同资源时,确保同一时刻只有一个线程进行写操作,可以避免数据竞争问题;自旋锁适用于短时间内等待解锁的情况,当自旋锁被占用时,线程不会阻塞,而是持续地尝试获取锁;读写锁适用于读多写少的场景,可以提高并发读性能;悲观锁适用于并发更新的场景,即在读取数据时就加锁,避免数据被其他线程修改的情况;乐观锁适用于并发性写操作较少的场景,通过版本号等机制实现并发写入的控制。

老板让你将PHP应用采用桌面应用的方式发布为一个可安装的应用程序

老板让你将PHP应用采用桌面应用的方式发布为一个可安装的应用程序,怎么办?把整个PHP的项目打包成自己的一个程序组件?不太现实,一时半会儿也搞不出来。有一个项目名称叫做PH7,它是一个可以嵌入到C语言中的PHP引擎,内置一个PHP 5.3字节码编译器和虚拟机。

PH7是一个可以与你的程序运行在同一个进程中的PHP引擎,集成这个库之后,那么你的应用程序也就具备了PHP编译器和虚拟机的能力,有了这个能力不就可以实现在自己的应用中采用PHP作为脚本编写代码了吗?

PH7相对于PHP就相当于SQLite相对于SQL一样。

项目地址:网页链接

【面试题和答案】

【面试题和答案】

1.MySQL索引树是如何维护的?

2.简要介绍一下 PHP-FPM 运行机制

3.Nginx 如何实现负载均衡?

4.内存耗尽后Redis会发生什么?

5.Swoole 协程与 Golang 协程有哪些不同?

AI给出的答案,仅供参考:

1. MySQL索引树是由B+树数据结构实现的。对于InnoDB存储引擎来说,B+树的叶子节点存储了整行数据,非叶子节点存储了索引字段值以及指向下一层节点的指针。MySQL将每个索引字段的值映射到一个B+树节点上,以此来加速查询操作。


2. PHP-FPM是PHP FastCGI Process Manager(PHP 快速CGI进程管理器)的缩写。它允许创建和维护多个 PHP 子进程,通过建立 TCP 长连接的方式来实现与 Nginx、Apache 等 Web 服务器的通信,从而提高 PHP 脚本的性能和并发数。PHP-FPM 运行机制基于进程池模型,并支持动态调整进程池大小以适应不同的流量负载,并且可以配置各种进程管理策略来平衡资源利用率和性能需求。


3. Nginx通过负载均衡器模块来实现负载均衡。常用的负载均衡器有round-robin(轮询),ip-hash(按照客户端IP地址哈希)等。可以将多个Web服务器的访问请求分发到不同的后端服务器上,从而提高系统的并发处理能力和稳定性。在Nginx的配置文件中,需要指定代理服务器和后端服务器的IP和端口,并设置合适的负载均衡算法。


4. 当Redis的内存耗尽时,会发生内存溢出错误,并停止写入操作。此时,Redis会尝试根据配置的内存策略,将一些不活跃的键值对从内存中移除,以释放更多的空间。如果内存仍然不足,则会继续停止写入操作,并暂停对外提供服务,直到管理员手动释放空间或者调整内存配置。


5. Swoole 协程和 Golang 协程都是基于协程调度器实现的轻量级线程。其中,Golang 协程使用 M:
N 调度模型,每个
M 线程可以同时运行多个
N 协程。而 Swoole 协程使用 1:
1 调度模型,一个PHP进程会维护一个独立的协程调度器和事件循环机制。此外,Swoole 协程还支持多进程并发处理和 TCP/UDP/Unix 套接字通信等高级特性。相比之下,Golang 协程更加高效稳定,而 Swoole 协程则更为灵活和可扩展。

【找工作必问面试题】

【找工作必问面试题】

1.MySQL 数据库中 CHAR 和 VARCHAR 的区别?

2.介绍一下互斥锁和悲观锁的具体区别?

3.Nginx 如何实现负载均衡?

4.请解释一下 Nginx 服务器上的 Master 和 Worker 进程分别是什么?

5.Swoole 协程与 Golang 协程有哪些不同?


AI给出的答案,仅供参考:

1. CHAR和VARCHAR在MySQL数据库中都是用于存储字符类型的。主要区别在于,CHAR是固定长度的,而VARCHAR是可变长度的。例如,如果使用CHAR(10)存储字符串“hello”,则这个字段总共会占用10个字节的存储空间;而如果使用VARCHAR(10)存储同样的字符串,这个字段只会占用5个字节,因为“hello”只需要5个字节的存储空间。


2.互斥锁和悲观锁都是用于保护共享资源的锁。互斥锁是一种独占锁,即同一时间只能有一个线程可以持有该锁。当一个线程尝试获取互斥锁时,如果该锁已经被其他线程持有,那么该线程就会被阻塞,直到该锁释放。悲观锁则是一种悲观的保护策略,它认为在操作共享资源时,一定会有其他线程同时访问该资源,并且这些线程可能会修改共享资源的值。因此,悲观锁每次都会去请求锁,即使在没有其他线程访问该资源的情况下,也会先获取锁,然后再执行操作。


3.Nginx可以通过以下几种方式实现负载均衡:

- 轮询(Round Robin):按照请求的顺序依次分配到不同的服务器。
- IP哈希(IP Hash):根据客户端的IP地址来进行哈希计算,然后将请求分配到对应的服务器。
- 加权轮询(Weighted Round Robin):按照服务器的权重进行轮询分配,权重大的服务器收到的请求数量也更多。
- 加权IP哈希(Weighted IP Hash):根据客户端的IP地址进行哈希计算,并结合服务器的权重来进行请求分配。


4.Nginx服务器上的Master和Worker进程分别是什么?

- Master进程:该进程是Nginx的主进程,主要负责控制Nginx的启动、停止以及重载配置等操作。一旦Master进程启动,它就会读取配置文件,然后启动多个Worker进程用于处理客户端的请求。
- Worker进程:Nginx的实际工作由多个Worker进程完成。每个Worker进程都会独立地处理客户端的请求,并负责与客户端的连接交互。Master进程会将请求分配给不同的Worker进程处理,以实现请求的并发处理。


5.Swoole协程与Golang协程有哪些不同?

- Swoole协程:是通过PHP的上下文切换来实现的,因为协程在PHP语言中是不被支持的。Swoole基于ReactPHP和Coroutine实现了PHP的协程。Swoole的协程不能跨线程调用,同一线程内的协程可以无限嵌套调用,但最好不要超过4096层,否则会导致栈溢出。
- Golang协程:是一种更轻量级的线程,它可以在不同的Goroutine之间切换,而不需要使用操作系统的上下文切换。Golang的协程可以通过channel来进行协程间的通讯,从而达到并发处理的目的。Golang的协程可以在不同的线程之间进行调度,因此可以使用多核CPU进行并发处理。

大龄程序员工作

大龄程序员工作,找了一个上午问题,用abs压测没重现具体客户说的网站空白页面,但确实请求好慢了,有的请求一两分钟,有的几十秒。查看服务器使用情况,cpu使用100%,io稍微有点高,看cpu的使用基本都是php的进程还有一个redis进程。下午接着看下压测情况。因为上午是随便填的人数和并发数。下午具体根据服务器算下实际测试下。但用户反馈的直接空白页面,这个没重现。压测时就是一直在请求,时间比较长。头大的问题。有经验的交流下

【PHP开发必问面试题】

【PHP开发必问面试题】

1.PHP-FPM 进程管理有几种方式?

2.说下浏览器请求一个网址的过程?

3.高并发设计都有哪些技术方案?

4.MySQL 为什么要分库分表和读写分离?读写分离是用中间件的还是代码封装的?

5.RocketMQ 中的 Topic 和 JMS 的 queue 有什么区别?

AI给出的答案,仅供参考:

1. PHP-FPM 进程管理有三种方式:static、dynamic、ondemand。

2. 浏览器请求网址的过程如下:

(1)浏览器解析输入的网址,提取出协议、主机名和路径。

(2)浏览器查询 DNS,获取 Web 服务器的 IP 地址。

(3)浏览器向 Web 服务器发起请求,包括请求报文以及请求方式 GET 或 POST 等。

(4)Web 服务器接受请求,处理请求,返回响应报文。

(5)浏览器接收响应报文,解析内容,渲染呈现页面。

3. 高并发设计的技术方案包括:分布式缓存、负载均衡、队列系统、分布式文件系统、分库分表、读写分离等。

4. MySQL 分库分表的原因是为了应对数据量过大、单个数据库负载过高的情况,读写分离的原因则是为了分担主数据库的负载,实现高并发。读写分离可以通过中间件实现,如 MySQL-proxy,也可以通过代码封装实现,如使用数据库连接池进行读写分离。

5. RocketMQ 的 Topic 是消息发布的分类标识,而 JMS 的 queue 是消息消费的目标标识。Topic 对应的消息可以被多个消费者消费,而 queue 对应的消息只能被一个消费者消费。此外,RocketMQ 的 Topic 还支持广播模式,即每个订阅该 Topic 的消费者都能接收到该消息。

青岛网站制作工作中如何把SEO处理好

青岛网站制作工作中如何把SEO处理好
 网站优化不仅仅一门技艺,更是一门学问。要做好网站优化,不只需求控制搜索引擎的排名规则,还需求熟谙网站架构。
  搜索引擎的底子工作原理包括以下三个进程:首要,在上查找和收集web信息;一起,对信息中止提取和组织,树立索引数据库;然后,依据用户输入的查询关键字,搜索者快速检出索引数据库中的文档,点评文档与查询的相关性,对输出成果中止排序,并将查询成果返回给用户。
  
1、 什么是SEO底子优化?
  SEO底子优化也被定义为网站SEO底子优化。优化的这一步是新网站上线前的准备工作。首要是为抓捕和录入搜索引擎蜘蛛供给有利条件,所以必需在网站上线前完结。
  
2、 SEO底子优化录入什么?
  总归,301重定向网站主域名关于改善用户体会、提高SEO效果起到了很大的效果。
  404页是拜访者的过错页。当用户拜访网站上不存在或已被删除的页面时,这是一个过错页面,用于提示拜访者。在这种情况下,用户会感到沮丧,因此可以在制造进程中规划一些有趣的页面,或许引导用户持续阅览网站的其他页面,以削减用户丢失或跳出。TDK是搜索引擎寻找咱们的一个有用的话题。什么是TDK?
  标题、描绘和关键词是网站的三大标签。标题标签是咱们网站中最重要的标签之
一。一个网站可能没有描绘和关键字,但它不能有标题。标题的效果大于描绘和关键字。
  页面标题能否与本页面内容不合,相关性越强,搜索引擎排名越好。杰出显现1-3个关键字;不要超越50个字符。
  网站URL链接分为三种类型:动态链接、静态链接和伪静态链接。不同方法的网站链接对应不同方法的网站内容。但相对而言,网站静态链接更契合搜索引擎的录入规范,有利于网站的整体排名,更有利于SEO优化。
  
3、 怎么使搜索引擎像咱们的网站?
  搜索引擎是人类创造的,也就是说,人们越喜爱咱们的网站,搜索引擎就越喜爱它。Hao123这个网站必定有很多人晓得,这个网站很简单,仅仅一个网页,但是它的呈现,让太多人习气性地运用它,所以它也得到了搜索引擎的极大认可,最后百度花了几千万买下了它。
  网站底子上都是静态的HTML页面。如今网站更多的是用PHP语法编写的。网站URL链接应该规范化,防止各种方法的URL链接,这样可以削减搜索引擎对同一页面的重复索引,前进蜘蛛的有用爬行。
  咱们想让更多的人喜爱咱们的网站,这需求咱们供给更多的内容,他们需求。因此,长时间坚持专业、丰盛的内容树立成为网站优化进程中最重要的工作之
一。专业内容不只能博得用户的认可和认可,更能让用户长时间重视咱们的网站,因为咱们的网站能为他们供给源源不时的专业内容。
  新网站制造,怎么开端排名优化?
  锚文本是指向其他网页的链接方法,相似于咱们常见的超链接。它可以使搜索引擎爬行速度更快,前进网站排名,添加用户体会。因此,它可以在锚文本中做好相关关键字的规划,普通可以将其放置在网站的导航端或其他导航位置。
  搜索引擎首要依托关键词中止信息匹配,因此网站SEO优化离不开关键词的规划。你可以在网站的主页、栏目页和内容页上合理地摆放金字塔结构的关键词,但也要留意关键词的密度。假设密渡过高,就会被搜索引擎断定为做弊,招致功率降低或K站。
  死链指的是无效链接。死链对搜索引擎不友好,给用户带来欠好的体会感,因此必需对网站的死链中止检查和处置。

不喜欢php的一个最主要的原因是因为它作为一种后台语言居然不支持多线程

不喜欢php的一个最主要的原因是因为它作为一种后台语言居然不支持多线程,多线程都不支持能适应现在这个需要高效运作的时代吗?没有多线程就没有灵魂。

不支持多线程的语言以下几种场景根本就实现不了:

1、实现定时任务功能
当我们需要在后台处理一些任务,比如定时清理一些文件,定时采集一些数据等等,通常会使用定时器来实现 ,执行的时间点以及执行频率都很容易控制。

2、异步处理任务
当我们需要处理一个耗时的操作但不需要立刻知道处理结果的时候,我们可以新建一个线程异步处理该操作,这样可以提高用户体验。

3、分布式计算
当我们需要处理一个比较大的耗时任务时,我们可以将该任务切割成多个小的任务,然后开启多个线程同时处理这些小的任务,然后将结果合并,类似map、reduce算法。

4、处理高并发请求
当我们的系统有大量的用户访问的时候,一般每个用户请求会建立一个线程来处理,每个请求不会相互影响,相互阻塞。

就拿第1点来说,php不能实现定时任务功能就是个很大的问题。我们公司一个老的系统是用php写的,为了实现一些定时任务只能使用操作系统进行辅助来是做,比如linux的cron功能再结合shell脚本来实现,太麻烦了,而且性能很差。

最近还发现系统的crond进程还老是自动停掉了,不知道什么原因,真是头大,有遇到过这种问题或者知道原因的大佬可以评论区交流下。

还是java用着舒服,使用spring boot配个定时任务也就是一行代码的事,既方便又省心,遇到问题也好定位。

php也有些小优点,就是不需要编译,修改完后实时生效,也不需要重启服务。一些很简单的如建站系统可以考虑用php,业务稍微复杂一点还是建议换成java或者其他语言吧,要不后期维护和扩展会让人崩溃。

不过话说回来如果能支持多线程,我觉得php这只大象还是蛮健壮的!

kuoqiPHP+KuoqiWorker实现可视化进程管理

kuoqiPHP+KuoqiWorker实现可视化进程管理
用途用于监测多进程任务情况及多进程的管理
当前为第一个基础版,有相关需求欢迎咨询了解,可交流心得
管理界面如下:
可视化进程管理.png
特点操作简单易懂,学习0门槛,欢迎各位小伙伴借鉴学习
实现逻辑:使用tl_fork+socket实现PHP多进程及管理
KuoqiWorker常用命令:
php Worker.php:启动worker
php Worker.php restart :重启worker
php Worker.php :停止worker