在Ubuntu环境下,用PHP处理异步任务确实有不少路子可走。下面聊聊几种主流的做法。

用Gearman搭一个任务分发系统
先说第一种,Gearman。这家伙本质上是个分布式的任务队列系统,能把任务分发给多个工作进程并行处理。要在PHP里用上它,得先安装Gearman服务以及对应的PHP扩展。sudo apt-get update sudo apt-get install gearmand php-gearman装好之后,先写一个工作进程(worker.php),让它不断监听任务:
addServer(); while ($worker->work()) { $task = $worker->doNormal(); // 处理任务 }然后在需要提交任务的地方,用客户端脚本(client.php)把任务丢过去:
addServer(); $task = $client->doNormal('task_name', 'task_data'); // 处理任务结果Redis + 多线程扩展(pthreads)
第二种路子,先装好Redis服务和PHP扩展:sudo apt-get update sudo apt-get install redis-server php-redis然后配合PHP的多线程扩展pthreads来实现异步。不过这里得提醒一句:pthreads只支持在CLI模式下运行,不能用在Web环境里。安装它:
pecl install pthreads写一个异步任务类(async_task.php),继承Thread并重写run方法:
start();运行脚本:
php async_task.phpSupervisor + 队列,让进程自己管自己
第三种方案适合正式环境。Supervisor是一个进程管理工具,可以帮你监控后台进程,万一挂了还能自动重启。先把任务塞进队列(比如Beanstalkd、RabbitMQ),然后用Supervisor管理的工作进程去处理。安装Supervisor:
sudo apt-get update sudo apt-get install supervisor写一个配置文件(/etc/supervisor/conf.d/queue_worker.conf),告诉Supervisor要启动几个进程、跑什么命令:
[program:queue_worker] command=php /path/to/your/queue_worker_script.php autostart=true autorestart=true numprocs=4然后让Supervisor重新加载配置并启动任务:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start queue_worker对应的PHP脚本(queue_worker_script.php)里,只需要连接队列服务,取一个任务处理一个:
以上三种方法各有千秋,具体用哪个取决于你的业务场景和基础设施。Gearman适合简单的分布式任务分发,Redis+多线程适合短小且不依赖外部服务的异步操作,Supervisor+队列则更适合长期运行、需要高可靠性的后台处理。选一个上手试试,很快就能跑起来。