annotate .cms/index.php @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 <?php
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 /*
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 $time_start = microtime( true );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // for bad hosters
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 ini_set( "display_errors", "Off" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 $cms["kernel_version"] = "24.10";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 $cms["kernel_compat"] = "23.04";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 // PHP_VERSION_ID available in PHP 5.2.7 and above
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 if ( ! defined( "PHP_VERSION_ID" ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 $version = explode( ".", PHP_VERSION );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 define( "PHP_VERSION_ID", ( $version[0] * 10000 + $version[1] * 100 + $version[2] ) );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 $cms["cms_dir"] = dirname( __FILE__ );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 // for windows
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if ( DIRECTORY_SEPARATOR === "\\" ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 $cms["cms_dir"] = str_replace( "\\", "/", $cms["cms_dir"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 $cms["site_dir"] = dirname( $cms["cms_dir"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 if ( empty( $_SERVER["HTTPS"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 $protocol = "http";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 $protocol = "https";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 // if tail DocumentRoot containing / or \
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 $_SERVER["DOCUMENT_ROOT"] = rtrim( $_SERVER["DOCUMENT_ROOT"], "/\\" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 // https://coffee-cms.com/base_path/
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 // ^ ^
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 $cms["base_path"] = str_replace( $_SERVER["DOCUMENT_ROOT"], "", $cms["site_dir"] ) . "/";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 $regex_base_path = str_replace( "/", "\\/", $cms["base_path"] ); // escape / for regexp
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 //#todo? It seems there is no point in adding /u for the URL and checking preg_replace for null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 $url = "{$protocol}://{$_SERVER['SERVER_NAME']}/" . preg_replace( "/^{$regex_base_path}/", "", $_SERVER['REQUEST_URI'] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 $cms["url"] = parse_url( $url );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 $cms["url"]["path"] = urldecode( $cms["url"]["path"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 // file in .cms/ directory (for prevent sql query in pages module)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 $cms["cms_file"] = $cms["cms_dir"] . $cms["url"]["path"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 $cms["url"]["path"] = substr( $cms["url"]["path"], 1 ); // remove leading /
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 $cms["status"] = "404";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 // Load config.php
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 $cms["config_file"] = "{$cms['cms_dir']}/config.php";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 if ( is_file( $cms["config_file"] ) && $handle = fopen( $cms["config_file"], "r" ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 flock( $handle, LOCK_SH );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 include( $cms["config_file"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 flock( $handle, LOCK_UN );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if ( ! empty( $cms["config"]["locale"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 setlocale( LC_ALL, $cms["config"]["locale"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 if ( ! empty( $cms["config"]["timezone"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 date_default_timezone_set ( $cms["config"]["timezone"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 // Init hooks
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 // Отключение производится добавлением disable => true рядом с next
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 $cms["hook"] = "query"; // Default hook
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 $cms["hooks"] = array(
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 "query" => array( "next" => "template" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 "template" => array( "next" => "echo" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 "echo" => array( "next" => "write" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 "write" => array( "next" => "" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 "admin" => array( "next" => "template" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 "api" => array( "next" => "" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 "cron" => array( "next" => "" ),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 // route array
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 $cms["urls"] = array();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 // Load functions files
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 foreach( glob( $cms["cms_dir"] . "/*.fn.php" ) as $file ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 include_once( $file );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 // Load modules
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 foreach( glob( "{$cms['cms_dir']}/mod/*.mod.php" ) as $module ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 include_once( $module );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 // Load current template modules
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 if ( ! empty( $cms["config"]["template.mod.php"]["template"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 foreach( glob( "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.mod.php" ) as $module ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 include_once( $module );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 // Отсортировать маршруты чтобы короткие совпадения не перекрывали более длинные
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 function urls_sort( $a, $b ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 if ( strlen( $a ) >= strlen( $b ) )
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return -1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 return 1;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 uksort( $cms["urls"], "urls_sort" );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 // select route
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 foreach( $cms["urls"] as $url => $hook ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 // Нет смысла в /u для URL
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 if ( $url = preg_replace( "/\//", "\\/", $url ) ) { // Escape / for regexp
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 if ( preg_match( "/{$url}/", $cms["base_path"] . $cms["url"]["path"], $cms["url"]["match"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 $cms["hook"] = $hook;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 // RUN
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 while ( ! empty( $cms["hook"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 do_hook( $cms["hook"] );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 $cms["hook"] = $cms["hooks"][ $cms["hook"] ]["next"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 // Saving accumulated debugging information to a file
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 if ( ! empty( $cms["config"]["debug"] ) && ! empty( $cms["debug"] ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 $debug_file = $cms["cms_dir"] . "/debug.log.php";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 $new_debug = $cms["debug"];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 if ( is_file( $debug_file ) && $handle = fopen( $debug_file, "r" ) ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 flock( $handle, LOCK_SH );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 include( $debug_file );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 flock( $handle, LOCK_UN );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 $cms["debug"] = array_replace_recursive( $cms["debug"], $new_debug );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 file_put_contents( $debug_file, '<?php $cms["debug"] = ' . var_export( $cms["debug"], true ) . ";\n", LOCK_EX );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 /* Measuring speed and memory consumption
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 if ( $cms["url"]["path"] == $cms["config"]["admin.mod.php"]["api_url"] ) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 $fn = $_POST["fn"] . " ";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 $fn = "";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 file_put_contents( __DIR__ . "/perf.log",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 $cms["base_path"] . $cms["url"]["path"] . " " .
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 $fn .
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 (int)( ( microtime( true ) - $time_start ) * 1000 ) . "ms " .
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 (int)( memory_get_peak_usage() / 1000 ) . " kB\n",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 FILE_APPEND );
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 //file_put_contents( __DIR__ . "/cms.log.php", '<?php $cms = ' . var_export( $cms, true ) . ";\n" );