A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					112 lines
				
				4.3 KiB
			
		
		
			
		
	
	
					112 lines
				
				4.3 KiB
			| 
								 
											7 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Smarty error handler
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package    Smarty
							 | 
						||
| 
								 | 
							
								 * @subpackage PluginsInternal
							 | 
						||
| 
								 | 
							
								 * @author     Uwe Tews
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @deprecated
							 | 
						||
| 
								 | 
							
								Smarty does no longer use @filemtime()
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class Smarty_Internal_ErrorHandler
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static $mutedDirectories = array();
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * error handler returned by set_error_handler() in self::muteExpectedErrors()
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    private static $previousErrorHandler = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Enable error handler to mute expected messages
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return boolean
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function muteExpectedErrors()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        /*
							 | 
						||
| 
								 | 
							
								            error muting is done because some people implemented custom error_handlers using
							 | 
						||
| 
								 | 
							
								            http://php.net/set_error_handler and for some reason did not understand the following paragraph:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                It is important to remember that the standard PHP error handler is completely bypassed for the
							 | 
						||
| 
								 | 
							
								                error types specified by error_types unless the callback function returns FALSE.
							 | 
						||
| 
								 | 
							
								                error_reporting() settings will have no effect and your error handler will be called regardless -
							 | 
						||
| 
								 | 
							
								                however you are still able to read the current value of error_reporting and act appropriately.
							 | 
						||
| 
								 | 
							
								                Of particular note is that this value will be 0 if the statement that caused the error was
							 | 
						||
| 
								 | 
							
								                prepended by the @ error-control operator.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include
							 | 
						||
| 
								 | 
							
								                - @filemtime() is almost twice as fast as using an additional file_exists()
							 | 
						||
| 
								 | 
							
								                - between file_exists() and filemtime() a possible race condition is opened,
							 | 
						||
| 
								 | 
							
								                  which does not exist using the simple @filemtime() approach.
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        $error_handler = array('Smarty_Internal_ErrorHandler', 'mutingErrorHandler');
							 | 
						||
| 
								 | 
							
								        $previous = set_error_handler($error_handler);
							 | 
						||
| 
								 | 
							
								        // avoid dead loops
							 | 
						||
| 
								 | 
							
								        if ($previous !== $error_handler) {
							 | 
						||
| 
								 | 
							
								            self::$previousErrorHandler = $previous;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Error Handler to mute expected messages
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @link http://php.net/set_error_handler
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param  integer $errno Error level
							 | 
						||
| 
								 | 
							
								     * @param          $errstr
							 | 
						||
| 
								 | 
							
								     * @param          $errfile
							 | 
						||
| 
								 | 
							
								     * @param          $errline
							 | 
						||
| 
								 | 
							
								     * @param          $errcontext
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return bool
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $_is_muted_directory = false;
							 | 
						||
| 
								 | 
							
								        // add the SMARTY_DIR to the list of muted directories
							 | 
						||
| 
								 | 
							
								        if (!isset(self::$mutedDirectories[ SMARTY_DIR ])) {
							 | 
						||
| 
								 | 
							
								            $smarty_dir = realpath(SMARTY_DIR);
							 | 
						||
| 
								 | 
							
								            if ($smarty_dir !== false) {
							 | 
						||
| 
								 | 
							
								                self::$mutedDirectories[ SMARTY_DIR ] =
							 | 
						||
| 
								 | 
							
								                    array('file' => $smarty_dir, 'length' => strlen($smarty_dir),);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // walk the muted directories and test against $errfile
							 | 
						||
| 
								 | 
							
								        foreach (self::$mutedDirectories as $key => &$dir) {
							 | 
						||
| 
								 | 
							
								            if (!$dir) {
							 | 
						||
| 
								 | 
							
								                // resolve directory and length for speedy comparisons
							 | 
						||
| 
								 | 
							
								                $file = realpath($key);
							 | 
						||
| 
								 | 
							
								                if ($file === false) {
							 | 
						||
| 
								 | 
							
								                    // this directory does not exist, remove and skip it
							 | 
						||
| 
								 | 
							
								                    unset(self::$mutedDirectories[ $key ]);
							 | 
						||
| 
								 | 
							
								                    continue;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                $dir = array('file' => $file, 'length' => strlen($file),);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (!strncmp($errfile, $dir[ 'file' ], $dir[ 'length' ])) {
							 | 
						||
| 
								 | 
							
								                $_is_muted_directory = true;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // pass to next error handler if this error did not occur inside SMARTY_DIR
							 | 
						||
| 
								 | 
							
								        // or the error was within smarty but masked to be ignored
							 | 
						||
| 
								 | 
							
								        if (!$_is_muted_directory || ($errno && $errno & error_reporting())) {
							 | 
						||
| 
								 | 
							
								            if (self::$previousErrorHandler) {
							 | 
						||
| 
								 | 
							
								                return call_user_func(self::$previousErrorHandler,
							 | 
						||
| 
								 | 
							
								                                      $errno,
							 | 
						||
| 
								 | 
							
								                                      $errstr,
							 | 
						||
| 
								 | 
							
								                                      $errfile,
							 | 
						||
| 
								 | 
							
								                                      $errline,
							 | 
						||
| 
								 | 
							
								                                      $errcontext);
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |