PHP 怎么常驻进程框架

wen PHP项目 2

本文目录导读:

PHP 怎么常驻进程框架

  1. Swoole 框架(最推荐)
  2. Workerman 框架
  3. ReactPHP 框架
  4. AMPHP 框架
  5. 传统方式 + pcntl 扩展
  6. Hyperf 框架
  7. 选择建议
  8. 进程管理最佳实践

在 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 是目前最推荐的方案,性能和功能最全面。

抱歉,评论功能暂时关闭!