首先,PHP是可以操作多进程的,这个模块叫做pcntl,一般情况下,会被默认安装,可以通过php -m来查询。
PHP也可以操作多线程,需要一个叫做pthread的库来实现,但是PHP的pthread比较奇怪,变量一直不能共享,似乎失去了多线程的意义。
相对来说,在生产环境更具备价值的是php的多进程。
一般收来是如下几个函数:
pcntl_fork,这个函数就相当于linux系统下的fork系统调用,用来fork出一个新的进程。
pcntl_wait或者pcntl_waitpid,这个函数是用来防止僵尸进程的。
pcntl_exe相当于linux下的exec,就是在当前进程中直接执行另外一个进程,比如利用php进程直接呼起一个go程序或者nodejs程序
pcntl_signal是给一个进程安装信号处理器,比如说给当前进程安装一个“A信号”处理器,那么当当前进程收到A信号后,就会作出相应的反应。比如我们给当前进程安装一个usr1信号,然后自己就会重启。
pcntl_signal_dispatch,当给进程通过pcntl_signal安装了信号处理器后,还需要通过这个函数分发起来,不分发起来是完全没用的,进程收到信号并不会有什么反应。
pcntl_alarm,给一个进程设置闹钟信号,就是每隔x时间就给某进程发送一次SIGALRM信号,该进程收到后作出相应反应。
这些基本上就是常用的php多进程操作的主要函数。
进程和线程是有很大区别的。我们知道,进程是操作系统最小操作单元,进程之于操作系统,就好比线程之于进程。一个进程中可以含有多个线程。但是二者有很大的区别:
1 创建进程代价相对于创建线程是比较大的
2 进程间的切换的代价相对于线程间切换是比较大的
3 多个进程而言,每个进程都拥有自己的存储空间、堆栈、数据,彼此之间并不能共享;而线程是属于同一个进程的,说白了是没有自己隐私空间的,变量、数据、内存都是共享的,如果涉及到多个线程操作同一个变量,那么此时就一定要注意给变量加锁,这就是传说中的线程安全问题。而对于多进程而言,就不会有这个问题,因为完全相同的两个变量名,如果属于两个进程,那么两个进程操作这两个变量彼此之间不会有任何问题。当然了,这中优势你可以看作是劣势,而线程的这个劣势又随时可以转换为优势
快捷翻译 - 快到离谱!
划词翻译
自动发声
自动添加生词本