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.
-
require __DIR__ . '/../thinkphp/start.php';
Begitu juga, selepas memasukkan fail , kita boleh tahu bahawa tidak banyak kod
define('APP_PATH', __DIR__ . '/../application/');
Muatkan fail but rangka kerja (thinkphpstart.php) 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();
- Dua perkara utama berikut akan memperkenalkan secara terperinci perkara yang dilakukan oleh kedua-dua kiri dan kanan ini
-
require __DIR__ . '/base.php';
Muat fail asas (thinkphpbase.php) - 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
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)-
define('', '')
Panggil Daftar mekanisme pemuatan automatik - Sistem daftar untuk pemuatan automatik
.env
- Sokongan pemuatan automatik
thinkLoader::register()
Daftar definisi ruang nama- Muat fail pemetaan perpustakaan kelas, yang wujud dalam
- direktori cache
-
Composer
secara automatik memuatkan direktori -
runtime
panggilanclassmap.php
Daftar pengecualian dan mekanisme pengendalian ralat - Muatkan konvensyen fail konfigurasi (thinkphpconvention.php)
extend
- Untuk kemudahan, Walaupun kod kaedah run ini agak panjang, saya masih memilih untuk menyiarkan keseluruhan kaedah. Jangan tekan saya
thinkError::register()
- 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; }
Panggil kawalan semasa Kaedah initCommon() dalam pengawal bertanggungjawab untuk memulakan aplikasi dan mengembalikan maklumat konfigurasi
-
$request
Mendaftarkan 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 konfigurasi
extra_file_list
-
date_default_timezone_set($config['default_timezone']);
Tetapkan zon waktu sistem - Panggil
Hook::listen('app_init');
Pantau kelakuan teg app_init
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 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
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.