第六章-PHP错误处理

server/2025/3/19 15:01:35/

PHP错误处理

一,错误处理的基本概念:

1. 错误类型

PHP中的错误主要分为以下几类:

  • 致命错误 (Fatal Errors): 这些错误会导致脚本终止执行。例如,调用未定义的函数或类。
  • 警告 (Warnings): 这些错误不会终止脚本执行,但指示有问题需要解决。例如,包含一个不存在的文件。
  • 通知 (Notices): 这些是非致命的提示,通常不会影响脚本的执行。例如,访问未定义的变量。
  • 解析错误 (Parse Errors): 这些错误发生在脚本解析阶段,通常是由于语法错误引起的。

2. 错误报告级别

PHP提供了不同的错误报告级别,可以通过error_reporting()函数来设置:

  • E_ALL: 报告所有错误和警告。
  • E_ERROR: 只报告致命错误。
  • E_WARNING: 只报告警告。
  • E_NOTICE: 只报告通知。
  • E_PARSE: 只报告解析错误。

例如,设置报告所有错误:

php">error_reporting(E_ALL);

3. 错误处理函数

PHP提供了几个内置函数来处理错误:

  • error_reporting(): 设置错误报告级别。
  • set_error_handler(): 设置用户自定义的错误处理函数。
  • trigger_error(): 触发一个用户级别的错误/警告/通知。
  • restore_error_handler(): 恢复之前的错误处理函数。

4. 自定义错误处理

你可以通过set_error_handler()函数来定义自己的错误处理函数:

php">function customErrorHandler($errno, $errstr, $errfile, $errline) {echo "<b>Error:</b> [$errno] $errstr<br>";echo "Error on line $errline in $errfile<br>";
}set_error_handler("customErrorHandler");

5. 异常处理

PHP还支持异常处理,使用trycatchthrow语句:

php">try {// 代码块throw new Exception("An error occurred");
} catch (Exception $e) {echo "Caught exception: " . $e->getMessage();
}

6. 日志记录

你可以将错误记录到日志文件中,而不是直接显示给用户:

php">ini_set("log_errors", 1);
ini_set("error_log", "/path/to/your/error.log");

7. 关闭错误显示

在生产环境中,通常不希望将错误信息显示给用户,可以通过以下设置关闭错误显示:

php">ini_set("display_errors", 0);

8. 错误处理最佳实践

  • 开发环境: 显示所有错误,便于调试。
  • 生产环境: 关闭错误显示,记录错误日志,避免暴露敏感信息。
  • 自定义错误页面: 为用户提供友好的错误页面,而不是显示技术细节。

二,错误的分类

1. 致命错误 (Fatal Errors)

  • 特征:

    • 脚本会立即终止执行。
    • 通常是由于严重的逻辑问题或资源不可用引起的。
  • 常见场景:

    • 调用未定义的函数或类。
    • 使用未定义的常量。
    • 内存不足。
  • 示例:

    undefinedFunction(); // 调用未定义的函数
    

    错误信息:

    Fatal error: Uncaught Error: Call to undefined function undefinedFunction()
    

2. 解析错误 (Parse Errors)

  • 特征:

    • 发生在脚本解析阶段,代码未执行。
    • 通常是由于语法错误引起的。
  • 常见场景:

    • 缺少分号、括号或引号。
    • 使用了无效的语法。
  • 示例:

    echo "Hello, world" // 缺少分号
    

    错误信息:

    Parse error: syntax error, unexpected end of file
    

3. 警告 (Warnings)

  • 特征:

    • 不会终止脚本执行,但指示有问题需要解决。
    • 通常是由于逻辑问题或资源问题引起的。
  • 常见场景:

    • 包含不存在的文件。
    • 使用未定义的变量。
    • 函数参数不正确。
  • 示例:

    include("nonexistent_file.php"); // 包含不存在的文件
    

    错误信息:

    Warning: include(nonexistent_file.php): failed to open stream: No such file or directory
    

4. 通知 (Notices)

  • 特征:

    • 非致命的提示,通常不会影响脚本执行。
    • 通常是由于代码不够严谨引起的。
  • 常见场景:

    • 访问未定义的变量。
    • 访问未定义的数组键。
  • 示例:

    echo $undefinedVariable; // 访问未定义的变量
    

    错误信息:

    Notice: Undefined variable: undefinedVariable
    

