本文目录导读:

在 PHP 中实现常驻进程(长驻内存)的框架和方案,主要有以下几种主流选择:
Swoole 框架(最推荐)
Swoole 是 PHP 最成熟的异步/协程框架,专门为常驻进程设计。
基础使用示例:
// server.php
use Swoole\Http\Server;
$server = new Server("0.0.0.0", 9501);
$server->on("start", function (Server $server) {
echo "Swoole HTTP Server is started\n";
});
$server->on("request", function ($request, $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello Swoole\n");
});
$server->start();
进程模型:
$server->set([
'worker_num' => 4, // 工作进程数
'daemonize' => false, // 是否守护进程化
'max_request' => 10000, // 每个进程最大请求数
'log_file' => '/tmp/swoole.log',
'pid_file' => '/tmp/server.pid',
]);
Workerman 框架
Workerman 是纯 PHP 实现的常驻进程框架,不需要扩展。
基本用法:
// server.php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$httpWorker = new Worker("http://0.0.0.0:2345");
$httpWorker->count = 4; // 进程数
$httpWorker->onMessage = function($connection, $data) {
$connection->send("Hello World");
};
Worker::runAll();
定时器使用:
use Workerman\Timer;
$worker = new Worker('text://0.0.0.0:2345');
$worker->onWorkerStart = function ($worker) {
// 每10秒执行一次
Timer::add(10, function () use ($worker) {
echo "定时任务执行\n";
});
};
ReactPHP 框架
ReactPHP 是基于事件驱动的异步框架,用于构建单进程异步应用。
基本使用:
<?php
require __DIR__ . '/vendor/autoload.php';
use React\EventLoop\Factory;
use React\Http\Server as HttpServer;
use React\Http\Message\Response;
use Psr\Http\Message\ServerRequestInterface;
$loop = Factory::create();
$server = new HttpServer($loop, function (ServerRequestInterface $request) {
return new Response(
200,
['Content-Type' => 'text/plain'],
"Hello ReactPHP\n"
);
});
$socket = new React\Socket\Server('0.0.0.0:8080', $loop);
$server->listen($socket);
$loop->run();
AMPHP 框架
AMPHP 是基于协程的异步框架。
<?php
require __DIR__ . '/vendor/autoload.php';
use Amp\Loop;
use Amp\Http\Server\HttpServer;
use Amp\Http\Server\Request;
use Amp\Http\Server\Response;
use Amp\Socket\Server;
Loop::run(function () {
$socket = yield Server::listen('0.0.0.0:8080');
$server = new HttpServer($socket, function (Request $request) {
return new Response(200, [], "Hello AMPHP");
});
yield $server->start();
});
传统方式 + pcntl 扩展
使用 PHP 自带的 pcntl 扩展实现进程管理。
<?php
// daemon.php
declare(ticks = 1);
class Daemon {
private $pidFile;
private $logFile;
public function __construct($pidFile, $logFile) {
$this->pidFile = $pidFile;
$this->logFile = $logFile;
}
public function start() {
// Fork 子进程
$pid = pcntl_fork();
if ($pid == -1) {
die("无法创建子进程");
} elseif ($pid) {
// 父进程退出
exit(0);
}
// 成为会话领导者
posix_setsid();
// fork,避免获取终端
$pid = pcntl_fork();
if ($pid == -1) {
die("无法创建子进程");
} elseif ($pid) {
exit(0);
}
// 写入 PID 文件
file_put_contents($this->pidFile, posix_getpid());
// 重定向标准输入输出
$log = fopen($this->logFile, 'a');
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
// 主循环
while (true) {
// 处理业务逻辑
$this->process();
sleep(5);
}
}
private function process() {
file_put_contents($this->logFile, date('Y-m-d H:i:s') . " 执行任务\n", FILE_APPEND);
}
}
// 使用
$daemon = new Daemon('/tmp/app.pid', '/tmp/app.log');
$daemon->start();
Hyperf 框架
Hyperf 是基于 Swoole 的全功能框架。
// config/server.php
return [
'mode' => SWOOLE_PROCESS,
'servers' => [
[
'name' => 'http',
'type' => Style::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9501,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
],
],
],
'settings' => [
'worker_num' => 4,
'max_request' => 10000,
'daemonize' => 0,
],
];
选择建议
| 需求场景 | 推荐方案 |
|---|---|
| 高并发 HTTP API | Swoole / Hyperf |
| 简单常驻进程 | Workerman |
| 纯 PHP 无扩展 | Workerman / ReactPHP |
| 协程异步 | Swoole / AMPHP |
| 微服务 | Hyperf |
进程管理最佳实践
// 进程退避重启策略
$server->set([
'max_request' => 10000, // 防止内存泄漏
'reload_async' => true, // 异步安全重启
'task_worker_num' => 8, // 异步任务进程
'dispatch_mode' => 2, // 分配模式
]);
选择合适的框架主要取决于你的具体需求:性能要求、是否允许安装扩展、开发效率等因素,Swoole 是目前最推荐的方案,性能和功能最全面。