royee
royee
php多进程
实际上PHP是有多线程的,只是很多人不常用。使用PHP的多线程首先需要下载安装一个线程安全版本(ZTS版本)的PHP,然后再安装pecl的[pthread扩展](http://pecl.php.net/package/pthreads "pthread扩展")。 [参考](http://rango.swoole.com/archives/48) 实际上PHP是有多进程的,有一些人再用,总体来说php的多进程还算凑合,只需要在安装PHP的时候开启pcntl模块(是不是跟UNIX中的fcntl有点儿.... ....)即可。在*NIX下,在终端命令行下使用php -m就可以看到是否开启了pcntl模块。 所以我们只说php的多进程,至于php多线程就暂时放到一边儿。 **注意:不要在apache或者fpm环境下使用php多进程,这将会产生不可预估的后果。** **进程是程序执行的实例**,举个例子有个程序叫做 “ 病毒.exe ”,这个程序平时是以文件形式存储在硬盘上,当你双击运行后,就会形成一个该程序的进程。系统会给每一个进程分配一个唯一的非负整数用来标记进程,这个数字称作进程ID。当该进程被杀死或终止后,其进程ID就会被系统回收,然后分配给新的其余的进程。 说了这么多,这鬼东西有什么用吗?我平时用CI、YII写个CURD跟这个也没啥关联啊。实际上,如果你了解APACHE PHP MOD或者FPM就知道这些东西就是多进程实现的。以FPM为例,一般都是nginx作为http服务器挡在最前面,静态文件请求则nginx自行处理,遇到php动态请求则转发给php-fpm进程来处理。如果你的php-fpm配置只开了5个进程,如果处理任意一个用户的请求都需要1秒钟,那么5个fpm进程1秒中就最多只能处5个用户的请求。所以结论就是:如果要单位时间内干活更快更多,就需要更多的进程,总之一句话就是多进程可以加快任务处理速度。 在php中我们使用pcntl_fork()来创建多进程(在*NIX系统的C语言编程中,已有进程通过调用fork函数来产生新的进程)。fork出来新进程则成为子进程,原进程则成为父进程,子进程拥有父进程的副本。这里要注意: - 子进程与父进程共享程序正文段 - 子进程拥有父进程的数据空间和堆、栈的副本,注意是副本,不是共享 - 父进程和子进程将继续执行fork之后的程序代码 - fork之后,是父进程先执行还是子进程先执行无法确认,取决于系统调度(取决于信仰) 这里说子进程拥有父进程数据空间以及堆、栈的副本,实际上,在大多数的实现中也并不是真正的完全副本。更多是采用了COW(Copy On Write)即写时复制的技术来节约存储空间。简单来说,如果父进程和子进程都不修改这些 数据、堆、栈 的话,那么父进程和子进程则是暂时共享同一份 数据、堆、栈。只有当父进程或者子进程试图对...
##### socket的中文名字叫做套接字,这种东西就是对TCP/IP的“封装”。现实中的网络实际上只有四层而已,从上至下分别是应用层、传输层、网络层、数据链路层。最常用的http协议则是属于应用层的协议,而socket,可以简单粗暴的理解为是传输层的一种东西。如果还是很难理解,那再粗暴地点儿tcp://218.221.11.23:9999,看到没?这就是一个tcp socket。 ##### socket赋予了我们操控传输层和网络层的能力,从而得到更强的性能和更高的效率,socket编程是解决高并发网络服务器的最常用解决和成熟的解决方案。任何一名服务器程序员都应当掌握socket编程相关技能。 ##### 在php中,可以操控socket的函数一共有两套,一套是socket_*系列的函数,另一套是stream_*系列的函数。socket_*是php直接将C语言中的socket抄了过来得到的实现,而stream_*系则是php使用流的概念将其进行了一层封装。下面用socket_*系函数简单为这一系列文章开个篇。 ##### 先来做个最简单socket服务器: ```php
如何高效地监控文件发生变动? ```php //利用inotify监控文件变化 $fd = inotify_init(); //将$fd添加到Swoole的EventLoop Swoole\Event::add($fd, function () use ($fd){ $var = inotify_read($fd);//文件发生变化后读取变化的文件。 var_dump($var); }); ``` 实际上,早很很久之前的公元2005年,当Linux Kernel 2.6.13发布的时候,文件系统中就集成了一个叫做inotify的组件,这个玩意的作者分别是John、Amy和Robot(排名不分先后)。inotify出现的目的是为了代替Linux Kernel中的dnotify(由于历史比较久远老李本身也没有碰过dnotify)。据史料记载这个inotify具备如下几个优点: 避免了while true这种人肉打桩机、电动小马达形式的主动轮训方案 避免像dnotify那种「被监控文件或者目录」不得不都要创建fd的浪费 提升监控细粒度,除了目录外,还可以监控具体文件,而据史料记载dnotify只能监控目录(注意是据史料记载) inotify还可以直接利用select、poll这种IO多路复用,非常方便 而它的API就三个,非常粗暴,你们感受一下: ```c int...
docker login ``` Error saving credentials: error storing credentials - err: exit status 1, out: Post "http://ipc/registry/credstore-updated": dial unix backend.sock ``` vim ~/.docker/config.json 删除一行 ``` "credStore": "desktop" ```
```bash ./configure --with-php-config=/Applications/ServBay/package/php/8.3/8.3.10/bin/php-config ``` configure: error: Please reinstall the event library, or provide the installation prefix via --with-event-libevent-dir option 说找不到libevent brew info libevent /opt/homebrew/Cellar/libevent/2.1.12_1 ```bash ./configure --with-php-config=/Applications/ServBay/package/php/8.3/8.3.10/bin/php-config --with-event-libevent-dir=/opt/homebrew/Cellar/libevent/2.1.12_1 加上libevent 目录...
```shell #!/bin/bash # apt -y install unzip # install besttrace if [ ! -f "besttrace2021" ]; then wget https://github.com/zq/shell/raw/master/besttrace2021 # unzip besttrace4linux.zip chmod +x besttrace2021 fi ## start to use...
Kint是一个类似于var_dump()的PHP变量调试工具,但提供了更多高级功能,如键盘控制、搜索、访问路径提示和自动数据解析。支持JSON结构的展开和搜索,提供访问特定字段所需的代码片段。 composer require kint-php/kint --dev ## 简单打印
golang里log日志,老项目 zap ,新项目 可使用slog 在 Go 语言里,slog 是从 Go 1.21 版本开始引入的标准日志库, 它提供了结构化日志记录的功能,可轻松自定义日志输出格式和级别。 下面为你提供几个 slog 的使用案例。 在Go语言里,`slog` 是从Go 1.21版本开始引入的标准日志库, 它提供了结构化日志记录的功能,可轻松自定义日志输出格式和级别。 下面为你提供几个 `slog` 的使用案例。 ### 1. 基本日志记录 下面的代码展示了如何使用 `slog` 进行基本的日志记录。 ```go package...
在 Go 语言中,`sync.WaitGroup` 是一个用于等待一组 goroutine 完成的同步原语。下面详细介绍其底层原理。 ### 数据结构 `sync.WaitGroup` 的底层数据结构定义在 Go 标准库的 `sync` 包中,核心结构如下: ```go type WaitGroup struct { noCopy noCopy state1 [3]uint32 } ``` - `noCopy`:这是一个辅助字段,用于在代码检查时防止 `WaitGroup` 被复制。如果尝试复制 `WaitGroup`,在编译时会触发警告,避免因复制...