5. 已弃用错误 (Deprecated Errors)

  • 特征:

    • 提示某些功能或语法在未来版本中将被移除。
    • 不会终止脚本执行。
  • 常见场景:

    • 使用过时的函数或语法。
  • 示例:

    mysql_connect(); // 使用已弃用的MySQL扩展
    

    错误信息:

    Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future
    

6. 用户自定义错误 (User Errors)

  • 特征:

    • 由开发者使用trigger_error()函数手动触发的错误。
    • 可以是E_USER_ERRORE_USER_WARNINGE_USER_NOTICE级别。
  • 常见场景:

    • 在特定条件下触发错误以提醒开发者。
  • 示例:

    if ($value > 100) {trigger_error("Value is too high", E_USER_WARNING);
    }
    

    错误信息:

    Warning: Value is too high
    

7. 异常 (Exceptions)

  • 特征:

    • throw关键字抛出的错误。
    • 可以通过try-catch块捕获和处理。
    • 不会自动终止脚本,除非未被捕获。
  • 常见场景:

    • 自定义错误处理逻辑。
    • 处理外部资源(如数据库、API)的错误。
  • 示例:

    php

    try {throw new Exception("An error occurred");
    } catch (Exception $e) {echo "Caught exception: " . $e->getMessage();
    }
    

    输出:

    Caught exception: An error occurred
    

8. 核心错误 (Core Errors)

  • 特征:

    • 由PHP引擎内部引发的错误。
    • 通常是严重的系统级错误。
  • 常见场景:

    • 内存不足。
    • 文件系统错误。
  • 示例:

    Fatal error: Out of memory (allocated 12345678)
    

9. 编译时错误 (Compile-Time Errors)

  • 特征:

    • 在脚本编译阶段发生的错误。
    • 通常是语法错误或配置问题。
  • 常见场景:

    • 使用了无效的PHP配置。
    • 脚本文件损坏。
  • 示例:

    Compile error: Cannot redeclare class MyClass
    

10. 运行时错误 (Runtime Errors)

  • 特征:

    • 在脚本执行期间发生的错误。
    • 通常是逻辑错误或资源问题。
  • 常见场景:

    • 文件不存在。
    • 数据库连接失败。
  • 示例:

    Warning: Division by zero
    

总结

错误类型特征是否终止脚本
致命错误严重错误,脚本立即终止
解析错误语法错误,脚本未执行
警告非致命错误,脚本继续执行
通知非致命提示,脚本继续执行
已弃用错误提示功能将被移除,脚本继续执行
用户自定义错误由开发者手动触发,脚本可能终止(取决于级别)可能
异常throw抛出,可通过try-catch捕获
核心错误系统级错误,通常严重
编译时错误脚本编译阶段错误
运行时错误脚本执行期间错误可能

三,错误的触发

1. PHP引擎自动触发的错误

PHP引擎会在代码执行过程中自动检测并触发错误。以下是一些常见的场景:

1.1 语法错误(解析错误)
  • 触发条件: 代码中存在语法问题。

  • 示例:

    php">echo "Hello, world" // 缺少分号
    

    错误信息:

    Parse error: syntax error, unexpected end of file
    
1.2 运行时错误
  • 触发条件: 代码逻辑问题或资源不可用。

  • 示例:

    php">echo 10 / 0; // 除以零
    

    错误信息:

    复制

    Warning: Division by zero
    
1.3 致命错误
  • 触发条件: 严重错误导致脚本无法继续执行。

  • 示例:

    php">undefinedFunction(); // 调用未定义的函数
    

    错误信息:

    Fatal error: Uncaught Error: Call to undefined function undefinedFunction()
    

2. 开发者手动触发的错误

PHP提供了trigger_error()函数,允许开发者手动触发错误。可以根据需要触发不同级别的错误。

2.1 触发用户警告 (E_USER_WARNING)
  • 示例:

    php">if ($value > 100) {trigger_error("Value is too high", E_USER_WARNING);
    }
    

    错误信息:

    Warning: Value is too high
    
2.2 触发用户通知 (E_USER_NOTICE)
  • 示例:

    php">if (!isset($variable)) {trigger_error("Variable is not set", E_USER_NOTICE);
    }
    

    错误信息:

    Notice: Variable is not set
    
2.3 触发用户致命错误 (E_USER_ERROR)
  • 示例:

    php">if ($value < 0) {trigger_error("Invalid value", E_USER_ERROR);
    }
    

    错误信息:

    Fatal error: Invalid value
    

3. 异常 (Exceptions)

PHP支持面向对象的异常处理机制,开发者可以通过throw关键字手动抛出异常。

