Rumah  >  Artikel  >  rangka kerja php  >  Menganalisis proses pemuatan rangka kerja TP5 dari antara muka masuk ke output

Menganalisis proses pemuatan rangka kerja TP5 dari antara muka masuk ke output

藏色散人
藏色散人ke hadapan
2021-09-16 15:12:282788semak imbas

rangka kerja thinkphpLajur tutorial akan memperkenalkan dan menganalisis proses pemuatan rangka kerja ThinkPHP5 dari pintu masuk ke antara muka keluaran Saya harap ia akan membantu rakan yang memerlukan.

Pasang ThinkPHP

Cara memasangnya, saya tidak akan pergi ke butiran. Dokumen rasmi - Pemasangan ThinkPHP sangat lengkap Anda boleh memuat turun pakej zip melalui Komposer, Git atau pergi terus ke laman web rasmi ThinkPHP Versi yang saya pasang ialah 5.0.24

Ujian dan run

Muat turun dan pemasangan selesai Akhirnya, jika direktori muat turun projek ialah direktori akar projek pelayan tempatan anda, anda boleh terus memasukkan alamat http://localhost/thinkphp5/public/ dalam penyemak imbas untuk memasuki halaman alu-aluan lalai ThinkPHP5 , seperti yang ditunjukkan dalam rajah di bawah, yang bermaksud ThinkPHP5 telah berjaya dipasang

Selain kaedah pengendalian alamat di atas, kami boleh. juga mengkonfigurasi hos maya melalui Apache atau Nginx untuk mengakses projek Mereka yang berminat boleh pergi ke dalam talian Lihat tutorial khusus dan kemudian mengkonfigurasi hos maya anda untuk akses.

Mari kita ke intinya Mari kita analisa proses pelaksanaan ThinkPHP5 langkah demi langkah...

Fail kemasukan (publicindex.php)

Selepas membuka publicindex.php fail, kita boleh lihat, kod asal fail kemasukan adalah seperti berikut

// [ 应用入口文件 ]

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

Kod fail masukan sangat ringkas, hanya dua baris kod, fungsinya masing-masing

    Tentukan pemalar direktori awam dan beberapa prapemprosesan, dsb. define('APP_PATH', __DIR__ . '/../application/');Muatkan fail but rangka kerja (thinkphpstart.php)
  1. require __DIR__ . '/../thinkphp/start.php';Begitu juga, selepas memasukkan fail
  2. , kita boleh tahu bahawa tidak banyak kod

define('PUBLIC_PATH', __DIR__ .'/../public');Daripada dua baris kod pendek ini, kita dapat melihat bahawa terdapat dua kiri dan kanan utama

memuatkan fail asas thinkphpstart.php

namespace think;

// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php';

// 2. 执行应用
App::run()->send();
Jalankan aplikasi

    Dua perkara utama berikut akan memperkenalkan secara terperinci perkara yang dilakukan oleh kedua-dua kiri dan kanan ini
  1. require __DIR__ . '/base.php';Muat fail asas (thinkphpbase.php)
  2. Mari teruskan Buka fail App::run()->send(); dan dapati fail ini tidak lagi mempunyai dua baris kod seperti dua fail sebelumnya...

Melihat dengan teliti, saya mendapati bahawa walaupun kod tersebut mempunyai lebih daripada 60 baris, tetapi... Fungsi kod adalah jelas seperti berikut:

Menggunakan fungsi

untuk mentakrifkan banyak pemalar sistem, ditambah dua pemalar persekitaran thinkphpbase.php

Memperkenalkan kelas pemuat (thinkphplibrarythinkloader. php) untuk kegunaan seterusnya
define('THINK_VERSION', '5.0.24');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');
define('DS', DIRECTORY_SEPARATOR);
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
define('LIB_PATH', THINK_PATH . 'library' . DS);
define('CORE_PATH', LIB_PATH . 'think' . DS);
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀

// 环境常量
define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);

// 载入Loader类
require CORE_PATH . 'Loader.php';

// 加载环境变量配置文件
if (is_file(ROOT_PATH . '.env')) {
    $env = parse_ini_file(ROOT_PATH . '.env', true);

    foreach ($env as $key => $val) {
        $name = ENV_PREFIX . strtoupper($key);

        if (is_array($val)) {
            foreach ($val as $k => $v) {
                $item = $name . '_' . strtoupper($k);
                putenv("$item=$v");
            }
        } else {
            putenv("$name=$val");
        }
    }
}

// 注册自动加载
\think\Loader::register();

// 注册错误和异常处理机制
\think\Error::register();

// 加载惯例配置文件
\think\Config::set(include THINK_PATH . 'convention' . EXT);

Muatkan fail konfigurasi pembolehubah persekitaran (the Fail konfigurasi pembolehubah persekitaran dinamakan

Fail ini tidak semestinya wujud dan ditambah seperti yang diperlukan semasa proses pembangunan sebenar)
  1. define('', '')Panggil
  2. Daftar mekanisme pemuatan automatik
  3. Sistem daftar untuk pemuatan automatik.env
  4. Sokongan pemuatan automatik

    thinkLoader::register()Daftar definisi ruang nama

      Muat fail pemetaan perpustakaan kelas, yang wujud dalam
    • direktori cache
    • Composersecara automatik memuatkan
    • direktori
    • runtimepanggilanclassmap.php Daftar pengecualian dan mekanisme pengendalian ralat
    • Muatkan konvensyen fail konfigurasi (thinkphpconvention.php) extend
    Laksanakan kaedah run di bawah aplikasi (thinkphplibrarythinkApp.php)
  5. Untuk kemudahan, Walaupun kod kaedah run ini agak panjang, saya masih memilih untuk menyiarkan keseluruhan kaedah. Jangan tekan saya thinkError::register()
  6. Apa sebenarnya yang dilakukan oleh kira-kira 90 baris kod ini Digabungkan dengan analisis komen, yang utama Ia mempunyai fungsi berikut

Langkah pertama: Proses pembolehubah

untuk memastikan ia sah dan bukan batal

/**
 * 执行应用程序
 * @access public
 * @param  Request $request 请求对象
 * @return Response
 * @throws Exception
 */
public static function run(Request $request = null)
{
    $request = is_null($request) ? Request::instance() : $request;

    try {
        $config = self::initCommon();

        // 模块/控制器绑定
        if (defined('BIND_MODULE')) {
            BIND_MODULE && Route::bind(BIND_MODULE);
        } elseif ($config['auto_bind_module']) {
            // 入口自动绑定
            $name = pathinfo($request->baseFile(), PATHINFO_FILENAME);
            if ($name && 'index' != $name && is_dir(APP_PATH . $name)) {
                Route::bind($name);
            }
        }

        $request->filter($config['default_filter']);

        // 默认语言
        Lang::range($config['default_lang']);
        // 开启多语言机制 检测当前语言
        $config['lang_switch_on'] && Lang::detect();
        $request->langset(Lang::range());

        // 加载系统语言包
        Lang::load([
            THINK_PATH . 'lang' . DS . $request->langset() . EXT,
            APP_PATH . 'lang' . DS . $request->langset() . EXT,
        ]);

        // 监听 app_dispatch
        Hook::listen('app_dispatch', self::$dispatch);
        // 获取应用调度信息
        $dispatch = self::$dispatch;

        // 未设置调度信息则进行 URL 路由检测
        if (empty($dispatch)) {
            $dispatch = self::routeCheck($request, $config);
        }

        // 记录当前调度信息
        $request->dispatch($dispatch);

        // 记录路由和请求信息
        if (self::$debug) {
            Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info');
            Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info');
            Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info');
        }

        // 监听 app_begin
        Hook::listen('app_begin', $dispatch);

        // 请求缓存检查
        $request->cache(
            $config['request_cache'],
            $config['request_cache_expire'],
            $config['request_cache_except']
        );

        $data = self::exec($dispatch, $config);
    } catch (HttpResponseException $exception) {
        $data = $exception->getResponse();
    }

    // 清空类的实例化
    Loader::clearInstance();

    // 输出数据到客户端
    if ($data instanceof Response) {
        $response = $data;
    } elseif (!is_null($data)) {
        // 默认自动识别响应输出类型
        $type = $request->isAjax() ?
        Config::get('default_ajax_return') :
        Config::get('default_return_type');

        $response = Response::create($data, $type);
    } else {
        $response = Response::create();
    }

    // 监听 app_end
    Hook::listen('app_end', $response);

    return $response;
}
Langkah kedua:

Panggil kawalan semasa Kaedah initCommon() dalam pengawal bertanggungjawab untuk memulakan aplikasi dan mengembalikan maklumat konfigurasi

  • $requestMendaftarkan ruang nama
  • self::initCommon()Panggil init() bagi kaedah inisialisasi kelas ini permohonan

    • Muat pelbagai fail konfigurasi
    • Muat fail sambungan tingkah laku
    • Muat fail awam
    • Muat pek bahasa
  • Pemprosesan berkaitan mod penyahpepijatan aplikasi
  • Muatkan fail tambahan dan muatkan fail berkaitan melalui nilai item konfigurasiextra_file_list
  • date_default_timezone_set($config['default_timezone']);Tetapkan zon waktu sistem
  • PanggilHook::listen('app_init'); Pantau kelakuan teg app_init
  • Langkah 3: Tentukan sama ada untuk mengikat modul atau pengawal
  • Langkah 4: Tetapan dan pemuatan bahasa sistem
  • Langkah 5:self::routeCheck($request, $config)Muatkan kaedah routeCheck() pengawal semasa untuk pengesanan laluan

    • Mula-mula lakukan pengesanan konfigurasi alamat penghalaan, baca laluan cache dahulu, dan kemudian importnya jika ia tidak wujud Konfigurasi fail penghalaan
    • Tiada konfigurasi penghalaan, hurai terus modul/pengawal/operasi
    • Kembalikan maklumat modul modul (nama modul, nama pengawal dan nama kaedah operasi)
  • Langkah 6: Dayakan mod nyahpepijat untuk merekodkan log penghalaan dan meminta maklumat
  • Langkah 7: self::exec($dispatch, $config)Panggil kaedah exec() dalam pengawal untuk melaksanakan pengedaran panggilan

    • Edarkan pemprosesan mengikut jenis permintaan pengguna, berikut ialah jenis modul modul
    • Memanggil self::module() modul pelaksanaan, melaksanakan penempatan dan permulaan modul, mendapatkan dan menetapkan pengawal semasa nama dan nama operasi
  • Langkah 8: Kosongkan instantiasi kelas dan keluarkan data dalam format yang sepadan kepada klien, iaitu antara muka output yang dilihat oleh pengguna
  • Ringkasan

    Artikel ini menganalisis secara kasar proses pelaksanaan asas ThinkPHP5 Jika ia tidak ada, tidak perlu memberitahu saya, kerana saya tidak akan menebusnya itu sahaja; tetapi jika ia salah, sila nyatakan, saya pasti akan membetulkannya, ia sangat tegak. Ngomong-ngomong, jika anda rasa ia berguna untuk anda, sila beri like dan tinggalkan.

    Atas ialah kandungan terperinci Menganalisis proses pemuatan rangka kerja TP5 dari antara muka masuk ke output. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam