Bearsampp 2025.8.29
Loading...
Searching...
No Matches
class.bin.php.php
Go to the documentation of this file.
1<?php
2/*
3 *
4 * * Copyright (c) 2021-2024 Bearsampp
5 * * License: GNU General Public License version 3 or later; see LICENSE.txt
6 * * Website: https://bearsampp.com
7 * * Github: https://github.com/Bearsampp
8 *
9 */
10
17class BinPhp extends Module
18{
19 const ROOT_CFG_ENABLE = 'phpEnable';
20 const ROOT_CFG_VERSION = 'phpVersion';
21
22 const LOCAL_CFG_CLI_EXE = 'phpCliExe';
23 const LOCAL_CFG_CLI_SILENT_EXE = 'phpCliSilentExe';
24 const LOCAL_CFG_CONF = 'phpConf';
25 const LOCAL_CFG_PEAR_EXE = 'phpPearExe';
26
27 const INI_SHORT_OPEN_TAG = 'short_open_tag';
28 const INI_ASP_TAGS = 'asp_tags';
29 const INI_Y2K_COMPLIANCE = 'y2k_compliance';
30 const INI_OUTPUT_BUFFERING = 'output_buffering';
31 const INI_ZLIB_OUTPUT_COMPRESSION = 'zlib.output_compression';
32 const INI_IMPLICIT_FLUSH = 'implicit_flush';
33 const INI_ALLOW_CALL_TIME_PASS_REFERENCE = 'allow_call_time_pass_reference';
34 const INI_SAFE_MODE = 'safe_mode';
35 const INI_SAFE_MODE_GID = 'safe_mode_gid';
36 const INI_EXPOSE_PHP = 'expose_php';
37 const INI_DISPLAY_ERRORS = 'display_errors';
38 const INI_DISPLAY_STARTUP_ERRORS = 'display_startup_errors';
39 const INI_LOG_ERRORS = 'log_errors';
40 const INI_IGNORE_REPEATED_ERRORS = 'ignore_repeated_errors';
41 const INI_IGNORE_REPEATED_SOURCE = 'ignore_repeated_source';
42 const INI_REPORT_MEMLEAKS = 'report_memleaks';
43 const INI_TRACK_ERRORS = 'track_errors';
44 const INI_HTML_ERRORS = 'html_errors';
45 const INI_REGISTER_GLOBALS = 'register_globals';
46 const INI_REGISTER_LONG_ARRAYS = 'register_long_arrays';
47 const INI_REGISTER_ARGC_ARGV = 'register_argc_argv';
48 const INI_AUTO_GLOBALS_JIT = 'auto_globals_jit';
49 const INI_MAGIC_QUOTES_GPC = 'magic_quotes_gpc';
50 const INI_MAGIC_QUOTES_RUNTIME = 'magic_quotes_runtime';
51 const INI_MAGIC_QUOTES_SYBASE = 'magic_quotes_sybase';
52 const INI_ENABLE_DL = 'enable_dl';
53 const INI_CGI_FORCE_REDIRECT = 'cgi.force_redirect';
54 const INI_CGI_FIX_PATHINFO = 'cgi.fix_pathinfo';
55 const INI_FILE_UPLOADS = 'file_uploads';
56 const INI_ALLOW_URL_FOPEN = 'allow_url_fopen';
57 const INI_ALLOW_URL_INCLUDE = 'allow_url_include';
58 const INI_PHAR_READONLY = 'phar.readonly';
59 const INI_PHAR_REQUIRE_HASH = 'phar.require_hash';
60 const INI_DEFINE_SYSLOG_VARIABLES = 'define_syslog_variables';
61 const INI_MAIL_ADD_X_HEADER = 'mail.add_x_header';
62 const INI_SQL_SAFE_MODE = 'sql.safe_mode';
63 const INI_ODBC_ALLOW_PERSISTENT = 'odbc.allow_persistent';
64 const INI_ODBC_CHECK_PERSISTENT = 'odbc.check_persistent';
65 const INI_MYSQL_ALLOW_LOCAL_INFILE = 'mysql.allow_local_infile';
66 const INI_MYSQL_ALLOW_PERSISTENT = 'mysql.allow_persistent';
67 const INI_MYSQL_TRACE_MODE = 'mysql.trace_mode';
68 const INI_MYSQLI_ALLOW_PERSISTENT = 'mysqli.allow_persistent';
69 const INI_MYSQLI_RECONNECT = 'mysqli.reconnect';
70 const INI_MYSQLND_COLLECT_STATISTICS = 'mysqlnd.collect_statistics';
71 const INI_MYSQLND_COLLECT_MEMORY_STATISTICS = 'mysqlnd.collect_memory_statistics';
72 const INI_PGSQL_ALLOW_PERSISTENT = 'pgsql.allow_persistent';
73 const INI_PGSQL_AUTO_RESET_PERSISTENT = 'pgsql.auto_reset_persistent';
74 const INI_SYBCT_ALLOW_PERSISTENT = 'sybct.allow_persistent';
75 const INI_SESSION_USE_COOKIES = 'session.use_cookies';
76 const INI_SESSION_USE_ONLY_COOKIES = 'session.use_only_cookies';
77 const INI_SESSION_AUTO_START = 'session.auto_start';
78 const INI_SESSION_COOKIE_HTTPONLY = 'session.cookie_httponly';
79 const INI_SESSION_BUG_COMPAT_42 = 'session.bug_compat_42';
80 const INI_SESSION_BUG_COMPAT_WARN = 'session.bug_compat_warn';
81 const INI_SESSION_USE_TRANS_SID = 'session.use_trans_sid';
82 const INI_MSSQL_ALLOW_PERSISTENT = 'mssql.allow_persistent';
83 const INI_MSSQL_COMPATIBILITY_MODE = 'mssql.compatability_mode';
84 const INI_MSSQL_SECURE_CONNECTION = 'mssql.secure_connection';
85 const INI_TIDY_CLEAN_OUTPUT = 'tidy.clean_output';
86 const INI_SOAP_WSDL_CACHE_ENABLED = 'soap.wsdl_cache_enabled';
87 const INI_XDEBUG_REMOTE_ENABLE = 'xdebug.remote_enable';
88 const INI_XDEBUG_PROFILER_ENABLE = 'xdebug.profiler_enable';
89 const INI_XDEBUG_PROFILER_ENABLE_TRIGGER = 'xdebug.profiler_enable_trigger';
90
91 private $apacheConf;
92 private $errorLog;
93
94 private $cliExe;
96 private $conf;
97 private $pearExe;
98
105 public function __construct($id, $type) {
106 Util::logInitClass($this);
107 $this->reload($id, $type);
108 }
109
116 public function reload($id = null, $type = null) {
119
120 $this->name = $bearsamppLang->getValue(Lang::PHP);
121 $this->version = $bearsamppConfig->getRaw(self::ROOT_CFG_VERSION);
122 parent::reload($id, $type);
123
124 $this->enable = $this->enable && $bearsamppConfig->getRaw(self::ROOT_CFG_ENABLE);
125 $this->apacheConf = $bearsamppBins->getApache()->getCurrentPath() . '/' . $this->apacheConf; //FIXME: Useful ?
126 $this->errorLog = $bearsamppRoot->getLogsPath() . '/php_error.log';
127
128 if ($this->bearsamppConfRaw !== false) {
129 $this->cliExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CLI_EXE];
130 $this->cliSilentExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CLI_SILENT_EXE];
131 $this->conf = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CONF];
132 $this->pearExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_PEAR_EXE];
133 }
134
135 if (!$this->enable) {
136 Util::logInfo($this->name . ' is not enabled!');
137 return;
138 }
139 if (!is_dir($this->currentPath)) {
140 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_FILE_NOT_FOUND), $this->name . ' ' . $this->version, $this->currentPath));
141 return;
142 }
143 if (!is_dir($this->symlinkPath)) {
144 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_FILE_NOT_FOUND), $this->name . ' ' . $this->version, $this->symlinkPath));
145 return;
146 }
147 if (!is_file($this->bearsamppConf)) {
148 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_CONF_NOT_FOUND), $this->name . ' ' . $this->version, $this->bearsamppConf));
149 return;
150 }
151 if (!is_file($this->cliExe)) {
152 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->cliExe));
153 }
154 if (!is_file($this->cliSilentExe)) {
155 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->cliSilentExe));
156 }
157 if (!is_file($this->conf)) {
158 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_CONF_NOT_FOUND), $this->name . ' ' . $this->version, $this->conf));
159 }
160 if (!is_file($this->pearExe)) {
161 Util::logError(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->pearExe));
162 }
163 }
164
172 public function switchVersion($version, $showWindow = false) {
173 Util::logDebug('Switch ' . $this->name . ' version to ' . $version);
174 return $this->updateConfig($version, 0, $showWindow);
175 }
176
185 protected function updateConfig($version = null, $sub = 0, $showWindow = false) {
186 global $bearsamppLang, $bearsamppBins, $bearsamppApps, $bearsamppWinbinder;
187
188 if (!$this->enable) {
189 return true;
190 }
191
192 $version = $version == null ? $this->version : $version;
193 Util::logDebug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'Update ' . $this->name . ' ' . $version . ' config');
194
195 $boxTitle = sprintf($bearsamppLang->getValue(Lang::SWITCH_VERSION_TITLE), $this->getName(), $version);
196
197 $conf = str_replace('php' . $this->getVersion(), 'php' . $version, $this->getConf());
198 Util::logTrace('Current php version found: ' . $conf);
199 $bearsamppConf = str_replace('php' . $this->getVersion(), 'php' . $version, $this->bearsamppConf);
200 Util::logTrace('Current bearsampp.conf php version found: ' . $bearsamppConf);
201
202 $tsDll = $this->getTsDll($version);
203 $apachePhpModulePath = $this->getApacheModule($bearsamppBins->getApache()->getVersion(), $version);
204
205 Util::logDebug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'PHP TsDll found: ' . $tsDll);
206 Util::logDebug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'PHP Apache module found: ' . $apachePhpModulePath);
207
208 if (!file_exists($conf) || !file_exists($bearsamppConf)) {
209 Util::logError('bearsampp config files not found for ' . $this->getName() . ' ' . $version);
210 if ($showWindow) {
211 $bearsamppWinbinder->messageBoxError(
212 sprintf($bearsamppLang->getValue(Lang::BEARSAMPP_CONF_NOT_FOUND_ERROR), $this->getName() . ' ' . $version),
213 $boxTitle
214 );
215 }
216 return false;
217 }
218
219 $bearsamppConfRaw = parse_ini_file($bearsamppConf);
220 if ($bearsamppConfRaw === false || !isset($bearsamppConfRaw[self::ROOT_CFG_VERSION]) || $bearsamppConfRaw[self::ROOT_CFG_VERSION] != $version) {
221 Util::logError('bearsampp config file malformed for ' . $this->getName() . ' ' . $version);
222 if ($showWindow) {
223 $bearsamppWinbinder->messageBoxError(
224 sprintf($bearsamppLang->getValue(Lang::BEARSAMPP_CONF_MALFORMED_ERROR), $this->getName() . ' ' . $version),
225 $boxTitle
226 );
227 }
228 return false;
229 }
230
231 if ($tsDll === false || $apachePhpModulePath === false) {
232 Util::logDebug($this->getName() . ' ' . $version . ' does not seem to be compatible with Apache ' . $bearsamppBins->getApache()->getVersion());
233 if ($showWindow) {
234 $bearsamppWinbinder->messageBoxError(
235 sprintf($bearsamppLang->getValue(Lang::PHP_INCPT), $version, $bearsamppBins->getApache()->getVersion()),
236 $boxTitle
237 );
238 }
239 return false;
240 }
241
242 // bearsampp.conf
243 Util::logTrace('Calling Set Version for php...');
244 $this->setVersion($version);
245
246 // conf
247 Util::replaceInFile($this->getConf(), array(
248 '/^mysql.default_port\s=\s(\d+)/' => 'mysql.default_port = ' . $bearsamppBins->getMysql()->getPort(),
249 '/^mysqli.default_port\s=\s(\d+)/' => 'mysqli.default_port = ' . $bearsamppBins->getMysql()->getPort()
250 ));
251
252 // apache
253 $bearsamppBins->getApache()->update($sub + 1);
254
255 // phpmyadmin
256 $bearsamppApps->getPhpmyadmin()->update($sub + 1);
257
258 return true;
259 }
260
266 public function getSettings() {
267 return array(
268 'Language options' => array(
269 'Short open tag' => self::INI_SHORT_OPEN_TAG,
270 'ASP-style tags' => self::INI_ASP_TAGS,
271 'Year 2000 compliance' => self::INI_Y2K_COMPLIANCE,
272 'Output buffering' => self::INI_OUTPUT_BUFFERING,
273 'Zlib output compression' => self::INI_ZLIB_OUTPUT_COMPRESSION,
274 'Implicit flush' => self::INI_IMPLICIT_FLUSH,
275 'Allow call time pass reference' => self::INI_ALLOW_CALL_TIME_PASS_REFERENCE,
276 'Safe mode' => self::INI_SAFE_MODE,
277 'Safe mode GID' => self::INI_SAFE_MODE_GID,
278 ),
279 'Miscellaneous' => array(
280 'Expose PHP' => self::INI_EXPOSE_PHP,
281 ),
282 'Error handling and logging' => array(
283 'Display errors' => self::INI_DISPLAY_ERRORS,
284 'Display startup errors' => self::INI_DISPLAY_STARTUP_ERRORS,
285 'Log errors' => self::INI_LOG_ERRORS,
286 'Ignore repeated errors' => self::INI_IGNORE_REPEATED_ERRORS,
287 'Ignore repeated source' => self::INI_IGNORE_REPEATED_SOURCE,
288 'Report memory leaks' => self::INI_REPORT_MEMLEAKS,
289 'Track errors' => self::INI_TRACK_ERRORS,
290 'HTML errors' => self::INI_HTML_ERRORS,
291 ),
292 'Data Handling' => array(
293 'Register globals' => self::INI_REGISTER_GLOBALS,
294 'Register long arrays' => self::INI_REGISTER_LONG_ARRAYS,
295 'Register argc argv' => self::INI_REGISTER_ARGC_ARGV,
296 'Auto globals just in time' => self::INI_AUTO_GLOBALS_JIT,
297 'Magic quotes gpc' => self::INI_MAGIC_QUOTES_GPC,
298 'Magic quotes runtime' => self::INI_MAGIC_QUOTES_RUNTIME,
299 'Magic quotes Sybase' => self::INI_MAGIC_QUOTES_SYBASE,
300 ),
301 'Paths and Directories' => array(
302 'Enable dynamic loading' => self::INI_ENABLE_DL,
303 'CGI force redirect' => self::INI_CGI_FORCE_REDIRECT,
304 'CGI fix path info' => self::INI_CGI_FIX_PATHINFO,
305 ),
306 'File uploads' => array(
307 'File uploads' => self::INI_FILE_UPLOADS,
308 ),
309 'Fopen wrappers' => array(
310 'Allow url fopen' => self::INI_ALLOW_URL_FOPEN,
311 'Allow url include' => self::INI_ALLOW_URL_INCLUDE,
312 ),
313 'Module settings' => array(
314 'Phar' => array(
315 'Read only' => self::INI_PHAR_READONLY,
316 'Require hash' => self::INI_PHAR_REQUIRE_HASH,
317 ),
318 'Syslog' => array(
319 'Define syslog variables' => self::INI_DEFINE_SYSLOG_VARIABLES,
320 ),
321 'Mail' => array(
322 'Add X-PHP-Originating-Script' => self::INI_MAIL_ADD_X_HEADER,
323 ),
324 'SQL' => array(
325 'Safe mode' => self::INI_SQL_SAFE_MODE,
326 ),
327 'ODBC' => array(
328 'Allow persistent' => self::INI_ODBC_ALLOW_PERSISTENT,
329 'Check persistent' => self::INI_ODBC_CHECK_PERSISTENT,
330 ),
331 'MySQL' => array(
332 'Allow local infile' => self::INI_MYSQL_ALLOW_LOCAL_INFILE,
333 'Allow persistent' => self::INI_MYSQL_ALLOW_PERSISTENT,
334 'Trace mode' => self::INI_MYSQL_TRACE_MODE,
335 ),
336 'MySQLi' => array(
337 'Allow persistent' => self::INI_MYSQLI_ALLOW_PERSISTENT,
338 'Reconnect' => self::INI_MYSQLI_RECONNECT,
339 ),
340 'MySQL Native Driver' => array(
341 'Collect statistics' => self::INI_MYSQLND_COLLECT_STATISTICS,
342 'Collect memory statistics' => self::INI_MYSQLND_COLLECT_MEMORY_STATISTICS,
343 ),
344 'PostgresSQL' => array(
345 'Allow persistent' => self::INI_PGSQL_ALLOW_PERSISTENT,
346 'Auto reset persistent' => self::INI_PGSQL_AUTO_RESET_PERSISTENT,
347 ),
348 'Sybase-CT' => array(
349 'Allow persistent' => self::INI_SYBCT_ALLOW_PERSISTENT,
350 ),
351 'Session' => array(
352 'Use cookies' => self::INI_SESSION_USE_COOKIES,
353 'Use only cookies' => self::INI_SESSION_USE_ONLY_COOKIES,
354 'Auto start' => self::INI_SESSION_AUTO_START,
355 'Cookie HTTP only' => self::INI_SESSION_COOKIE_HTTPONLY,
356 'Bug compat 42' => self::INI_SESSION_BUG_COMPAT_42,
357 'Bug compat warning' => self::INI_SESSION_BUG_COMPAT_WARN,
358 'Use trans sid' => self::INI_SESSION_USE_TRANS_SID,
359 ),
360 'MSSQL' => array(
361 'Allow persistent' => self::INI_MSSQL_ALLOW_PERSISTENT,
362 'Compatibility mode' => self::INI_MSSQL_COMPATIBILITY_MODE,
363 'Secure connection' => self::INI_MSSQL_SECURE_CONNECTION,
364 ),
365 'Tidy' => array(
366 'Clean output' => self::INI_TIDY_CLEAN_OUTPUT,
367 ),
368 'SOAP' => array(
369 'WSDL cache enabled' => self::INI_SOAP_WSDL_CACHE_ENABLED,
370 ),
371 'XDebug' => array(
372 'Remote enable' => self::INI_XDEBUG_REMOTE_ENABLE,
373 'Profiler enable' => self::INI_XDEBUG_PROFILER_ENABLE,
374 'Profiler enable trigger' => self::INI_XDEBUG_PROFILER_ENABLE_TRIGGER,
375 ),
376 ),
377 );
378 }
379
385 public function getSettingsValues() {
386 return array(
387 self::INI_SHORT_OPEN_TAG => array('On', 'Off', 'On'),
388 self::INI_ASP_TAGS => array('On', 'Off', 'Off'),
389 self::INI_Y2K_COMPLIANCE => array('1', '0', '1'),
390 self::INI_OUTPUT_BUFFERING => array('4096', 'Off', '4096'),
391 self::INI_ZLIB_OUTPUT_COMPRESSION => array('On', 'Off', 'Off'),
392 self::INI_IMPLICIT_FLUSH => array('On', 'Off', 'Off'),
393 self::INI_ALLOW_CALL_TIME_PASS_REFERENCE => array('On', 'Off', 'On'),
394 self::INI_SAFE_MODE => array('On', 'Off', 'Off'),
395 self::INI_SAFE_MODE_GID => array('On', 'Off', 'Off'),
396 self::INI_EXPOSE_PHP => array('On', 'Off', 'On'),
397 self::INI_DISPLAY_ERRORS => array('On', 'Off', 'On'),
398 self::INI_DISPLAY_STARTUP_ERRORS => array('On', 'Off', 'On'),
399 self::INI_LOG_ERRORS => array('On', 'Off', 'On'),
400 self::INI_IGNORE_REPEATED_ERRORS => array('On', 'Off', 'Off'),
401 self::INI_IGNORE_REPEATED_SOURCE => array('On', 'Off', 'Off'),
402 self::INI_REPORT_MEMLEAKS => array('On', 'Off', 'On'),
403 self::INI_TRACK_ERRORS => array('On', 'Off', 'On'),
404 self::INI_HTML_ERRORS => array('On', 'Off', 'On'),
405 self::INI_REGISTER_GLOBALS => array('On', 'Off', 'Off'),
406 self::INI_REGISTER_LONG_ARRAYS => array('On', 'Off', 'Off'),
407 self::INI_REGISTER_ARGC_ARGV => array('On', 'Off', 'Off'),
408 self::INI_AUTO_GLOBALS_JIT => array('On', 'Off', 'On'),
409 self::INI_MAGIC_QUOTES_GPC => array('On', 'Off', 'Off'),
410 self::INI_MAGIC_QUOTES_RUNTIME => array('On', 'Off', 'Off'),
411 self::INI_MAGIC_QUOTES_SYBASE => array('On', 'Off', 'Off'),
412 self::INI_ENABLE_DL => array('On', 'Off', 'Off'),
413 self::INI_CGI_FORCE_REDIRECT => array('1', '0', '1'),
414 self::INI_FILE_UPLOADS => array('On', 'Off', 'On'),
415 self::INI_ALLOW_URL_FOPEN => array('On', 'Off', 'On'),
416 self::INI_ALLOW_URL_INCLUDE => array('On', 'Off', 'Off'),
417 self::INI_DEFINE_SYSLOG_VARIABLES => array('On', 'Off', 'Off'),
418 self::INI_MAIL_ADD_X_HEADER => array('On', 'Off', 'On'),
419 self::INI_SQL_SAFE_MODE => array('On', 'Off', 'Off'),
420 self::INI_ODBC_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
421 self::INI_ODBC_CHECK_PERSISTENT => array('On', 'Off', 'On'),
422 self::INI_MYSQL_ALLOW_LOCAL_INFILE => array('On', 'Off', 'Off'),
423 self::INI_MYSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
424 self::INI_MYSQL_TRACE_MODE => array('On', 'Off', 'Off'),
425 self::INI_MYSQLI_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
426 self::INI_MYSQLI_RECONNECT => array('On', 'Off', 'Off'),
427 self::INI_MYSQLND_COLLECT_STATISTICS => array('On', 'Off', 'On'),
428 self::INI_MYSQLND_COLLECT_MEMORY_STATISTICS => array('On', 'Off', 'On'),
429 self::INI_PGSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
430 self::INI_PGSQL_AUTO_RESET_PERSISTENT => array('On', 'Off', 'Off'),
431 self::INI_SYBCT_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
432 self::INI_SESSION_USE_COOKIES => array('1', '0', '1'),
433 self::INI_SESSION_USE_ONLY_COOKIES => array('1', '0', '1'),
434 self::INI_SESSION_AUTO_START => array('1', '0', '0'),
435 self::INI_SESSION_COOKIE_HTTPONLY => array('1', '', ''),
436 self::INI_SESSION_BUG_COMPAT_42 => array('On', 'Off', 'On'),
437 self::INI_SESSION_BUG_COMPAT_WARN => array('On', 'Off', 'On'),
438 self::INI_SESSION_USE_TRANS_SID => array('1', '0', '0'),
439 self::INI_MSSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
440 self::INI_MSSQL_COMPATIBILITY_MODE => array('On', 'Off', 'Off'),
441 self::INI_MSSQL_SECURE_CONNECTION => array('On', 'Off', 'Off'),
442 self::INI_TIDY_CLEAN_OUTPUT => array('On', 'Off', 'Off'),
443 self::INI_SOAP_WSDL_CACHE_ENABLED => array('1', '0', '1'),
444 self::INI_XDEBUG_REMOTE_ENABLE => array('On', 'Off', 'On'),
445 self::INI_XDEBUG_PROFILER_ENABLE => array('On', 'Off', 'Off'),
446 self::INI_XDEBUG_PROFILER_ENABLE_TRIGGER => array('On', 'Off', 'Off'),
447 );
448 }
449
456 public function isSettingActive($name) {
457 $settingsValues = $this->getSettingsValues();
458
459 $confContent = file($this->getConf());
460 foreach ($confContent as $row) {
461 $settingMatch = array();
462 if (preg_match('/^' . $name . '\s*=\s*(.+)/i', $row, $settingMatch)) {
463 return isset($settingMatch[1]) && isset($settingsValues[$name]) && $settingsValues[$name][0] == trim($settingMatch[1]);
464 }
465 }
466
467 return false;
468 }
469
476 public function isSettingExists($name) {
477 $confContent = file($this->getConf());
478 foreach ($confContent as $row) {
479 if (preg_match('/^\s*?;?\s*?' . $name . '\s*=\s*.*/i', $row)) {
480 return true;
481 }
482 }
483
484 return false;
485 }
486
492 public function getExtensions() {
493 $fromFolder = $this->getExtensionsFromConf();
494 $fromConf = $this->getExtensionsFromFolder();
495 $result = array_merge($fromConf, $fromFolder);
496 ksort($result);
497 return $result;
498 }
499
506 private function isExtensionExcluded($ext) {
507 return in_array($ext, array(
508 'opcache',
509 'xdebug'
510 ));
511 }
512
518 public function getExtensionsFromConf() {
519 $result = array();
520
521 $confContent = file($this->getConf());
522 foreach ($confContent as $row) {
523 $extMatch = array();
524 if (preg_match('/^(;)?extension\s*=\s*"?(.+)"?/i', $row, $extMatch)) {
525 $name = preg_replace("/^php_/", "", preg_replace("/\.dll$/", "", trim($extMatch[2])));
526 if ($this->isExtensionExcluded($name)) {
527 continue;
528 }
529 if ($extMatch[1] == ';') {
531 } else {
533 }
534 }
535 }
536
537 ksort($result);
538 return $result;
539 }
540
546 public function getExtensionsLoaded() {
547 $result = array();
548 foreach ($this->getExtensionsFromConf() as $name => $status) {
550 $result[] = $name;
551 }
552 }
553 return $result;
554 }
555
561 public function getExtensionsFromFolder() {
562 $result = array();
563
564 $handle = @opendir($this->getCurrentPath(). '/ext');
565 if (!$handle) {
566 return $result;
567 }
568
569 while (false !== ($file = readdir($handle))) {
570 if ($file != "." && $file != ".." && Util::endWith($file, '.dll')) {
571 $name = preg_replace("/^php_/", "", preg_replace("/\.dll$/", "", trim($file)));
572 if ($this->isExtensionExcluded($name)) {
573 continue;
574 }
576 }
577 }
578
579 closedir($handle);
580 ksort($result);
581 return $result;
582 }
583
591 public function getApacheModule($apacheVersion, $phpVersion = null) {
592 $apacheVersion = substr(str_replace('.', '', $apacheVersion), 0, 2);
593 $phpVersion = $phpVersion == null ? $this->getVersion() : $phpVersion;
594
595 $currentPath = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, $this->getCurrentPath());
596 $bearsamppConf = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, $this->bearsamppConf);
597
598 if (in_array($phpVersion, $this->getVersionList()) && file_exists($bearsamppConf)) {
599 $apacheCpt = parse_ini_file($bearsamppConf);
600 if ($apacheCpt !== false) {
601 foreach ($apacheCpt as $aVersion => $apacheModule) {
602 $aVersion = str_replace('apache', '', $aVersion);
603 $aVersion = str_replace('.', '', $aVersion);
604 if ($apacheVersion == $aVersion && file_exists($currentPath . '/' . $apacheModule)) {
605 return $currentPath . '/' . $apacheModule;
606 }
607 }
608 }
609 }
610
611 return false;
612 }
613
620 public function getTsDll($phpVersion = null) {
621 $phpVersion = $phpVersion == null ? $this->getVersion() : $phpVersion;
622 $currentPath = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, $this->getCurrentPath());
623
624 if (file_exists($currentPath . '/php7ts.dll')) {
625 return 'php7ts.dll';
626 } elseif (file_exists($currentPath . '/php8ts.dll')) {
627 return 'php8ts.dll';
628 }
629
630 return false;
631 }
632
638 public function setVersion($version) {
639 global $bearsamppConfig;
640 $this->version = $version;
641 Util::logTrace('Setting php version in .conf to: ' . $this->version);
642 $bearsamppConfig->replace(self::ROOT_CFG_VERSION, $version);
643 Util::logTrace('Reloading php version...');
644 $this->reload();
645 Util::logTrace('Reloading of php version complete');
646 }
647
654 public function setEnable($enabled, $showWindow = false) {
655 global $bearsamppConfig, $bearsamppBins, $bearsamppLang, $bearsamppWinbinder;
656
657 if ($enabled == Config::ENABLED && !is_dir($this->currentPath)) {
658 Util::logDebug($this->getName() . ' cannot be enabled because bundle ' . $this->getVersion() . ' does not exist in ' . $this->currentPath);
659 if ($showWindow) {
660 $bearsamppWinbinder->messageBoxError(
661 sprintf($bearsamppLang->getValue(Lang::ENABLE_BUNDLE_NOT_EXIST), $this->getName(), $this->getVersion(), $this->currentPath),
662 sprintf($bearsamppLang->getValue(Lang::ENABLE_TITLE), $this->getName())
663 );
664 }
665 $enabled = Config::DISABLED;
666 }
667
668 Util::logInfo($this->getName() . ' switched to ' . ($enabled == Config::ENABLED ? 'enabled' : 'disabled'));
669 $this->enable = $enabled == Config::ENABLED;
670 $bearsamppConfig->replace(self::ROOT_CFG_ENABLE, $enabled);
671
672 $this->reload();
673 $bearsamppBins->getApache()->update();
674 if ($bearsamppBins->getApache()->isEnable() && $bearsamppBins->getApache()->getService()->isRunning()) {
675 $bearsamppBins->getApache()->getService()->stop();
677 }
678 }
679
685 public function getErrorLog() {
686 return $this->errorLog;
687 }
688
694 public function getCliExe() {
695 return $this->cliExe;
696 }
697
703 public function getCliSilentExe() {
704 return $this->cliSilentExe;
705 }
706
712 public function getConf() {
713 return $this->conf;
714 }
715
721 public function getPearExe() {
722 return $this->pearExe;
723 }
724
731 public function getPearVersion($cache = false) {
732 $cacheFile = $this->getCurrentPath() . '/pear/version';
733 if (!$cache) {
734 file_put_contents($cacheFile, Batch::getPearVersion());
735 }
736 return file_exists($cacheFile) ? file_get_contents($cacheFile) : null;
737 }}
$result
global $bearsamppBins
global $bearsamppLang
global $bearsamppRoot
static getPearVersion()
const CMD_SYNTAX_CHECK
isExtensionExcluded($ext)
const INI_OUTPUT_BUFFERING
const INI_MYSQLI_ALLOW_PERSISTENT
getExtensionsFromFolder()
const INI_MYSQLI_RECONNECT
const INI_MSSQL_COMPATIBILITY_MODE
const INI_MAGIC_QUOTES_SYBASE
const INI_ZLIB_OUTPUT_COMPRESSION
const INI_FILE_UPLOADS
const INI_ALLOW_CALL_TIME_PASS_REFERENCE
const INI_REGISTER_LONG_ARRAYS
const INI_REPORT_MEMLEAKS
const INI_ASP_TAGS
const INI_ALLOW_URL_FOPEN
const INI_SAFE_MODE_GID
const INI_IMPLICIT_FLUSH
const INI_SOAP_WSDL_CACHE_ENABLED
const INI_MYSQL_ALLOW_LOCAL_INFILE
const INI_DISPLAY_STARTUP_ERRORS
const INI_DEFINE_SYSLOG_VARIABLES
const INI_SESSION_USE_ONLY_COOKIES
const INI_MSSQL_SECURE_CONNECTION
const INI_PHAR_READONLY
const INI_REGISTER_GLOBALS
const INI_MAGIC_QUOTES_GPC
const INI_SESSION_USE_TRANS_SID
updateConfig($version=null, $sub=0, $showWindow=false)
const LOCAL_CFG_CLI_SILENT_EXE
getExtensionsFromConf()
const INI_AUTO_GLOBALS_JIT
const LOCAL_CFG_PEAR_EXE
const INI_REGISTER_ARGC_ARGV
switchVersion($version, $showWindow=false)
const INI_ODBC_ALLOW_PERSISTENT
const ROOT_CFG_ENABLE
const INI_MSSQL_ALLOW_PERSISTENT
const INI_SYBCT_ALLOW_PERSISTENT
setVersion($version)
const INI_SAFE_MODE
const INI_SESSION_BUG_COMPAT_42
const INI_SESSION_COOKIE_HTTPONLY
const INI_MYSQL_ALLOW_PERSISTENT
const INI_TRACK_ERRORS
const INI_IGNORE_REPEATED_ERRORS
getSettingsValues()
setEnable($enabled, $showWindow=false)
const INI_IGNORE_REPEATED_SOURCE
const INI_MYSQLND_COLLECT_MEMORY_STATISTICS
const LOCAL_CFG_CONF
const INI_Y2K_COMPLIANCE
const LOCAL_CFG_CLI_EXE
const INI_PHAR_REQUIRE_HASH
const INI_CGI_FIX_PATHINFO
const INI_MYSQLND_COLLECT_STATISTICS
const INI_XDEBUG_PROFILER_ENABLE
isSettingExists($name)
const INI_TIDY_CLEAN_OUTPUT
const INI_SESSION_BUG_COMPAT_WARN
getApacheModule($apacheVersion, $phpVersion=null)
const INI_HTML_ERRORS
const INI_ENABLE_DL
const INI_SESSION_USE_COOKIES
const INI_CGI_FORCE_REDIRECT
reload($id=null, $type=null)
isSettingActive($name)
getTsDll($phpVersion=null)
const INI_DISPLAY_ERRORS
const INI_XDEBUG_PROFILER_ENABLE_TRIGGER
const INI_XDEBUG_REMOTE_ENABLE
const INI_MAIL_ADD_X_HEADER
const ROOT_CFG_VERSION
const INI_EXPOSE_PHP
const INI_LOG_ERRORS
__construct($id, $type)
const INI_MAGIC_QUOTES_RUNTIME
const INI_PGSQL_ALLOW_PERSISTENT
getExtensionsLoaded()
const INI_PGSQL_AUTO_RESET_PERSISTENT
const INI_ODBC_CHECK_PERSISTENT
const INI_MYSQL_TRACE_MODE
getPearVersion($cache=false)
const INI_SESSION_AUTO_START
const INI_SQL_SAFE_MODE
const INI_SHORT_OPEN_TAG
const INI_ALLOW_URL_INCLUDE
const DISABLED
const ENABLED
const ENABLE_BUNDLE_NOT_EXIST
const PHP_INCPT
const BEARSAMPP_CONF_MALFORMED_ERROR
const ERROR_EXE_NOT_FOUND
const ERROR_CONF_NOT_FOUND
const PHP
const BEARSAMPP_CONF_NOT_FOUND_ERROR
const ENABLE_TITLE
const SWITCH_VERSION_TITLE
const ERROR_FILE_NOT_FOUND
static logError($data, $file=null)
static logInitClass($classInstance)
static logTrace($data, $file=null)
static logInfo($data, $file=null)
static logDebug($data, $file=null)
static logReloadClass($classInstance)
static endWith($string, $search)
static startService($bin, $syntaxCheckCmd, $showWindow=false)
static replaceInFile($path, $replaceList)
global $bearsamppConfig
Definition homepage.php:27