Bearsampp 2026.9.23
Loading...
Searching...
No Matches
class.bin.php.php
Go to the documentation of this file.
1<?php
2/*
3 *
4 * * Copyright (c) 2021-2026 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{
22 const ROOT_CFG_ENABLE = 'phpEnable';
26 const ROOT_CFG_VERSION = 'phpVersion';
27
31 const LOCAL_CFG_CLI_EXE = 'phpCliExe';
35 const LOCAL_CFG_CLI_SILENT_EXE = 'phpCliSilentExe';
39 const LOCAL_CFG_CONF = 'phpConf';
43 const LOCAL_CFG_PEAR_EXE = 'phpPearExe';
44
45 const INI_SHORT_OPEN_TAG = 'short_open_tag';
46 const INI_ASP_TAGS = 'asp_tags';
47 const INI_Y2K_COMPLIANCE = 'y2k_compliance';
48 const INI_OUTPUT_BUFFERING = 'output_buffering';
49 const INI_ZLIB_OUTPUT_COMPRESSION = 'zlib.output_compression';
50 const INI_IMPLICIT_FLUSH = 'implicit_flush';
51 const INI_ALLOW_CALL_TIME_PASS_REFERENCE = 'allow_call_time_pass_reference';
52 const INI_SAFE_MODE = 'safe_mode';
53 const INI_SAFE_MODE_GID = 'safe_mode_gid';
54 const INI_EXPOSE_PHP = 'expose_php';
55 const INI_DISPLAY_ERRORS = 'display_errors';
56 const INI_DISPLAY_STARTUP_ERRORS = 'display_startup_errors';
57 const INI_LOG_ERRORS = 'log_errors';
58 const INI_IGNORE_REPEATED_ERRORS = 'ignore_repeated_errors';
59 const INI_IGNORE_REPEATED_SOURCE = 'ignore_repeated_source';
60 const INI_REPORT_MEMLEAKS = 'report_memleaks';
61 const INI_TRACK_ERRORS = 'track_errors';
62 const INI_HTML_ERRORS = 'html_errors';
63 const INI_REGISTER_GLOBALS = 'register_globals';
64 const INI_REGISTER_LONG_ARRAYS = 'register_long_arrays';
65 const INI_REGISTER_ARGC_ARGV = 'register_argc_argv';
66 const INI_AUTO_GLOBALS_JIT = 'auto_globals_jit';
67 const INI_MAGIC_QUOTES_GPC = 'magic_quotes_gpc';
68 const INI_MAGIC_QUOTES_RUNTIME = 'magic_quotes_runtime';
69 const INI_MAGIC_QUOTES_SYBASE = 'magic_quotes_sybase';
70 const INI_ENABLE_DL = 'enable_dl';
71 const INI_CGI_FORCE_REDIRECT = 'cgi.force_redirect';
72 const INI_CGI_FIX_PATHINFO = 'cgi.fix_pathinfo';
73 const INI_FILE_UPLOADS = 'file_uploads';
74 const INI_ALLOW_URL_FOPEN = 'allow_url_fopen';
75 const INI_ALLOW_URL_INCLUDE = 'allow_url_include';
76 const INI_PHAR_READONLY = 'phar.readonly';
77 const INI_PHAR_REQUIRE_HASH = 'phar.require_hash';
78 const INI_DEFINE_SYSLOG_VARIABLES = 'define_syslog_variables';
79 const INI_MAIL_ADD_X_HEADER = 'mail.add_x_header';
80 const INI_SQL_SAFE_MODE = 'sql.safe_mode';
81 const INI_ODBC_ALLOW_PERSISTENT = 'odbc.allow_persistent';
82 const INI_ODBC_CHECK_PERSISTENT = 'odbc.check_persistent';
83 const INI_MYSQL_ALLOW_LOCAL_INFILE = 'mysql.allow_local_infile';
84 const INI_MYSQL_ALLOW_PERSISTENT = 'mysql.allow_persistent';
85 const INI_MYSQL_TRACE_MODE = 'mysql.trace_mode';
86 const INI_MYSQLI_ALLOW_PERSISTENT = 'mysqli.allow_persistent';
87 const INI_MYSQLI_RECONNECT = 'mysqli.reconnect';
88 const INI_MYSQLND_COLLECT_STATISTICS = 'mysqlnd.collect_statistics';
89 const INI_MYSQLND_COLLECT_MEMORY_STATISTICS = 'mysqlnd.collect_memory_statistics';
90 const INI_PGSQL_ALLOW_PERSISTENT = 'pgsql.allow_persistent';
91 const INI_PGSQL_AUTO_RESET_PERSISTENT = 'pgsql.auto_reset_persistent';
92 const INI_SYBCT_ALLOW_PERSISTENT = 'sybct.allow_persistent';
93 const INI_SESSION_USE_COOKIES = 'session.use_cookies';
94 const INI_SESSION_USE_ONLY_COOKIES = 'session.use_only_cookies';
95 const INI_SESSION_AUTO_START = 'session.auto_start';
96 const INI_SESSION_COOKIE_HTTPONLY = 'session.cookie_httponly';
97 const INI_SESSION_BUG_COMPAT_42 = 'session.bug_compat_42';
98 const INI_SESSION_BUG_COMPAT_WARN = 'session.bug_compat_warn';
99 const INI_SESSION_USE_TRANS_SID = 'session.use_trans_sid';
100 const INI_MSSQL_ALLOW_PERSISTENT = 'mssql.allow_persistent';
101 const INI_MSSQL_COMPATIBILITY_MODE = 'mssql.compatability_mode';
102 const INI_MSSQL_SECURE_CONNECTION = 'mssql.secure_connection';
103 const INI_TIDY_CLEAN_OUTPUT = 'tidy.clean_output';
104 const INI_SOAP_WSDL_CACHE_ENABLED = 'soap.wsdl_cache_enabled';
105 const INI_XDEBUG_REMOTE_ENABLE = 'xdebug.remote_enable';
106 const INI_XDEBUG_PROFILER_ENABLE = 'xdebug.profiler_enable';
107 const INI_XDEBUG_PROFILER_ENABLE_TRIGGER = 'xdebug.profiler_enable_trigger';
108
112 private $apacheConf;
116 private $errorLog;
117
121 private $cliExe;
129 private $conf;
133 private $pearExe;
134
141 public function __construct($id, $type)
142 {
143 Log::initClass($this);
144 $this->reload($id, $type);
145 }
146
153 public function reload($id = null, $type = null)
154 {
156 Log::reloadClass($this);
157
158 $this->name = $bearsamppLang->getValue(Lang::PHP);
159 $this->version = $bearsamppConfig->getRaw(self::ROOT_CFG_VERSION);
160 parent::reload($id, $type);
161
162 $this->enable = $this->enable && $bearsamppConfig->getRaw(self::ROOT_CFG_ENABLE);
163 $this->apacheConf = Path::getModuleCurrentPath($bearsamppBins->getApache()) . '/' . $this->apacheConf; //FIXME: Useful ?
164 $this->errorLog = Path::getLogsPath() . '/php_error.log';
165
166 if ($this->bearsamppConfRaw !== false) {
167 $this->cliExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CLI_EXE];
168 $this->cliSilentExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CLI_SILENT_EXE];
169 $this->conf = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_CONF];
170 $this->pearExe = $this->symlinkPath . '/' . $this->bearsamppConfRaw[self::LOCAL_CFG_PEAR_EXE];
171 }
172
173 if (!$this->enable) {
174 Log::info($this->name . ' is not enabled!');
175
176 return;
177 }
178 if (!is_dir($this->currentPath)) {
179 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_FILE_NOT_FOUND), $this->name . ' ' . $this->version, $this->currentPath));
180
181 return;
182 }
183 if (!is_dir($this->symlinkPath)) {
184 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_FILE_NOT_FOUND), $this->name . ' ' . $this->version, $this->symlinkPath));
185
186 return;
187 }
188 if (!is_file($this->bearsamppConf)) {
189 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_CONF_NOT_FOUND), $this->name . ' ' . $this->version, $this->bearsamppConf));
190
191 return;
192 }
193 if (!is_file($this->cliExe)) {
194 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->cliExe));
195 }
196 if (!is_file($this->cliSilentExe)) {
197 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->cliSilentExe));
198 }
199 if (!is_file($this->conf)) {
200 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_CONF_NOT_FOUND), $this->name . ' ' . $this->version, $this->conf));
201 }
202 if (!is_file($this->pearExe)) {
203 Log::error(sprintf($bearsamppLang->getValue(Lang::ERROR_EXE_NOT_FOUND), $this->name . ' ' . $this->version, $this->pearExe));
204 }
205 }
206
215 public function switchVersion($version, $showWindow = false)
216 {
217 Log::debug('Switch ' . $this->name . ' version to ' . $version);
218
219 return $this->updateConfig($version, 0, $showWindow);
220 }
221
231 protected function updateConfig($version = null, $sub = 0, $showWindow = false)
232 {
233 global $bearsamppLang, $bearsamppBins, $bearsamppApps, $bearsamppWinbinder;
234
235 if (!$this->enable) {
236 return true;
237 }
238
239 $version = $version == null ? $this->version : $version;
240 Log::debug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'Update ' . $this->name . ' ' . $version . ' config');
241
242 $boxTitle = sprintf($bearsamppLang->getValue(Lang::SWITCH_VERSION_TITLE), $this->getName(), $version);
243
244 $conf = str_replace('php' . $this->getVersion(), 'php' . $version, $this->getConf());
245 Log::trace('Current php version found: ' . $conf);
246 $bearsamppConf = str_replace('php' . $this->getVersion(), 'php' . $version, $this->bearsamppConf);
247 Log::trace('Current bearsampp.conf php version found: ' . $bearsamppConf);
248
249 $tsDll = $this->getTsDll($version);
250 $apachePhpModulePath = $this->getApacheModule($bearsamppBins->getApache()->getVersion(), $version);
251
252 Log::debug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'PHP TsDll found: ' . $tsDll);
253 Log::debug(($sub > 0 ? str_repeat(' ', 2 * $sub) : '') . 'PHP Apache module found: ' . $apachePhpModulePath);
254
255 if (!file_exists($conf) || !file_exists($bearsamppConf)) {
256 Log::error('bearsampp config files not found for ' . $this->getName() . ' ' . $version);
257 if ($showWindow) {
258 $bearsamppWinbinder->messageBoxError(
259 sprintf($bearsamppLang->getValue(Lang::BEARSAMPP_CONF_NOT_FOUND_ERROR), $this->getName() . ' ' . $version),
260 $boxTitle
261 );
262 }
263
264 return false;
265 }
266
267 $bearsamppConfRaw = parse_ini_file($bearsamppConf);
268 if ($bearsamppConfRaw === false || !isset($bearsamppConfRaw[self::ROOT_CFG_VERSION]) || $bearsamppConfRaw[self::ROOT_CFG_VERSION] != $version) {
269 Log::error('bearsampp config file malformed for ' . $this->getName() . ' ' . $version);
270 if ($showWindow) {
271 $bearsamppWinbinder->messageBoxError(
272 sprintf($bearsamppLang->getValue(Lang::BEARSAMPP_CONF_MALFORMED_ERROR), $this->getName() . ' ' . $version),
273 $boxTitle
274 );
275 }
276
277 return false;
278 }
279
280 if ($tsDll === false || $apachePhpModulePath === false) {
281 Log::debug($this->getName() . ' ' . $version . ' does not seem to be compatible with Apache ' . $bearsamppBins->getApache()->getVersion());
282 if ($showWindow) {
283 $bearsamppWinbinder->messageBoxError(
284 sprintf($bearsamppLang->getValue(Lang::PHP_INCPT), $version, $bearsamppBins->getApache()->getVersion()),
285 $boxTitle
286 );
287 }
288
289 return false;
290 }
291
292 // bearsampp.conf
293 Log::trace('Calling Set Version for php...');
294 $this->setVersion($version);
295
296 // conf
297 Util::replaceInFile($this->getConf(), array(
298 '/^mysql.default_port\s=\s(\d+)/' => 'mysql.default_port = ' . $bearsamppBins->getMysql()->getPort(),
299 '/^mysqli.default_port\s=\s(\d+)/' => 'mysqli.default_port = ' . $bearsamppBins->getMysql()->getPort()
300 ));
301
302 // apache
303 $bearsamppBins->getApache()->update($sub + 1);
304
305 // phpmyadmin
306 $bearsamppApps->getPhpmyadmin()->update($sub + 1);
307
308 return true;
309 }
310
316 public function getSettings()
317 {
318 return array(
319 'Language options' => array(
320 'Short open tag' => self::INI_SHORT_OPEN_TAG,
321 'ASP-style tags' => self::INI_ASP_TAGS,
322 'Year 2000 compliance' => self::INI_Y2K_COMPLIANCE,
323 'Output buffering' => self::INI_OUTPUT_BUFFERING,
324 'Zlib output compression' => self::INI_ZLIB_OUTPUT_COMPRESSION,
325 'Implicit flush' => self::INI_IMPLICIT_FLUSH,
326 'Allow call time pass reference' => self::INI_ALLOW_CALL_TIME_PASS_REFERENCE,
327 'Safe mode' => self::INI_SAFE_MODE,
328 'Safe mode GID' => self::INI_SAFE_MODE_GID,
329 ),
330 'Miscellaneous' => array(
331 'Expose PHP' => self::INI_EXPOSE_PHP,
332 ),
333 'Error handling and logging' => array(
334 'Display errors' => self::INI_DISPLAY_ERRORS,
335 'Display startup errors' => self::INI_DISPLAY_STARTUP_ERRORS,
336 'Log errors' => self::INI_LOG_ERRORS,
337 'Ignore repeated errors' => self::INI_IGNORE_REPEATED_ERRORS,
338 'Ignore repeated source' => self::INI_IGNORE_REPEATED_SOURCE,
339 'Report memory leaks' => self::INI_REPORT_MEMLEAKS,
340 'Track errors' => self::INI_TRACK_ERRORS,
341 'HTML errors' => self::INI_HTML_ERRORS,
342 ),
343 'Data Handling' => array(
344 'Register globals' => self::INI_REGISTER_GLOBALS,
345 'Register long arrays' => self::INI_REGISTER_LONG_ARRAYS,
346 'Register argc argv' => self::INI_REGISTER_ARGC_ARGV,
347 'Auto globals just in time' => self::INI_AUTO_GLOBALS_JIT,
348 'Magic quotes gpc' => self::INI_MAGIC_QUOTES_GPC,
349 'Magic quotes runtime' => self::INI_MAGIC_QUOTES_RUNTIME,
350 'Magic quotes Sybase' => self::INI_MAGIC_QUOTES_SYBASE,
351 ),
352 'Paths and Directories' => array(
353 'Enable dynamic loading' => self::INI_ENABLE_DL,
354 'CGI force redirect' => self::INI_CGI_FORCE_REDIRECT,
355 'CGI fix path info' => self::INI_CGI_FIX_PATHINFO,
356 ),
357 'File uploads' => array(
358 'File uploads' => self::INI_FILE_UPLOADS,
359 ),
360 'Fopen wrappers' => array(
361 'Allow url fopen' => self::INI_ALLOW_URL_FOPEN,
362 'Allow url include' => self::INI_ALLOW_URL_INCLUDE,
363 ),
364 'Module settings' => array(
365 'Phar' => array(
366 'Read only' => self::INI_PHAR_READONLY,
367 'Require hash' => self::INI_PHAR_REQUIRE_HASH,
368 ),
369 'Syslog' => array(
370 'Define syslog variables' => self::INI_DEFINE_SYSLOG_VARIABLES,
371 ),
372 'Mail' => array(
373 'Add X-PHP-Originating-Script' => self::INI_MAIL_ADD_X_HEADER,
374 ),
375 'SQL' => array(
376 'Safe mode' => self::INI_SQL_SAFE_MODE,
377 ),
378 'ODBC' => array(
379 'Allow persistent' => self::INI_ODBC_ALLOW_PERSISTENT,
380 'Check persistent' => self::INI_ODBC_CHECK_PERSISTENT,
381 ),
382 'MySQL' => array(
383 'Allow local infile' => self::INI_MYSQL_ALLOW_LOCAL_INFILE,
384 'Allow persistent' => self::INI_MYSQL_ALLOW_PERSISTENT,
385 'Trace mode' => self::INI_MYSQL_TRACE_MODE,
386 ),
387 'MySQLi' => array(
388 'Allow persistent' => self::INI_MYSQLI_ALLOW_PERSISTENT,
389 'Reconnect' => self::INI_MYSQLI_RECONNECT,
390 ),
391 'MySQL Native Driver' => array(
392 'Collect statistics' => self::INI_MYSQLND_COLLECT_STATISTICS,
393 'Collect memory statistics' => self::INI_MYSQLND_COLLECT_MEMORY_STATISTICS,
394 ),
395 'PostgresSQL' => array(
396 'Allow persistent' => self::INI_PGSQL_ALLOW_PERSISTENT,
397 'Auto reset persistent' => self::INI_PGSQL_AUTO_RESET_PERSISTENT,
398 ),
399 'Sybase-CT' => array(
400 'Allow persistent' => self::INI_SYBCT_ALLOW_PERSISTENT,
401 ),
402 'Session' => array(
403 'Use cookies' => self::INI_SESSION_USE_COOKIES,
404 'Use only cookies' => self::INI_SESSION_USE_ONLY_COOKIES,
405 'Auto start' => self::INI_SESSION_AUTO_START,
406 'Cookie HTTP only' => self::INI_SESSION_COOKIE_HTTPONLY,
407 'Bug compat 42' => self::INI_SESSION_BUG_COMPAT_42,
408 'Bug compat warning' => self::INI_SESSION_BUG_COMPAT_WARN,
409 'Use trans sid' => self::INI_SESSION_USE_TRANS_SID,
410 ),
411 'MSSQL' => array(
412 'Allow persistent' => self::INI_MSSQL_ALLOW_PERSISTENT,
413 'Compatibility mode' => self::INI_MSSQL_COMPATIBILITY_MODE,
414 'Secure connection' => self::INI_MSSQL_SECURE_CONNECTION,
415 ),
416 'Tidy' => array(
417 'Clean output' => self::INI_TIDY_CLEAN_OUTPUT,
418 ),
419 'SOAP' => array(
420 'WSDL cache enabled' => self::INI_SOAP_WSDL_CACHE_ENABLED,
421 ),
422 'XDebug' => array(
423 'Remote enable' => self::INI_XDEBUG_REMOTE_ENABLE,
424 'Profiler enable' => self::INI_XDEBUG_PROFILER_ENABLE,
425 'Profiler enable trigger' => self::INI_XDEBUG_PROFILER_ENABLE_TRIGGER,
426 ),
427 ),
428 );
429 }
430
436 public function getSettingsValues()
437 {
438 return array(
439 self::INI_SHORT_OPEN_TAG => array('On', 'Off', 'On'),
440 self::INI_ASP_TAGS => array('On', 'Off', 'Off'),
441 self::INI_Y2K_COMPLIANCE => array('1', '0', '1'),
442 self::INI_OUTPUT_BUFFERING => array('4096', 'Off', '4096'),
443 self::INI_ZLIB_OUTPUT_COMPRESSION => array('On', 'Off', 'Off'),
444 self::INI_IMPLICIT_FLUSH => array('On', 'Off', 'Off'),
445 self::INI_ALLOW_CALL_TIME_PASS_REFERENCE => array('On', 'Off', 'On'),
446 self::INI_SAFE_MODE => array('On', 'Off', 'Off'),
447 self::INI_SAFE_MODE_GID => array('On', 'Off', 'Off'),
448 self::INI_EXPOSE_PHP => array('On', 'Off', 'On'),
449 self::INI_DISPLAY_ERRORS => array('On', 'Off', 'On'),
450 self::INI_DISPLAY_STARTUP_ERRORS => array('On', 'Off', 'On'),
451 self::INI_LOG_ERRORS => array('On', 'Off', 'On'),
452 self::INI_IGNORE_REPEATED_ERRORS => array('On', 'Off', 'Off'),
453 self::INI_IGNORE_REPEATED_SOURCE => array('On', 'Off', 'Off'),
454 self::INI_REPORT_MEMLEAKS => array('On', 'Off', 'On'),
455 self::INI_TRACK_ERRORS => array('On', 'Off', 'On'),
456 self::INI_HTML_ERRORS => array('On', 'Off', 'On'),
457 self::INI_REGISTER_GLOBALS => array('On', 'Off', 'Off'),
458 self::INI_REGISTER_LONG_ARRAYS => array('On', 'Off', 'Off'),
459 self::INI_REGISTER_ARGC_ARGV => array('On', 'Off', 'Off'),
460 self::INI_AUTO_GLOBALS_JIT => array('On', 'Off', 'On'),
461 self::INI_MAGIC_QUOTES_GPC => array('On', 'Off', 'Off'),
462 self::INI_MAGIC_QUOTES_RUNTIME => array('On', 'Off', 'Off'),
463 self::INI_MAGIC_QUOTES_SYBASE => array('On', 'Off', 'Off'),
464 self::INI_ENABLE_DL => array('On', 'Off', 'Off'),
465 self::INI_CGI_FORCE_REDIRECT => array('1', '0', '1'),
466 self::INI_FILE_UPLOADS => array('On', 'Off', 'On'),
467 self::INI_ALLOW_URL_FOPEN => array('On', 'Off', 'On'),
468 self::INI_ALLOW_URL_INCLUDE => array('On', 'Off', 'Off'),
469 self::INI_DEFINE_SYSLOG_VARIABLES => array('On', 'Off', 'Off'),
470 self::INI_MAIL_ADD_X_HEADER => array('On', 'Off', 'On'),
471 self::INI_SQL_SAFE_MODE => array('On', 'Off', 'Off'),
472 self::INI_ODBC_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
473 self::INI_ODBC_CHECK_PERSISTENT => array('On', 'Off', 'On'),
474 self::INI_MYSQL_ALLOW_LOCAL_INFILE => array('On', 'Off', 'Off'),
475 self::INI_MYSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
476 self::INI_MYSQL_TRACE_MODE => array('On', 'Off', 'Off'),
477 self::INI_MYSQLI_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
478 self::INI_MYSQLI_RECONNECT => array('On', 'Off', 'Off'),
479 self::INI_MYSQLND_COLLECT_STATISTICS => array('On', 'Off', 'On'),
480 self::INI_MYSQLND_COLLECT_MEMORY_STATISTICS => array('On', 'Off', 'On'),
481 self::INI_PGSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
482 self::INI_PGSQL_AUTO_RESET_PERSISTENT => array('On', 'Off', 'Off'),
483 self::INI_SYBCT_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
484 self::INI_SESSION_USE_COOKIES => array('1', '0', '1'),
485 self::INI_SESSION_USE_ONLY_COOKIES => array('1', '0', '1'),
486 self::INI_SESSION_AUTO_START => array('1', '0', '0'),
487 self::INI_SESSION_COOKIE_HTTPONLY => array('1', '', ''),
488 self::INI_SESSION_BUG_COMPAT_42 => array('On', 'Off', 'On'),
489 self::INI_SESSION_BUG_COMPAT_WARN => array('On', 'Off', 'On'),
490 self::INI_SESSION_USE_TRANS_SID => array('1', '0', '0'),
491 self::INI_MSSQL_ALLOW_PERSISTENT => array('On', 'Off', 'On'),
492 self::INI_MSSQL_COMPATIBILITY_MODE => array('On', 'Off', 'Off'),
493 self::INI_MSSQL_SECURE_CONNECTION => array('On', 'Off', 'Off'),
494 self::INI_TIDY_CLEAN_OUTPUT => array('On', 'Off', 'Off'),
495 self::INI_SOAP_WSDL_CACHE_ENABLED => array('1', '0', '1'),
496 self::INI_XDEBUG_REMOTE_ENABLE => array('On', 'Off', 'On'),
497 self::INI_XDEBUG_PROFILER_ENABLE => array('On', 'Off', 'Off'),
498 self::INI_XDEBUG_PROFILER_ENABLE_TRIGGER => array('On', 'Off', 'Off'),
499 );
500 }
501
509 public function isSettingActive($name)
510 {
511 $settingsValues = $this->getSettingsValues();
512
513 $confContent = file($this->getConf());
514 foreach ($confContent as $row) {
515 $settingMatch = array();
516 if (preg_match('/^' . $name . '\s*=\s*(.+)/i', $row, $settingMatch)) {
517 return isset($settingMatch[1]) && isset($settingsValues[$name]) && $settingsValues[$name][0] == trim($settingMatch[1]);
518 }
519 }
520
521 return false;
522 }
523
531 public function isSettingExists($name)
532 {
533 $confContent = file($this->getConf());
534 foreach ($confContent as $row) {
535 if (preg_match('/^\s*?;?\s*?' . $name . '\s*=\s*.*/i', $row)) {
536 return true;
537 }
538 }
539
540 return false;
541 }
542
548 public function getExtensions()
549 {
550 $fromFolder = $this->getExtensionsFromConf();
551 $fromConf = $this->getExtensionsFromFolder();
552 $result = array_merge($fromConf, $fromFolder);
553 ksort($result);
554
555 return $result;
556 }
557
565 private function isExtensionExcluded($ext)
566 {
567 return in_array($ext, array(
568 'opcache',
569 'xdebug'
570 ));
571 }
572
578 public function getExtensionsFromConf()
579 {
580 $result = array();
581
582 $confContent = file($this->getConf());
583 foreach ($confContent as $row) {
584 $extMatch = array();
585 if (preg_match('/^(;)?extension\s*=\s*"?(.+)"?/i', $row, $extMatch)) {
586 $name = preg_replace("/^php_/", "", preg_replace("/\.dll$/", "", trim($extMatch[2])));
587 if ($this->isExtensionExcluded($name)) {
588 continue;
589 }
590 if ($extMatch[1] == ';') {
592 } else {
594 }
595 }
596 }
597
598 ksort($result);
599
600 return $result;
601 }
602
608 public function getExtensionsLoaded()
609 {
610 $result = array();
611 foreach ($this->getExtensionsFromConf() as $name => $status) {
613 $result[] = $name;
614 }
615 }
616
617 return $result;
618 }
619
625 public function getExtensionsFromFolder()
626 {
627 $result = array();
628
629 $handle = @opendir(Path::getModuleCurrentPath($this) . '/ext');
630 if (!$handle) {
631 return $result;
632 }
633
634 while (false !== ($file = readdir($handle))) {
635 if ($file != "." && $file != ".." && UtilString::endWith($file, '.dll')) {
636 $name = preg_replace("/^php_/", "", preg_replace("/\.dll$/", "", trim($file)));
637 if ($this->isExtensionExcluded($name)) {
638 continue;
639 }
641 }
642 }
643
644 closedir($handle);
645 ksort($result);
646
647 return $result;
648 }
649
658 public function getApacheModule($apacheVersion, $phpVersion = null)
659 {
660 $apacheVersion = substr(str_replace('.', '', $apacheVersion), 0, 2);
661 $phpVersion = $phpVersion == null ? $this->getVersion() : $phpVersion;
662
663 $currentPath = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, Path::getModuleCurrentPath($this));
664 $bearsamppConf = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, $this->bearsamppConf);
665
666 if (in_array($phpVersion, $this->getVersionList()) && file_exists($bearsamppConf)) {
667 $apacheCpt = parse_ini_file($bearsamppConf);
668 if ($apacheCpt !== false) {
669 foreach ($apacheCpt as $aVersion => $apacheModule) {
670 $aVersion = str_replace('apache', '', $aVersion);
671 $aVersion = str_replace('.', '', $aVersion);
672 if ($apacheVersion == $aVersion && file_exists($currentPath . '/' . $apacheModule)) {
673 return $currentPath . '/' . $apacheModule;
674 }
675 }
676 }
677 }
678
679 return false;
680 }
681
689 public function getTsDll($phpVersion = null)
690 {
691 $phpVersion = $phpVersion == null ? $this->getVersion() : $phpVersion;
692 $currentPath = str_replace('php' . $this->getVersion(), 'php' . $phpVersion, Path::getModuleCurrentPath($this));
693
694 if (file_exists($currentPath . '/php7ts.dll')) {
695 return 'php7ts.dll';
696 } elseif (file_exists($currentPath . '/php8ts.dll')) {
697 return 'php8ts.dll';
698 }
699
700 return false;
701 }
702
708 public function setVersion($version)
709 {
710 global $bearsamppConfig;
711 $this->version = $version;
712 Log::trace('Setting php version in .conf to: ' . $this->version);
713 $bearsamppConfig->replace(self::ROOT_CFG_VERSION, $version);
714 Log::trace('Reloading php version...');
715 $this->reload();
716 Log::trace('Reloading of php version complete');
717 }
718
725 public function setEnable($enabled, $showWindow = false)
726 {
727 global $bearsamppConfig, $bearsamppBins, $bearsamppLang, $bearsamppWinbinder;
728
729 if ($enabled == Config::ENABLED && !is_dir($this->currentPath)) {
730 Log::debug($this->getName() . ' cannot be enabled because bundle ' . $this->getVersion() . ' does not exist in ' . $this->currentPath);
731 if ($showWindow) {
732 $bearsamppWinbinder->messageBoxError(
733 sprintf($bearsamppLang->getValue(Lang::ENABLE_BUNDLE_NOT_EXIST), $this->getName(), $this->getVersion(), $this->currentPath),
734 sprintf($bearsamppLang->getValue(Lang::ENABLE_TITLE), $this->getName())
735 );
736 }
737 $enabled = Config::DISABLED;
738 }
739
740 Log::info($this->getName() . ' switched to ' . ($enabled == Config::ENABLED ? 'enabled' : 'disabled'));
741 $this->enable = $enabled == Config::ENABLED;
742 $bearsamppConfig->replace(self::ROOT_CFG_ENABLE, $enabled);
743
744 $this->reload();
745 $bearsamppBins->getApache()->update();
746 if ($bearsamppBins->getApache()->isEnable() && $bearsamppBins->getApache()->getService()->isRunning()) {
747 $bearsamppBins->getApache()->getService()->stop();
749 }
750 }
751
757 public function getErrorLog()
758 {
759 return $this->errorLog;
760 }
761
767 public function getCliExe()
768 {
769 return $this->cliExe;
770 }
771
777 public function getCliSilentExe()
778 {
779 return $this->cliSilentExe;
780 }
781
787 public function getConf()
788 {
789 return $this->conf;
790 }
791
797 public function getPearExe()
798 {
799 return $this->pearExe;
800 }
801
809 public function getPearVersion($cache = false)
810 {
811 $cacheFile = Path::getModuleCurrentPath($this) . '/pear/version';
812 if (!$cache) {
813 file_put_contents($cacheFile, Batch::getPearVersion());
814 }
815
816 return file_exists($cacheFile) ? file_get_contents($cacheFile) : null;
817 }
818}
$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 info($data, $file=null)
static debug($data, $file=null)
static reloadClass($classInstance)
static trace($data, $file=null)
static error($data, $file=null)
static initClass($classInstance)
static getLogsPath($aetrayPath=false)
static getModuleCurrentPath($module)
static startService($bin, $syntaxCheckCmd=null, $showWindow=false)
static replaceInFile($path, $replaceList)
static endWith($string, $search)
global $bearsamppConfig
Definition homepage.php:46