Tập tin cấu hình

Vị trí

Tập tin cấu hình của webman nằm trong thư mục config/, trong dự án có thể sử dụng hàm config() để lấy các cấu hình tương ứng.

Lấy cấu hình

Lấy tất cả cấu hình

config();

Lấy tất cả cấu hình trong config/app.php

config('app');

Lấy cấu hình debug trong config/app.php

config('app.debug');

Nếu cấu hình là mảng, có thể sử dụng . để lấy giá trị của phần tử bên trong mảng, ví dụ

config('file.key1.key2');

Giá trị mặc định

config($key, $default);

config thông qua tham số thứ hai để truyền giá trị mặc định, nếu cấu hình không tồn tại thì trả về giá trị mặc định.
Nếu cấu hình không tồn tại và không có giá trị mặc định được thiết lập thì trả về null.

Cấu hình tùy chỉnh

Các nhà phát triển có thể thêm tập tin cấu hình của riêng mình trong thư mục config/, ví dụ

config/payment.php

<?php
return [
    'key' => '...',
    'secret' => '...'
];

Sử dụng khi lấy cấu hình

config('payment');
config('payment.key');
config('payment.key');

Thay đổi cấu hình

webman không hỗ trợ thay đổi cấu hình động, tất cả cấu hình phải được sửa đổi thủ công trong các tập tin cấu hình tương ứng, và cần phải reload hoặc restart để khởi động lại

Lưu ý
Cấu hình máy chủ config/server.php và cấu hình tiến trình config/process.php không hỗ trợ reload, cần phải restart để có hiệu lực

Nhắc nhở đặc biệt

Nếu bạn muốn tạo tập tin cấu hình trong thư mục con của config và đọc, chẳng hạn: config/order/status.php, thì thư mục config/order cần có một tập tin app.php, nội dung như sau

<?php
return [
    'enable' => true,
];

enabletrue thể hiện việc cho phép framework đọc cấu hình trong thư mục này.
Cuối cùng, cây thư mục của các tập tin cấu hình trông tương tự như dưới đây

├── config
│   ├── order
│   │   ├── app.php
│   │   └── status.php

Bây giờ bạn có thể sử dụng config.order.status để đọc mảng được trả về trong status.php hoặc dữ liệu của key cụ thể.

Giải thích tập tin cấu hình

server.php

return [
    'listen' => 'http://0.0.0.0:8787', // Cổng lắng nghe (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'transport' => 'tcp', // Giao thức lớp truyền tải (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'context' => [], // cấu hình ssl, v.v. (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'name' => 'webman', // Tên tiến trình (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'count' => cpu_count() * 4, // Số lượng tiến trình (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'user' => '', // Người dùng (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'group' => '', // Nhóm người dùng (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'reusePort' => false, // Có mở tính năng tái sử dụng cổng hay không (bắt đầu từ phiên bản 1.6.0 đã được loại bỏ, cấu hình trong config/process.php)
    'event_loop' => '',  // Lớp vòng lặp sự kiện, mặc định tự động chọn
    'stop_timeout' => 2, // Khi nhận tín hiệu stop/restart/reload, thời gian tối đa chờ hoàn thành xử lý, nếu quá thời gian này mà tiến trình không thoát thì sẽ buộc phải thoát
    'pid_file' => runtime_path() . '/webman.pid', // Vị trí lưu trữ tệp pid
    'status_file' => runtime_path() . '/webman.status', // Vị trí lưu trữ tệp status
    'stdout_file' => runtime_path() . '/logs/stdout.log', // Vị trí tệp xuất tiêu chuẩn, tất cả xuất sẽ được ghi vào tệp này sau khi webman khởi động
    'log_file' => runtime_path() . '/logs/workerman.log', // Vị trí tệp nhật ký workerman
    'max_package_size' => 10 * 1024 * 1024 // Kích thước gói dữ liệu tối đa, 10M. Kích thước tệp tải lên bị giới hạn bởi điều này
];

app.php

return [
    'debug' => true,  // Có mở tính năng debug hay không, nếu mở, lỗi trên trang sẽ xuất ra stack call và thông tin debug khác, để an toàn môi trường sản xuất nên tắt debug
    'error_reporting' => E_ALL, // Mức độ báo lỗi
    'default_timezone' => 'Asia/Shanghai', // Múi giờ mặc định
    'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public', // Vị trí thư mục public
    'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime', // Vị trí thư mục runtime
    'controller_suffix' => 'Controller', // Tiền tố của controller
    'controller_reuse' => false, // Có tái sử dụng controller hay không
];

