매 요청 균일하게 발생하던 부팅 오버헤드를 4개 축에서 제거한다. - 설치 완료 상태에서 매 요청 반복되던 information_schema 조회(알림·본인인증 테이블 hasTable)를 installer_completed 가드로 스킵. 미설치 환경은 기존 hasTable 폴백 유지. - 코어+모듈+플러그인 정적 훅 매핑을 bootstrap/cache/hooks.php 에 사전 계산해 매 요청 디렉토리 스캔·리플렉션·클래스 로딩을 제거(route:cache 동형). 등록↔발화 계약·매핑 바이트 동일. 확장/코어 변경 시 자동 재생성, 캐시 부재·손상은 스캔 폴백. - 확장 소스(Modules\*/Plugins\*)를 autoload-extensions.php 의 classmap 에 편입해 findFile 파일시스템 스캔을 제거(느린 FS·cold OPcache 환경 직격). 클래스 로딩은 여전히 lazy, PSR-4 폴백 유지. - config 캐시를 변경 지점(설정 저장/코어·확장 업데이트/APP_KEY 재생성/설치 완료)에서 clear 후 즉시 재생성하도록 ConfigCacheHelper 로 일원화. clear 만 하고 방치돼 캐시가 영구 비활성으로 남던 성능 손실 제거. HookCacheManager::read 요청당 1회 로드(memo)로 중복 파싱 제거. 부팅 매핑 fingerprint 스캔↔캐시 완전 동일(229 action + 35 filter). 신규/수정 8개 스위트 54 pass. 순수 내부 부팅 인프라 — 확장 공개 표면·훅 계약 불변.
107 lines
3.9 KiB
PHP
107 lines
3.9 KiB
PHP
<?php
|
|
|
|
// 설치 완료 여부 확인
|
|
$installedFlagPath = __DIR__.'/../storage/app/g7_installed';
|
|
$envPath = __DIR__.'/../.env';
|
|
|
|
// 설치 확인: g7_installed 파일 또는 .env의 INSTALLER_COMPLETED
|
|
$isInstalled = file_exists($installedFlagPath) || (
|
|
file_exists($envPath) &&
|
|
preg_match('/^INSTALLER_COMPLETED=true$/m', file_get_contents($envPath))
|
|
);
|
|
|
|
// 미설치 시 /install로 리다이렉트
|
|
if (! $isInstalled) {
|
|
$installUrl = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/').'/install';
|
|
echo '<script>
|
|
alert("G7 최초 사용을 위해 설치 절차가 필요합니다. 설치 화면으로 이동합니다.");
|
|
window.location.href="'.htmlspecialchars($installUrl).'";
|
|
</script>';
|
|
exit;
|
|
}
|
|
|
|
use Illuminate\Foundation\Application;
|
|
use Illuminate\Http\Request;
|
|
|
|
define('LARAVEL_START', microtime(true));
|
|
|
|
// Determine if the application is in maintenance mode...
|
|
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
|
|
require $maintenance;
|
|
}
|
|
|
|
// Register the Composer autoloader...
|
|
$loader = require __DIR__.'/../vendor/autoload.php';
|
|
|
|
// Register extension (module/plugin) autoload...
|
|
$extensionAutoloadFile = __DIR__.'/../bootstrap/cache/autoload-extensions.php';
|
|
|
|
if (file_exists($extensionAutoloadFile)) {
|
|
// CoreServiceProvider에서 중복 등록 방지용 플래그
|
|
define('G7_EXTENSION_AUTOLOAD_REGISTERED', true);
|
|
$extensionAutoloads = require $extensionAutoloadFile;
|
|
|
|
// PSR-4 네임스페이스 등록
|
|
if (! empty($extensionAutoloads['psr4'])) {
|
|
foreach ($extensionAutoloads['psr4'] as $namespace => $paths) {
|
|
// 경로가 배열인 경우와 문자열인 경우 모두 처리
|
|
$paths = (array) $paths;
|
|
foreach ($paths as $path) {
|
|
$absolutePath = __DIR__.'/../'.$path;
|
|
if (is_dir($absolutePath)) {
|
|
$loader->addPsr4($namespace, $absolutePath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 확장 소스 classmap 등록 (FQCN → 절대경로).
|
|
// findFile 이 파일시스템 스캔(is_dir/file_exists stat) 없이 in-memory 맵에서 즉시
|
|
// 경로를 반환하도록 한다. cold OPcache / 느린 파일시스템 환경의 findFile 비용 제거.
|
|
// 클래스 로딩은 여전히 lazy — 실제 사용 시점에만 include. classmap 미포함 클래스는
|
|
// 위 PSR-4 등록으로 폴백(안전망).
|
|
if (! empty($extensionAutoloads['src_classmap'])) {
|
|
$absoluteClassmap = [];
|
|
foreach ($extensionAutoloads['src_classmap'] as $fqcn => $relPath) {
|
|
$absoluteClassmap[$fqcn] = __DIR__.'/../'.$relPath;
|
|
}
|
|
$loader->addClassMap($absoluteClassmap);
|
|
}
|
|
|
|
// Classmap 파일 로드 (module.php, plugin.php)
|
|
if (! empty($extensionAutoloads['classmap'])) {
|
|
foreach ($extensionAutoloads['classmap'] as $file) {
|
|
$absolutePath = __DIR__.'/../'.$file;
|
|
if (file_exists($absolutePath)) {
|
|
require_once $absolutePath;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Files 로드 (헬퍼 함수 등)
|
|
if (! empty($extensionAutoloads['files'])) {
|
|
foreach ($extensionAutoloads['files'] as $file) {
|
|
$absolutePath = __DIR__.'/../'.$file;
|
|
if (file_exists($absolutePath)) {
|
|
require_once $absolutePath;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Vendor autoloads 로드 (모듈/플러그인의 composer 의존성)
|
|
if (! empty($extensionAutoloads['vendor_autoloads'])) {
|
|
foreach ($extensionAutoloads['vendor_autoloads'] as $vendorAutoload) {
|
|
$absolutePath = __DIR__.'/../'.$vendorAutoload;
|
|
if (file_exists($absolutePath)) {
|
|
require_once $absolutePath;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Bootstrap Laravel and handle the request...
|
|
/** @var Application $app */
|
|
$app = require_once __DIR__.'/../bootstrap/app.php';
|
|
|
|
$app->handleRequest(Request::capture());
|