3.1 抛出异常
  • 示例:

    php">function divide($a, $b) {if ($b == 0) {throw new Exception("Division by zero is not allowed");}return $a / $b;
    }try {echo divide(10, 0);
    } catch (Exception $e) {echo "Caught exception: " . $e->getMessage();
    }
    

    输出:

    Caught exception: Division by zero is not allowed
    
3.2 自定义异常类
  • 示例:

    php">class CustomException extends Exception {public function errorMessage() {return "Custom Exception: " . $this->getMessage();}
    }try {throw new CustomException("Something went wrong");
    } catch (CustomException $e) {echo $e->errorMessage();
    }
    

    输出:

    复制

    Custom Exception: Something went wrong
    

4. 使用 assert() 触发错误

assert()函数用于检查某个条件是否为真,如果条件为假,则会触发错误。

4.1 基本用法
  • 示例:

    php">assert(2 + 2 == 5, "Math is broken!");
    

    错误信息:

    Warning: assert(): Math is broken! failed
    
4.2 配置断言行为

可以通过ini_set()配置断言的行为:

  • 禁用断言:

    php">ini_set('assert.active', 0);
    
  • 将断言转换为异常:

    php">ini_set('assert.exception', 1);
    

5. 使用 error_log() 记录错误

error_log()函数可以将错误信息记录到日志文件中,而不是直接显示给用户。

5.1 记录错误到文件
  • 示例:

    php">error_log("An error occurred", 3, "/path/to/error.log");
    

    效果:
    将错误信息写入指定文件。

5.2 发送错误到系统日志
  • 示例:

    php">error_log("System error", 0);
    

    效果:
    将错误信息发送到系统日志。


6. 使用 set_error_handler() 自定义错误处理

开发者可以通过set_error_handler()函数定义自定义的错误处理函数,以替代PHP默认的错误处理机制。

6.1 自定义错误处理函数
  • 示例:

    php">function customErrorHandler($errno, $errstr, $errfile, $errline) {echo "<b>Error:</b> [$errno] $errstr<br>";echo "Error on line $errline in $errfile<br>";
    }set_error_handler("customErrorHandler");echo $undefinedVariable; // 触发自定义错误处理
    

    输出:

    Error: [8] Undefined variable: undefinedVariable
    Error on line 10 in /path/to/file.php
    

总结

触发方式描述示例
PHP引擎自动触发由PHP引擎检测到的错误(如语法错误、运行时错误)echo 10 / 0;
trigger_error()开发者手动触发错误(警告、通知、致命错误)trigger_error("Value is too high", E_USER_WARNING);
异常 (throw)开发者手动抛出异常throw new Exception("An error occurred");
assert()检查条件是否为真,触发错误assert(2 + 2 == 5, "Math is broken!");
error_log()记录错误到日志文件或系统日志error_log("An error occurred", 3, "/path/to/error.log");
set_error_handler()自定义错误处理函数set_error_handler("customErrorHandler");

四,错误显示设置

phpini_635">1. 配置php.ini文件(全局设置)

开发环境配置:

error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
error_log = /path/to/php_error.log

生产环境配置:

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

说明:

  • error_reporting:定义报告的错误级别。E_ALL 显示所有错误(开发),生产环境可调整。
  • display_errors:控制是否在输出中显示错误。
  • display_startup_errors:显示启动期间发生的错误(需在php.ini设置,脚本中无法修改)。
  • log_errorserror_log:启用日志记录并指定路径。

2. 在脚本中动态设置

在PHP文件开头添加(适用于开发调试):

php"><?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// display_startup_errors 无法通过ini_set()设置
ini_set('log_errors', '1');
ini_set('error_log', '/tmp/php_errors.log');

注意: display_startup_errors 必须在php.ini或.htaccess中设置。

3. 使用.htaccess(Apache服务器)

若无法修改php.ini,可在项目根目录的.htaccess中添加:

php_flag display_errors on
php_value error_reporting 32767  # 对应E_ALL
php_flag log_errors on
php_value error_log /path/to/error.log

4. 错误级别常量

  • E_ALL:所有错误和警告(PHP5.4+包含E_STRICT)。
  • E_ERROR:致命运行时错误。
  • E_WARNING:非致命运行时警告。
  • E_NOTICE:运行时提示(可能的问题)。
  • E_STRICT:代码标准化建议(PHP5+)。

5. 环境区分

通过环境变量自动切换配置:

