ไฟล์การกำหนดค่า

ตำแหน่ง

ไฟล์การกำหนดค่าของ webman อยู่ในไดเร็กทอรี config/ ซึ่งในโปรเจกต์สามารถใช้ฟังก์ชัน config() เพื่อเรียกค่าการกำหนดค่าที่เกี่ยวข้องได้

การเข้าถึงการกำหนดค่า

เข้าถึงการกำหนดค่าทั้งหมด

config();

เข้าถึงการกำหนดค่าทั้งหมดใน config/app.php

config('app');

เข้าถึงการกำหนดค่า debug ใน config/app.php

config('app.debug');

หากการกำหนดค่าเป็นอาร์เรย์ สามารถใช้ . เพื่อเข้าถึงค่าในอาร์เรย์ เช่น

config('file.key1.key2');

ค่าดีฟอลต์

config($key, $default);

ฟังก์ชัน config จะรับค่าเริ่มต้นผ่านพารามิเตอร์ที่สอง หากการกำหนดค่าไม่มี จะส่งค่าที่เป็นค่าเริ่มต้นกลับมา
ถ้าการกำหนดค่าไม่มีและไม่มีการตั้งค่าค่าเริ่มต้นจะส่งกลับเป็น null

การกำหนดค่าที่กำหนดเอง

นักพัฒนาสามารถเพิ่มไฟล์กำหนดค่าของตนเองในไดเร็กทอรี config/ เช่น

config/payment.php

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

เมื่อใช้งานการเข้าถึงการกำหนดค่า

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

การเปลี่ยนแปลงการกำหนดค่า

webman ไม่รองรับการเปลี่ยนแปลงการกำหนดค่าแบบไดนามิก ทุกการกำหนดค่าต้องแก้ไขในไฟล์การกำหนดค่าที่เกี่ยวข้องด้วยตนเอง และต้อง reload หรือ restart เพื่อให้การเปลี่ยนแปลงมีผล

หมายเหตุ
การกำหนดค่าเซิร์ฟเวอร์ config/server.php และการกำหนดค่ากระบวนการ config/process.php ไม่รองรับ reload ต้อง restart เท่านั้นถึงจะมีผล

การแจ้งเตือนพิเศษ

หากคุณต้องการสร้างไฟล์การกำหนดค่าในไดเร็กทอรีย่อยของ config และอ่าน เช่น config/order/status.php จะต้องมีไฟล์ app.php อยู่ในไดเร็กทอรี config/order โดยมีเนื้อหาดังนี้

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

enable เป็น true หมายถึงให้เฟรมเวิร์กอ่านการกำหนดค่าในไดเร็กทอรีนี้
โครงสร้างต้นไม้ของไฟล์การกำหนดสุดท้ายจะมีลักษณะเช่นนี้

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

คุณสามารถอ่านอาร์เรย์ที่ส่งกลับจาก status.php หรือข้อมูลคีย์เฉพาะผ่าน config.order.status ได้แล้ว

คำชี้แจงไฟล์การกำหนดค่า

server.php

return [
    'listen' => 'http://0.0.0.0:8787', // พอร์ตที่ฟัง(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'transport' => 'tcp', // โปรโตคอลชั้นส่งข้อมูล(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'context' => [], // การกำหนดค่า ssl เป็นต้น(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'name' => 'webman', // ชื่อกระบวนการ(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'count' => cpu_count() * 4, // จำนวนกระบวนการ(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'user' => '', // ผู้ใช้(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'group' => '', // กลุ่มผู้ใช้(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'reusePort' => false, // เปิดการใช้งานพอร์ตซ้ำหรือไม่(ตั้งแต่รุ่น 1.6.0 เป็นต้นไปจะถูกย้ายไปยัง config/process.php)
    'event_loop' => '',  // คลาสลูปเหตุการณ์ โดยค่าเริ่มต้นจะเลือกอัตโนมัติ
    'stop_timeout' => 2, // เมื่อได้รับสัญญาณ stop/restart/reload เวลาสูงสุดในการรอให้เสร็จสิ้นก่อนจะถูกบังคับให้หยุด
    'pid_file' => runtime_path() . '/webman.pid', // ตำแหน่งเก็บไฟล์ pid
    'status_file' => runtime_path() . '/webman.status', // ตำแหน่งเก็บไฟล์สถานะ
    'stdout_file' => runtime_path() . '/logs/stdout.log', // ตำแหน่งไฟล์เอาท์พุตมาตรฐาน ทุกการเอาท์พุตจะถูกเขียนลงไฟล์นี้หลังจาก webman เริ่มทำงาน
    'log_file' => runtime_path() . '/logs/workerman.log', // ตำแหน่งไฟล์บันทึก workerman
    'max_package_size' => 10 * 1024 * 1024 // ขนาดข้อมูลสูงสุด 10M ขนาดไฟล์ที่อัปโหลดจะอยู่ภายใต้การจำกัดนี้
];

