Некто сидел в углу, жевал мятный пряник и был полон сарказма..

На тостере тоже все меряются письками, но никто свою при этом не показывает... (с)
Контакты
Местоположение
Россия, Москва и Московская обл., Сергиев Посад

Достижения

Все достижения (20)

Наибольший вклад в теги

Все теги (262)

Лучшие ответы пользователя

Все ответы (1217)
  • Правильный ли подход к работе с ошибками и исключениями?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    class HandlerManager
    {
        public function register()
        {
            set_exception_handler([$this, 'exception']);
            set_error_handler([$this, 'error']);
            register_shutdown_function([$this, 'shutdown']);
        }
        
        private function log($error, $code, $file, $line)
        {
            $error = sprintf('Error %s in file %s[%d]: %s', $code, $file, $line, $error);
            return error_log($error);
        }
        
        public function exception(\Throwable $e)
        {
            $this->log($e->getMessage(), $e->getCode(), $e->getFile(), $e->getLine());
            // clean the output buffer if one exists
            ob_get_level() && ob_clean();
            header('Content-Type: text/plain; charset=utf-8', true, 500);
            echo $e->getMessage();
            exit(1);
        }
        
        public function error($severity, $error, $file = '', $line = 0)
        {
            if (error_reporting() & $severity) {
                $this->log($error, $severity, $file, $line);
                throw new \ErrorException($error, $severity, $file, $line);
            }
            // dont execute the PHP error handler
            return true;
        }
    
        public function shutdown(array $shutdown_errors = [E_PARSE, E_ERROR, E_USER_ERROR])
        {
            $error = error_get_last();
            if ($error && in_array($error['type'], $shutdown_errors)) {
                // сlean the output buffer
                ob_get_level() && ob_clean();
                $this->log($error['message'], $error['type'], $error['file'], $error['line']);
                // shutdown now to avoid a "death loop"
                exit(1);
            }
        }
    }

    Вот простой пример класса с обработчиками. Под http ошибки 400-500 лучше завести отдельное исключение(а лучше для каждого кода) + базовое исключение приложения.
    Ответ написан
  • Как работает Workerman?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    $_GET['user'] = 'foo';
    $ws_worker->onConnect = function($connection) use (&$users)
    {
        // $_GET['user'] = 'foo2';
        $connection->onWebSocketConnect = function($connection) use (&$users)
        {
            // поместите get-параметр в коллекцию $users при подключении нового пользователя
            // на странице сайта можно задать любой параметр. например client.html: ws = new WebSocket("ws://127.0.0.1:8000/?user=tester01");
            $users[$_GET['user']] = $connection;
            // or you can use another parameter for user identification, for example $_COOKIE['PHPSESSID']
        };
    };
    Ответ написан
  • Запуск CS Fixer, Code Sniffer(или их аналоги) в web режиме?

    SilenceOfWinter
    @SilenceOfWinter Автор вопроса
    та еще зажигалка...
    как говорится хочешь сделать хорошо - сделай сам...
    пакет https://github.com/badoo/phpcf
    $formatter = new \Phpcf\Formatter(new \Phpcf\Options());
    $result = $formatter->formatFile('path/to/file.php');
    if ($result->getError()) {
        throw $result->getError();
    } else {
        file_put_contents($result->getFile(), $result->getContent());
    }
    Ответ написан
  • Как правильно преобразовать массив в XML?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    честно говоря писался код давно и уверен что он работает.
    class XmlConverter
    {
    	/**
    	 * Conver array in xml
    	 */
    	public function as_array(array $data, $xml = NULL)
    	{
    		if (is_null($xml))
    		{
    			$xml = simplexml_load_string('<'.key($data).'/>');
    			$data = current($data);
    			$return = TRUE;
    		}
    		if (is_array($data))
    		{
    			foreach ($data as $name => $value)
    			{
    				self::from_array($value, is_numeric($name) ? $xml : $xml->addChild($name));
    			}
    		}
    		else
    		{
    			$xml->{0} = $data;
    		}
    		if ( ! empty($return))
    		{
    			return $xml->asXML();
    		}
    	}
    
    	/**
    	 * Conver xml in array
    	 */
    	public function to_array($xml)
    	{
    		$tree = NULL;
    		while($xml->read())
    		{
    			switch ($xml->nodeType)
    			{ 
    				case XMLReader::END_ELEMENT: 
    					return $tree; 
    				case XMLReader::ELEMENT: 
    					$node = array(
    						'tag'   => $xml->name, 
    						'value' => $xml->isEmptyElement ? '' : self::to_array($xml)
    					); 
    					if ($xml->hasAttributes) 
    					{
    						while ($xml->moveToNextAttribute())
    						{
    							$node['attributes'][$xml->name] = $xml->value;
    						}
    					}
    					$tree[] = $node; 
    				break; 
    				case XMLReader::TEXT:
    				case XMLReader::CDATA:
    					$tree .= $xml->value; 
    			}
    		}
    		return $tree; 
    	}
    }
    Ответ написан
  • Как реализовать прокси чекер для cURL?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    protected function checkProxy($host, $port)
    	{
    		$h = @fsockopen($host, $port, $errno, $errstr, 5);
    		if ($h) {
    			fclose($h);
    			return true;
    		}
    		return false;
    	}
    
    	$activeProxyList = [];
    	foreach ($this->proxyList as $proxy) {
    		if ($this->checkProxy($proxy['host'], $proxy['port'])) {
    			$activeProxyList[] = $proxy;
    		}
    	}
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (65)