php"><?php
if (getenv('ENVIRONMENT') === 'development') {error_reporting(E_ALL);ini_set('display_errors', '1');
} else {error_reporting(E_ERROR | E_WARNING | E_PARSE);ini_set('display_errors', '0');
}

6. 框架配置

如Laravel或Symfony等框架通常有自己的配置文件和异常处理:

  • Laravel:修改.env中的APP_DEBUG=true并配置config/app.php
  • Symfony:在.env设置APP_ENV=devAPP_DEBUG=1

7. 验证配置

创建测试脚本:

php"><?php
// 未定义变量触发Notice
echo $undefinedVar;
// 调用不存在函数触发Fatal Error
nonExistentFunction();
  • 开发环境应显示错误详情。
  • 生产环境应无错误显示,但日志中记录。

8. 注意事项

  • PHP版本差异:PHP 8.0+中E_ALL包含更多错误类型。
  • 共享主机限制:可能需要使用.htaccess或联系提供商。
  • 安全性:生产环境务必关闭display_errors,避免信息泄露。

总结步骤

开发环境:

  1. 修改php.ini,开启display_errorsdisplay_startup_errors
  2. 设置error_reporting(E_ALL)
  3. 可选:配置错误日志路径。

生产环境:

  1. 关闭display_errorsdisplay_startup_errors
  2. 调整error_reporting减少冗余日志。
  3. 确保log_errors开启并监控日志文件。

五,错误日志设置

phpini__759">1. 基础配置(php.ini 或脚本)

phpini_761">全局配置(php.ini)
; 启用错误日志记录
log_errors = On; 指定日志文件路径(确保目录可写)
error_log = /var/log/php_errors.log; 记录所有错误(开发环境)
error_reporting = E_ALL; 生产环境建议调整错误级别(避免冗余日志)
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
动态脚本设置

在 PHP 文件开头通过代码配置:

php"><?php
// 设置错误报告级别
error_reporting(E_ALL);// 开启错误日志
ini_set('log_errors', 1);// 自定义日志路径(需确保目录权限)
ini_set('error_log', '/path/to/custom_php_errors.log');

2. 环境区分配置

根据开发/生产环境动态调整:

php"><?php
if ($_SERVER['ENVIRONMENT'] === 'production') {ini_set('display_errors', 0);ini_set('log_errors', 1);error_reporting(E_ERROR | E_WARNING | E_PARSE);
} else {ini_set('display_errors', 1);error_reporting(E_ALL);
}

3. 日志文件权限

  • 确保 PHP 进程有写入权限

    # 修改日志文件权限(示例)
    chmod 644 /var/log/php_errors.log
    chown www-data:www-data /var/log/php_errors.log  # Apache/Nginx 用户组
    

4. 日志轮转(避免文件过大)

使用 logrotate 工具定期切割日志(示例配置 /etc/logrotate.d/php):

/var/log/php_errors.log {dailymissingokrotate 30compressdelaycompressnotifemptycreate 644 www-data www-datapostrotate/etc/init.d/apache2 reload > /dev/null  # 或重启 PHP-FPMendscript
}

5. 自定义错误处理

通过 PHP 代码捕获错误并记录到日志:

php"><?php
// 自定义错误处理函数
function customErrorHandler($errno, $errstr, $errfile, $errline) {$logMessage = "[$errno] $errstr in $errfile on line $errline";error_log($logMessage, 3, '/path/to/custom_errors.log');return true; // 阻止默认错误处理
}// 注册自定义错误处理器
set_error_handler("customErrorHandler");// 捕获致命错误(如语法错误)
register_shutdown_function(function() {$error = error_get_last();if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR])) {error_log("[FATAL] {$error['message']} in {$error['file']} on line {$error['line']}", 3, '/path/to/custom_errors.log');}
});

6. 框架集成(如 Laravel)

  • Laravel:通过 .env 文件配置:

    APP_DEBUG=false
    LOG_CHANNEL=stack
    LOG_LEVEL=debug  # 可选:debug, info, notice, warning, error, critical
    

    日志文件默认存储在 storage/logs/laravel.log

  • Symfony:修改 config/packages/prod/monolog.yaml

    monolog:handlers:main:type: fingers_crossedaction_level: errorhandler: nestedpath: "%kernel.logs_dir%/%kernel.environment%.log"
    

7. 验证日志设置

创建测试脚本 test_error.php

php"><?php
// 触发一个警告
echo $undefinedVariable;// 触发一个致命错误(如调用不存在的函数)
nonExistentFunction();

运行后检查日志文件:

tail -f /var/log/php_errors.log

