cari
Rumahrangka kerja phpThinkPHPMenganalisis proses pemuatan rangka kerja TP5 dari antara muka masuk ke output

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. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
    宝塔部署thinkphp5报错怎么办宝塔部署thinkphp5报错怎么办Dec 19, 2022 am 11:04 AM

    宝塔部署thinkphp5报错的解决办法:1、打开宝塔服务器,安装php pathinfo扩展并启用;2、配置“.access”文件,内容为“RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]”;3、在网站管理里面,启用thinkphp的伪静态即可。

    thinkphp5 url重写不行怎么办thinkphp5 url重写不行怎么办Dec 12, 2022 am 09:31 AM

    thinkphp5 url重写不行的解决办法:1、查看httpd.conf配置文件中是否加载了mod_rewrite.so模块;2、将AllowOverride None中的None改为All;3、修改Apache配置文件.htaccess为“RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]”保存即可。

    thinkphp5 post得不到值怎么办thinkphp5 post得不到值怎么办Dec 06, 2022 am 09:29 AM

    thinkphp5 post得不到值是因为TP5是通过strpos函数在Header的content-type值中查找app/json字符串的,其解决办法就是设置Header的content-type值为app/json即可。

    thinkphp5怎么获取请求过来的网址thinkphp5怎么获取请求过来的网址Dec 20, 2022 am 09:48 AM

    thinkphp5获取请求网址的方法:1、使用“\think\Request”类的“$request = Request::instance();”方法获取当前的url信息;2、通过自带的助手函数“$request->url()”获取包含域名的完整URL地址。

    怎么去除thinkphp5标题栏icon怎么去除thinkphp5标题栏iconDec 20, 2022 am 09:24 AM

    去除thinkphp5标题栏icon的方法:1、找到thinkphp5框架public下的favicon.ico文件;2、删除该文件或者选择另一张图片命名改为favicon.ico,并替换原favicon.ico文件即可。

    thinkphp5提示控制器不存在怎么办thinkphp5提示控制器不存在怎么办Dec 06, 2022 am 10:43 AM

    thinkphp5提示控制器不存在的解决办法:1、检查对应的控制器里面的命名空间是否写对,修改为正确的命名空间;2、打开相应的tp文件,修改类名即可。

    ThinkPHP5怎么查询昨天的数据ThinkPHP5怎么查询昨天的数据Dec 05, 2022 am 09:20 AM

    ThinkPHP5查询昨天数据的方法:1、打开ThinkPHP5相关文件;2、通过表达式“db('table')->whereTime('c_time', 'yesterday')->select();”查询昨天的数据即可。

    thinkphp5报错提示怎么设置thinkphp5报错提示怎么设置Dec 07, 2022 am 10:31 AM

    thinkphp5设置报错提示的方法:1、进入项目根目录下的public文件夹,打开index.php入口文件;2、查看调试模式开关的注释;3、将“APP_DEBUG”常量的值调整为true即可展示错误信息提示。

    See all articles

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Tetapan grafik terbaik
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
    3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    MinGW - GNU Minimalis untuk Windows

    MinGW - GNU Minimalis untuk Windows

    Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

    SublimeText3 versi Inggeris

    SublimeText3 versi Inggeris

    Disyorkan: Versi Win, menyokong gesaan kod!

    EditPlus versi Cina retak

    EditPlus versi Cina retak

    Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

    VSCode Windows 64-bit Muat Turun

    VSCode Windows 64-bit Muat Turun

    Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    Persekitaran pembangunan bersepadu PHP yang berkuasa