队列:
使用队列是充分利用它异步的特性,即业务代码中有可以延迟响应的模块,当前代码不需要立即使用这个模块得到的结果,迟一些也没关系,代码还要继续执行主要的事情并返回给用户。
像邮件、订单等,这些场景,使用队列,延迟响应,使得系统性能提高(比如:不用在大量邮件发送代码上阻塞),同时又不用像web系统一样要及时响应,用户延迟收到消息是可以接受的。
而实质上,邮件发送一般还结合多进程/线程来做。因为仅靠异步还是不够的,处理大量邮件的业务代码如果也只是单一作业,无疑还是很慢,所以就要多个劳动力一起发,每个人发一部分。
多进程/线程:
这就是多进程/线程,同时做多件事情,来提升效率,完成目标。当然多进程/线程本来就具有异步性,而与利用队列的异步特点不同,多进程/线程的异步性是需要控制,需要做同步。
共享内存:
多进程作业因为每个进程的独立性,不能共享内存(同一个进程的线程可以共享内存,但跨进程的线程不能)。所以共享内存就可以用来存放并提供各个进程所需要的结果。
文件锁、信号量:
但是每个进程都去访问临界资源(共享内存或者文件资源),就会产生不一样的结果,这时候为确保进程/线程之间的井然有序地达到目标、完成任务,文件锁、信号量就因此而生。
php-fpm 不支持fork的使用,因此不管是fork还是swoole,都是采用cli模式。如果要在php-fpm下使用,就结合队列或者管道去执行fork。