8. 注意事项

  1. 安全性
    • 生产环境务必关闭 display_errorsdisplay_startup_errors
    • 确保日志文件不可通过 Web 访问(避免路径在公共目录)。
  2. 性能优化
    • 高频日志写入可能影响性能,建议异步日志处理(如使用 syslog 或第三方服务)。
  3. 监控
    • 使用工具(如 logwatchSentryELK Stack)监控日志。

总结配置

场景display_errorslog_errorserror_reporting日志路径
开发环境OnOnE_ALL本地文件或终端输出
生产环境OffOnE_ALL & ~NOTICE & ~DEPRECATED安全目录(如 /var/log

六,自定义错误处理

1. 基础错误处理函数

通过 set_error_handler() 接管非致命错误:

php"><?php
// 定义自定义错误处理函数
function customErrorHandler(int $errno,        // 错误级别(如 E_WARNING)string $errstr,    // 错误描述string $errfile,   // 触发错误的文件int $errline       // 错误行号
): bool {// 定义错误类型映射$errorTypes = [E_ERROR             => 'Fatal Error',E_WARNING           => 'Warning',E_PARSE             => 'Parse Error',E_NOTICE            => 'Notice',E_CORE_ERROR        => 'Core Error',E_CORE_WARNING      => 'Core Warning',E_COMPILE_ERROR     => 'Compile Error',E_COMPILE_WARNING   => 'Compile Warning',E_USER_ERROR       => 'User Error',E_USER_WARNING     => 'User Warning',E_USER_NOTICE       => 'User Notice',E_STRICT           => 'Strict',E_RECOVERABLE_ERROR => 'Recoverable Error',E_DEPRECATED        => 'Deprecated',E_USER_DEPRECATED  => 'User Deprecated'];// 获取可读的错误类型名称$errorType = $errorTypes[$errno] ?? 'Unknown Error';// 构建日志消息$logMessage = sprintf("[%s] %s in %s on line %d\n",$errorType,$errstr,$errfile,$errline);// 记录到文件error_log($logMessage, 3, '/var/log/php_custom_errors.log');// 返回 true 表示已处理错误,阻止默认处理return true;
}// 注册自定义错误处理器
set_error_handler('customErrorHandler', E_ALL);

2. 捕获致命错误

由于 E_ERROR 等致命错误无法通过 set_error_handler 捕获,需使用 register_shutdown_function

php"><?php
// 捕获致命错误(如 E_ERROR, E_PARSE)
register_shutdown_function(function() {$lastError = error_get_last();if ($lastError && in_array($lastError['type'], [E_ERROR,E_PARSE,E_CORE_ERROR,E_COMPILE_ERROR,E_USER_ERROR])) {// 调用自定义处理逻辑customErrorHandler($lastError['type'],$lastError['message'],$lastError['file'],$lastError['line']);// 可选:输出友好错误页面echo "<h1>服务器内部错误,请稍后重试</h1>";// 或重定向// header('Location: /500.html');exit;}
});

3. 自定义异常处理

结合异常处理统一管理错误:

php"><?php
// 自定义异常处理器
function customExceptionHandler(Throwable $e): void {$logMessage = sprintf("[Exception] %s in %s on line %d\nStack Trace:\n%s\n",$e->getMessage(),$e->getFile(),$e->getLine(),$e->getTraceAsString());error_log($logMessage, 3, '/var/log/php_exceptions.log');// 生产环境隐藏详细信息if (ini_get('display_errors') === '0') {echo "发生意外错误,请联系管理员";} else {echo "<pre>$logMessage</pre>";}
}// 注册全局异常处理器
set_exception_handler('customExceptionHandler');// 示例:抛出异常
throw new RuntimeException("测试自定义异常");

4. 高级功能扩展

4.1 错误分级处理
php">function customErrorHandler(int $errno, string $errstr, ...) {switch ($errno) {case E_USER_ERROR:// 发送邮件通知管理员mail('admin@example.com', '严重错误', $errstr);break;case E_WARNING:// 记录到单独日志error_log(..., '/var/log/php_warnings.log');break;default:error_log(..., '/var/log/php_others.log');}return true;
}
4.2 错误页面模板
php">function renderErrorPage(int $code, string $message): void {http_response_code($code);include "templates/{$code}.html";exit;
}// 在 shutdown 函数中调用
renderErrorPage(500, '内部服务器错误');
4.3 日志自动分割
php">// 按日期生成日志文件名
$logFile = sprintf('/var/log/php_errors/%s.log',date('Y-m-d')
);
error_log($logMessage, 3, $logFile);