process.php

use support\Log;
use support\Request;
use app\process\Http;
global $argv;

return [
     // Cấu hình tiến trình webman
    'webman' => [ 
        'handler' => Http::class, // Lớp xử lý tiến trình
        'listen' => 'http://0.0.0.0:8787', // Địa chỉ lắng nghe
        'count' => cpu_count() * 4, // Số lượng tiến trình, mặc định là gấp 4 lần cpu
        'user' => '', // Người dùng chạy tiến trình, nên sử dụng người dùng cấp thấp
        'group' => '', // Nhóm người dùng chạy tiến trình, nên sử dụng nhóm người dùng cấp thấp
        'reusePort' => false, // Có mở tính năng reusePort hay không, nếu mở, kết nối sẽ được phân phối đều cho các tiến trình worker khác nhau
        'eventLoop' => '', // Lớp vòng lặp sự kiện, nếu rỗng sẽ tự động sử dụng cấu hình server.event_loop 
        'context' => [], // Cấu hình ngữ cảnh lắng nghe, ví dụ ssl
        'constructor' => [ // Tham số hàm khởi tạo lớp xử lý tiến trình, trong ví dụ này là tham số của lớp Http
            'requestClass' => Request::class, // Có thể tùy chỉnh lớp yêu cầu
            'logger' => Log::channel('default'), // Thực thể nhật ký
            'appPath' => app_path(), // Vị trí thư mục app
            'publicPath' => public_path() // Vị trí thư mục public
        ]
    ],
    // Tiến trình giám sát, dùng để phát hiện cập nhật tệp tự động nạp và rò rỉ bộ nhớ
    'monitor' => [
        'handler' => app\process\Monitor::class, // Lớp xử lý
        'reloadable' => false, // Tiến trình hiện tại không thực hiện reload
        'constructor' => [ // Tham số hàm khởi tạo lớp xử lý tiến trình
            // Thư mục lắng nghe, không nên quá nhiều, sẽ làm chậm quá trình kiểm tra
            'monitorDir' => array_merge([
                app_path(),
                config_path(),
                base_path() . '/process',
                base_path() . '/support',
                base_path() . '/resource',
                base_path() . '/.env',
            ], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
            // Lắng nghe các tệp có phần mở rộng này
            'monitorExtensions' => [
                'php', 'html', 'htm', 'env'
            ],
            // Các tùy chọn khác
            'options' => [
                // Có mở tính năng giám sát tệp hay không, chỉ có hiệu lực trên linux, chế độ daemon mặc định không mở giám sát tệp
                'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
                // Có mở tính năng giám sát bộ nhớ hay không, chỉ hỗ trợ mở trên linux
                'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
            ]
        ]
    ]
];

container.php

// Trả về một phiên bản của container phụ thuộc psr-11
return new Webman\Container;

dependence.php

// Dùng để cấu hình các dịch vụ và mối quan hệ phụ thuộc trong container phụ thuộc
return [];

route.php


use support\Route;
// Định nghĩa tuyến đường cho /test
Route::any('/test', function (Request $request) {
    return response('test');
});

view.php

use support\view\Raw;
use support\view\Twig;
use support\view\Blade;
use support\view\ThinkPHP;

return [
    'handler' => Raw::class // Lớp xử lý view mặc định 
];

autoload.php

// Cấu hình các tệp được tự động tải bởi framework
return [
    'files' => [
        base_path() . '/app/functions.php',
        base_path() . '/support/Request.php',
        base_path() . '/support/Response.php',
    ]
];

cache.php

// Cấu hình bộ nhớ đệm
return [
    'default' => 'file', // Tệp mặc định
    'stores' => [
        'file' => [
            'driver' => 'file',
            'path' => runtime_path('cache') // Vị trí lưu trữ tệp bộ nhớ đệm
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default' // Tên kết nối redis, tương ứng với cấu hình trong redis.php
        ],
        'array' => [
            'driver' => 'array' // Bộ nhớ đệm trong bộ nhớ, sẽ hết hiệu lực sau khi khởi động lại
        ]
    ]
];

redis.php

return [
    'default' => [
        'host' => '127.0.0.1',
        'password' => null,
        'port' => 6379,
        'database' => 0,
    ],
];

database.php

return [
 // Cơ sở dữ liệu mặc định
 'default' => 'mysql',
 // Cấu hình các cơ sở dữ liệu khác nhau
 'connections' => [

     'mysql' => [
         'driver'      => 'mysql',
         'host'        => '127.0.0.1',
         'port'        => 3306,
         'database'    => 'webman',
         'username'    => 'webman',
         'password'    => '',
         'unix_socket' => '',
         'charset'     => 'utf8',
         'collation'   => 'utf8_unicode_ci',
         'prefix'      => '',
         'strict'      => true,
         'engine'      => null,
     ],

     'sqlite' => [
         'driver'   => 'sqlite',
         'database' => '',
         'prefix'   => '',
     ],

     'pgsql' => [
         'driver'   => 'pgsql',
         'host'     => '127.0.0.1',
         'port'     => 5432,
         'database' => 'webman',
         'username' => 'webman',
         'password' => '',
         'charset'  => 'utf8',
         'prefix'   => '',
         'schema'   => 'public',
         'sslmode'  => 'prefer',
     ],

     'sqlsrv' => [
         'driver'   => 'sqlsrv',
         'host'     => 'localhost',
         'port'     => 1433,
         'database' => 'webman',
         'username' => 'webman',
         'password' => '',
         'charset'  => 'utf8',
         'prefix'   => '',
     ],
 ],
];

exception.php

return [
    // Thiết lập lớp xử lý ngoại lệ 
    '' => support\exception\Handler::class,
];

log.php

return [
    'default' => [
        'handlers' => [
            [
                'class' => Monolog\Handler\RotatingFileHandler::class, // Bộ xử lý
                'constructor' => [
                    runtime_path() . '/logs/webman.log', // Tên nhật ký
                    7, //$maxFiles // Lưu giữ nhật ký trong 7 ngày
                    Monolog\Logger::DEBUG, // Mức độ nhật ký
                ],
                'formatter' => [
                    'class' => Monolog\Formatter\LineFormatter::class, // Bộ định dạng
                    'constructor' => [null, 'Y-m-d H:i:s', true], // Tham số định dạng
                ],
            ]
        ],
    ],
];

session.php

return [
     // Loại
    'type' => 'file', // hoặc redis hoặc redis_cluster
     // Bộ xử lý
    'handler' => FileSessionHandler::class,
     // Cấu hình
    'config' => [
        'file' => [
            'save_path' => runtime_path() . '/sessions', // Thư mục lưu trữ
        ],
        'redis' => [
            'host' => '127.0.0.1',
            'port' => 6379,
            'auth' => '',
            'timeout' => 2,
            'database' => '',
            'prefix' => 'redis_session_',
        ],
        'redis_cluster' => [
            'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
            'timeout' => 2,
            'auth' => '',
            'prefix' => 'redis_session_',
        ]
    ],
    'session_name' => 'PHPSID', // Tên phiên
    'auto_update_timestamp' => false, // Có tự động cập nhật dấu thời gian hay không, tránh phiên hết hạn
    'lifetime' => 7*24*60*60, // Thời gian sống
    'cookie_lifetime' => 365*24*60*60, // Thời gian sống của cookie
    'cookie_path' => '/', // Đường dẫn cookie
    'domain' => '', // Miền cookie
    'http_only' => true, // Chỉ truy cập qua http
    'secure' => false, // Chỉ truy cập qua https
    'same_site' => '', // Thuộc tính SameSite
    'gc_probability' => [1, 1000], // Xác suất thu hồi phiên
];

middleware.php

// Thiết lập middleware
return [];

static.php

return [
    'enable' => true, // Có mở quyền truy cập tệp tĩnh của webman hay không
    'middleware' => [ // Middleware cho tệp tĩnh, có thể sử dụng để thiết lập chính sách bộ nhớ đệm, CORS, v.v.
        //app\middleware\StaticFile::class,
    ],
];

translation.php

return [
    // Ngôn ngữ mặc định
    'locale' => 'zh_CN',
    // Ngôn ngữ dự phòng
    'fallback_locale' => ['zh_CN', 'en'],
    // Vị trí lưu trữ tệp ngôn ngữ
    'path' => base_path() . '/resource/translations',
];