app.php

return [
    'debug' => true,  // เปิดโหมด debug หรือไม่ หากเปิดจะมีการแสดงสแต็กการเรียกใช้งานในกรณีผิดพลาด เพื่อความปลอดภัยในสภาพแวดล้อมการผลิตควรปิดโหมด debug
    'error_reporting' => E_ALL, // ระดับการรายงานข้อผิดพลาด
    'default_timezone' => 'Asia/Shanghai', // โซนเวลาที่ตั้งเป็นค่าเริ่มต้น
    'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public', // ตำแหน่งไดเร็กทอรี public
    'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime', // ตำแหน่งไดเร็กทอรี runtime
    'controller_suffix' => 'Controller', // คำต่อท้ายของคอนโทรลเลอร์
    'controller_reuse' => false, // คอนโทรลเลอร์สามารถนำกลับมาใช้ใหม่ได้หรือไม่
];

process.php

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

return [
     // การกำหนดค่ากระบวนการ webman
    'webman' => [ 
        'handler' => Http::class, // คลาสจัดการกระบวนการ
        'listen' => 'http://0.0.0.0:8787', // ที่อยู่ที่ฟัง
        'count' => cpu_count() * 4, // จำนวนกระบวนการเริ่มต้นที่สูงกว่าตัวประมวลผล 4 เท่า
        'user' => '', // ผู้ใช้ที่รันกระบวนการ ควรใช้ผู้ใช้ระดับต่ำ
        'group' => '', // กลุ่มผู้ใช้ที่รันกระบวนการ ควรใช้กลุ่มผู้ใช้ระดับต่ำ
        'reusePort' => false, // เปิดการใช้งาน reusePort หรือไม่ หากเปิดการเชื่อมต่อจะกระจายไปยังกระบวนการ worker ต่างๆ
        'eventLoop' => '', // คลาสลูปเหตุการณ์ จะใช้อัตโนมัติตามการกำหนดค่า server.event_loop 
        'context' => [], // การกำหนดค่าบริบทการฟัง เช่น ssl
        'constructor' => [ // พารามิเตอร์ของตัวสร้างคลาสจัดการกระบวนการ ในตัวอย่างนี้คือพารามิเตอร์ของคลาส Http
            'requestClass' => Request::class, // สามารถกำหนดคลาสคำขอเองได้
            'logger' => Log::channel('default'), // อินสแตนซ์บันทึก
            'appPath' => app_path(), // ตำแหน่งไดเร็กทอรีแอป
            'publicPath' => public_path() // ตำแหน่งไดเร็กทอรี public
        ]
    ],
    // กระบวนการตรวจสอบ ใช้เพื่อตรวจจับการอัปเดตไฟล์และโหลดโดยอัตโนมัติ รวมถึงการรั่วไหลของหน่วยความจำ
    'monitor' => [
        'handler' => app\process\Monitor::class, // คลาสจัดการ
        'reloadable' => false, // กำหนดว่ากระบวนการปัจจุบันไม่ทำการ reload
        'constructor' => [ // พารามิเตอร์ของตัวสร้างคลาสจัดการกระบวนการ
            // ไดเร็กทอรีที่ต้องติดตาม ไม่ควรมากเกินไป เนื่องจากจะทำให้การตรวจสอบช้าลง
            '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')),
            // ติดตามการอัปเดตของไฟล์ที่มีนามสกุลเหล่านี้
            'monitorExtensions' => [
                'php', 'html', 'htm', 'env'
            ],
            // ตัวเลือกอื่นๆ
            'options' => [
                // เปิดการตรวจสอบไฟล์หรือไม่ ใช้ได้เฉพาะใน linux โหมด daemon จะไม่มีการเปิดการตรวจสอบไฟล์
                'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
                // เปิดการตรวจสอบหน่วยความจำหรือไม่ รองรับเฉพาะใน linux
                'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
            ]
        ]
    ]
];