5. 与框架集成

Laravel 自定义处理器

修改 app/Exceptions/Handler.php

php">public function register() {$this->reportable(function (Throwable $e) {// 自定义报告逻辑Log::channel('slack')->error($e->getMessage());});$this->renderable(function (Throwable $e) {return response()->view('errors.custom', [], 500);});
}
Symfony 异常监听器

创建 src/EventListener/ExceptionListener.php

php">class ExceptionListener {public function onKernelException(ExceptionEvent $event) {$exception = $event->getThrowable();// 记录到数据库$this->logToDatabase($exception);// 返回 JSON 响应$event->setResponse(new JsonResponse(['error' => $exception->getMessage()], 500));}
}

6. 验证与调试

测试脚本:

php"><?php
// 触发不同级别错误
trigger_error("测试警告", E_USER_WARNING); // 触发自定义警告
trigger_error("测试致命错误", E_USER_ERROR); // 触发自定义致命错误// 未定义变量触发 Notice
echo $undefinedVar;// 调用不存在的方法
(new stdClass)->nonExistentMethod();

检查日志文件内容:

[Warning] 测试警告 in /path/to/test.php on line 3
[User Error] 测试致命错误 in /path/to/test.php on line 4
[Notice] Undefined variable: undefinedVar in /path/to/test.php on line 7
[Fatal Error] Call to undefined method stdClass::nonExistentMethod() in /path/to/test.php on line 10

7. 注意事项

  1. 错误控制符 @
    使用 @ 抑制错误时,仍需在自定义处理器中检查 error_reporting()

    php">if (!(error_reporting() & $errno)) {return false; // 执行默认处理
    }
    
  2. 恢复默认处理
    临时恢复系统默认处理:

    php">restore_error_handler();
    restore_exception_handler();
    
  3. 性能优化

    • 高频错误处理中避免复杂逻辑
    • 使用 fastcgi_finish_request() 延迟处理非关键错误
  4. 安全日志

    • 避免记录敏感信息(如密码)
    • 对日志文件设置严格权限(chmod 600

通过自定义错误处理,可以实现:

  • 统一错误日志格式
  • 按错误级别分类处理
  • 集成第三方监控服务(如 Sentry、New Relic)
  • 提升用户体验(友好错误页面)
  • 增强系统安全性(隐藏技术细节)

http://www.ppmy.cn/server/176269.html

相关文章

MrRobot靶机详细解答

一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭&#xff0c;且无其它特殊端口&#xff0c;只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…

Unity WebGL IIS报错无法使用

Unity WebGL IIS报错无法使用 原因1&#xff1a;WebGL文件夹无访问权限 右键WebGL文件夹-属性 点击安全-编辑-添加 输入ever点击确定-应用即可

[原创](Modern C++)现代C++的关键性概念: 灵活多变的绑定: std::bind

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …

Uniapp 开发 App 端上架用户隐私协议实现指南

文章目录 引言一、为什么需要用户隐私协议&#xff1f;二、Uniapp 中实现用户隐私协议的步骤2.1 编写隐私协议内容2.2 在 Uniapp 中集成隐私协议2.3 DCloud数据采集说明2.4 配置方式3.1 Apple App Store3.2 Google Play Store 四、常见问题与解决方案4.1 隐私协议内容不完整4.2…

Linux安装部署Elasticsearch8 全过程记录

一、安装 Elasticsearch8 1、下载 访问 Elasticsearch 官方网站&#xff08;Download Elasticsearch | Elastic&#xff09;。 在下载页面找到 Elasticsearch 8 的 Linux 版本&#xff08;.tar.gz 格式&#xff09;下载链接&#xff0c;点击下载。 下载Elasticsearch8&…

射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用

射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用 一、FEM是什么? 射频前端模块(Front-End Module, FEM)是无线通信系统中负责处理射频信号的核心组件。它将多个关键电路集成在一个模块中,包括功率放大器(PA)、低噪声放大器(LNA)、射频开关(Switch)、…

Python - 爬虫-网页抓取数据-工具wget

Python - 爬虫之curl 一、wget "wget" 这个名称来源于 “World Wide Web” 与 “get” 的结合。 wget 是在 Linux 下开发的开放源代码的软件&#xff0c;作者是Hrvoje Niksic&#xff0c;后来被移植到包括 Windows 在内的各个平台上。 wget 是一个下载文件的工具&…

LeetCode BFS层序遍历树

中等 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#…