pecl 工具使用代理进行下载安装扩展
pecl 是 PHP 安装扩展的一种工具,但是 pecl 的资源处于境外,很容易下载失败,所以得通过魔法工具来解决。
设置代理
pear config-set http_proxy http://172.26.160.1:10809取消代理
pear config-set http_proxy "" pecl 是 PHP 安装扩展的一种工具,但是 pecl 的资源处于境外,很容易下载失败,所以得通过魔法工具来解决。
pear config-set http_proxy http://172.26.160.1:10809pear config-set http_proxy "" 最近接到反馈,说网站无法在电脑微信上打开,提示 页面错误!请稍后再试~,开启调试模式后发现报 Undefined offset: 1 in Lang.php line 204。
经过排查,应该是微信浏览器近期进行了更新,给服务器传递了 Accept-Language: *。
然后框架的多语言自动侦测逻辑不严谨,导致了此次错误。
出错文件:library/think/Lang.php
出错代码:
if (isset($_GET[self::$langDetectVar])) {
// url 中设置了语言变量
$langSet = strtolower($_GET[self::$langDetectVar]);
} elseif (isset($_COOKIE[self::$langCookieVar])) {
// Cookie 中设置了语言变量
$langSet = strtolower($_COOKIE[self::$langCookieVar]);
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
// 自动侦测浏览器语言
preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$langSet = strtolower($matches[1]);
$acceptLangs = Config::get('header_accept_lang');
if (isset($acceptLangs[$langSet])) {
$langSet = $acceptLangs[$langSet];
} elseif (isset(self::$acceptLanguage[$langSet])) {
$langSet = self::$acceptLanguage[$langSet];
}
}关键定位:
// 自动侦测浏览器语言
preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
// 这里没有判断 preg_match 是否匹配到内容,直接就使用 $matches[1] ,然后就报错了
$langSet = strtolower($matches[1]);解决办法很简单,先判断 preg_match,再执行后续代码。
调整后代码:
if (isset($_GET[self::$langDetectVar])) {
// url 中设置了语言变量
$langSet = strtolower($_GET[self::$langDetectVar]);
} elseif (isset($_COOKIE[self::$langCookieVar])) {
// Cookie 中设置了语言变量
$langSet = strtolower($_COOKIE[self::$langCookieVar]);
} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches)) {
// 自动侦测浏览器语言
$langSet = strtolower($matches[1]);
$acceptLangs = Config::get('header_accept_lang');
if (isset($acceptLangs[$langSet])) {
$langSet = $acceptLangs[$langSet];
} elseif (isset(self::$acceptLanguage[$langSet])) {
$langSet = self::$acceptLanguage[$langSet];
}
}目前主要发现影响 ThinkPHP 5.0 和 5.1 版本,已向官方提交修复,但这两个版本已停止更新,不确定是否会合并。
PHP 8.3 发布了,当然是第一时间上啦。项目用到了redis,但 pecl 官网上没提供对应的 dll 文件,只能自己编译了。
| 命令 | 说明 |
|---|---|
| queue:failed | 列出所有失败的队列作业 |
| queue:failed-table | 创建记录失败的队列作业表 |
| queue:flush | 删除所有失败的队列作业 |
| queue:forget | 删除一个失败的队列作业 |
| queue:listen | 监听执行指定的队列 |
| queue:restart | 在执行当前作业后重新启动队列工作守护进程 |
| queue:retry | 重试失败的队列作业 |
| queue:table | 为队列作业数据库表创建迁移 |
| queue:work | 处理队列中的下一个作业 |
列出所有失败的队列作业
php think queue:failed+----+------------+---------+--------------------------------------------------+---------------------+
| ID | Connection | Queue | Class | Fail Time |
+----+------------+---------+--------------------------------------------------+---------------------+
| 37 | redis | default | app\common\job\TaskAttach@updateOtherSubsidy | 2023-07-07 17:19:43 |
| 36 | redis | default | app\common\job\TaskAttach@updateOtherSubsidy | 2023-07-07 16:15:26 |创建记录失败的队列作业表,表名为 queue.php 配置文件中 failed.table 设置的名称。
依赖 think-migration 库,如果没安装,则会提示 Install think-migration first please,可使用 composer require topthink/think-migration 命令安装。
php think queue:failed-tableMigration created successfully!创建队列作业表,表名为 queue.php 配置文件中 connections.database.table 设置的名称。
php think queue:table删除所有失败的队列作业记录
php think queue:flushAll failed jobs deleted successfully!删除一个失败的队列作业记录
| 名称 | 必须 | 说明 |
|---|---|---|
| id | 是 | 队列作业记录的ID |
php think queue:forget 123All failed jobs deleted successfully!重新发布失败的作业
| 名称 | 必须 | 说明 |
|---|---|---|
| id | 是 | 队列作业记录的ID |
重新发布指定作业
php think queue:retry 123 124 125重新发布所有作业
php think queue:retry all监听执行指定的队列
| 名称 | 必须 | 说明 |
|---|---|---|
| connection | 否 | 队列的连接名称,默认为queue.php 中的 default 配置 |
| 名称 | 必须 | 默认 | 说明 |
|---|---|---|---|
| --queue | 否 | null | 要监听的队列名称,默认为连接配置中的queue |
| --delay | 否 | 0 | 延迟失败作业的时间(单位:秒) |
| --memory | 否 | 128 | 作业内存限制(单位:M) |
| --timeout | 否 | 60 | 作业执行时间限制(单位:秒) |
| --sleep | 否 | 3 | 获取作业前的等待时间(单位:秒) |
| --tries | 否 | 0 | 失败重试次数,超过该次数则变为失败作业,不再执行(单位:次) |
php think queue:listen database --queue=default --delay=10 --memory=128 --timeout=60 --sleep=3 --tries=0处理队列中的下一个作业
| 名称 | 必须 | 说明 |
|---|---|---|
| connection | 否 | 队列的连接名称,默认为queue.php 中的 default 配置 |
| 名称 | 必须 | 默认 | 说明 |
|---|---|---|---|
| --queue | 否 | null | 要监听的队列名称,默认为连接配置中的queue |
| --once | 否 | 只处理队列中的下一个作业 | |
| --delay | 否 | 0 | 延迟失败作业的时间(单位:秒) |
| --force | 否 | 即使在维护模式下也强制工作人员运行 | |
| --memory | 否 | 128 | 作业内存限制(单位:M) |
| --timeout | 否 | 60 | 作业执行时间限制(单位:秒) |
| --sleep | 否 | 3 | 获取作业前的等待时间(单位:秒) |
| --tries | 否 | 0 | 失败重试次数,超过该次数则变为失败作业,不再执行(单位:次) |
php think queue:work database --queue=default --once --delay=10 --force --memory=128 --timeout=60 --sleep=3 --tries=0 早上接到运营的消息,说客户反馈网站通过搜索引擎打开时,显示为赌博网站。跟以往的情况不同,这次怎么都找不到被篡改的 PHP 文件,最后发现是配置文件被篡改。