container.php

// ส่งคืนอินสแตนซ์คอนเทนเนอร์การฉีดยา psr-11
return new Webman\Container;

dependence.php

// ใช้สำหรับการกำหนดค่าเซอร์วิสและความสัมพันธ์ของการฉีดยาในคอนเทนเนอร์
return [];

route.php


use support\Route;
// กำหนดเส้นทางสำหรับเส้นทาง /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 // คลาสจัดการวิวนั้นๆ 
];

autoload.php

// กำหนดไฟล์ที่ต้องอัตโนมัติในการโหลด
return [
    'files' => [
        base_path() . '/app/functions.php',
        base_path() . '/support/Request.php',
        base_path() . '/support/Response.php',
    ]
];

cache.php

// การกำหนดค่าการแคช
return [
    'default' => 'file', // ไฟล์เริ่มต้น
    'stores' => [
        'file' => [
            'driver' => 'file',
            'path' => runtime_path('cache') // ตำแหน่งเก็บไฟล์แคช
        ],
        'redis' => [
            'driver' => 'redis',
            'connection' => 'default' // ชื่อการเชื่อมต่อ redis ตรงกับการกำหนดค่าใน redis.php
        ],
        'array' => [
            'driver' => 'array' // แคชในหน่วยความจำ จะหมดอายุเมื่อรีสตาร์ท
        ]
    ]
];

redis.php

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

database.php

return [
 // ฐานข้อมูลเริ่มต้น
 'default' => 'mysql',
 // การกำหนดค่าฐานข้อมูลต่างๆ
 '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 [
    // กำหนดคลาสจัดการข้อยกเว้น 
    '' => support\exception\Handler::class,
];

log.php

return [
    'default' => [
        'handlers' => [
            [
                'class' => Monolog\Handler\RotatingFileHandler::class, // ตัวจัดการ
                'constructor' => [
                    runtime_path() . '/logs/webman.log', // ชื่อไฟล์บันทึก
                    7, //$maxFiles // เก็บเฉพาะบันทึกภายใน 7 วัน
                    Monolog\Logger::DEBUG, // ระดับบันทึก
                ],
                'formatter' => [
                    'class' => Monolog\Formatter\LineFormatter::class, // ตัวจัดรูปแบบ
                    'constructor' => [null, 'Y-m-d H:i:s', true], // พารามิเตอร์จัดรูปแบบ
                ],
            ]
        ],
    ],
];

session.php

return [
     // ประเภท
    'type' => 'file', // หรือ redis หรือ redis_cluster
     // ตัวจัดการ
    'handler' => FileSessionHandler::class,
     // กำหนดค่า
    'config' => [
        'file' => [
            'save_path' => runtime_path() . '/sessions', // ตำแหน่งเก็บข้อมูล
        ],
        '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', // ชื่อ session
    'auto_update_timestamp' => false, // อัปเดต timestamp อัตโนมัติหรือไม่ ป้องกัน session หมดอายุ
    'lifetime' => 7*24*60*60, // อายุการใช้งาน
    'cookie_lifetime' => 365*24*60*60, // อายุการใช้งานของคุกกี้
    'cookie_path' => '/', // เส้นทางคุกกี้
    'domain' => '', // โดนัลด์คุกกี้
    'http_only' => true, // เข้าถึงได้เฉพาะ http
    'secure' => false, // เข้าถึงได้เฉพาะ https
    'same_site' => '', // คุณสมบัติ SameSite
    'gc_probability' => [1, 1000], // ความน่าจะเป็นการเก็บข้อดี
];

middleware.php

// กำหนด middleware
return [];

static.php

return [
    'enable' => true, // เปิดใช้งานการเข้าถึงไฟล์สถิตของ webman หรือไม่
    'middleware' => [ // middleware สำหรับไฟล์สถิติ สามารถใช้ในการกำหนดกลยุทธ์การแคช การข้ามโดเมน เป็นต้น
        //app\middleware\StaticFile::class,
    ],
];

translation.php

return [
    // ภาษาเริ่มต้น
    'locale' => 'zh_CN',
    // ภาษาเบื้องหลัง
    'fallback_locale' => ['zh_CN', 'en'],
    // ตำแหน่งเก็บไฟล์ภาษา
    'path' => base_path() . '/resource/translations',
];