2020年05月
2020-5-6 周三
停止 crontab
的异常进程
有一个异常进程,使用 kill -9
杀不掉,杀掉后他自动会开一个新的 PID
,资源占用 100%,初步排查是 crontab
里每月 1/16 号执行的定时任务
可以用如下命令进行重新启动 crontab
停止服务:
/etc/init.d/cron stop
启动服务:
/etc/init.d/cron start
然后异常进程就消失了,这只是临时解决一下,具体问题应该还是要看代码中的异常
2020-5-7 周四
Sentry 邮箱配置
用 QQ
域名邮箱配置了好久都不成功,换成了 126
一次就成功了
QQ 邮箱会报这个错:
我是在 docker env
里配置的,用的 tls
这样配置也可以:
SENTRY_SERVER_EMAIL = 'aaa@126.com' SENTRY_EMAIL_USER = 'aaa@126.com' SENTRY_EMAIL_PASSWORD = 'NABGTAAAAAAYACAM' SENTRY_EMAIL_HOST = 'smtp.126.com' SENTRY_EMAIL_PORT = 25 SENTRY_EMAIL_USE_TLS = true
有看到其他人不在 env
中配置也行:Sentry 搭建
2020-5-8 周五
Request 可能存在的坑
$user_ids = $request->input('user_ids', []);
上面这样,前端传 null
的时候,收到的还是 null
像下面这样写会安全一些
$user_ids = $request->input('user_ids') ?? [];
2020-5-11 周一
表达式引擎
// TODO
2020-5-12 周二
Sentry Features
Sentry 安装完成之后发现有一些特性和说好的不一样,这是因为没有配置的问题
SENTRY_FEATURES = { # Enables user registration. "auth:register": True, # Enable advanced search features, like negation and wildcard matching. "organizations:advanced-search": True, # Enable obtaining and using API keys. "organizations:api-keys": False, # Enable explicit use of AND and OR in search. "organizations:boolean-search": False, # Enable creating organizations within sentry (if SENTRY_SINGLE_ORGANIZATION # is not enabled). "organizations:create": True, # Enable the 'discover' interface. "organizations:discover": False, # Enable attaching arbitrary files to events. "organizations:event-attachments": False, # Allow organizations to configure built-in symbol sources. "organizations:symbol-sources": True, # Allow organizations to configure custom external symbol sources. "organizations:custom-symbol-sources": True, # Enable the events stream interface. "organizations:events": False, # Enable events v2 instead of the events stream "organizations:events-v2": False, # Enable multi project selection "organizations:global-views": False, # Turns on grouping info. "organizations:grouping-info": False, # Lets organizations upgrade grouping configs and tweak them "organizations:tweak-grouping-config": True, # Lets organizations manage grouping configs "organizations:set-grouping-config": False, # Enable incidents feature "organizations:incidents": False, # Enable integration functionality to create and link groups to issues on # external services. "organizations:integrations-issue-basic": True, # Enable interface functionality to synchronize groups between sentry and # issues on external services. "organizations:integrations-issue-sync": True, # Enable interface functionality to recieve event hooks. "organizations:integrations-event-hooks": False, # Special feature flag primarily used on the sentry.io SAAS product for # easily enabling features while in early development. "organizations:internal-catchall": False, # Enable inviting members to organizations. "organizations:invite-members": True, # Enable org-wide saved searches and user pinned search "organizations:org-saved-searches": False, # Enable the relay functionality, for use with sentry semaphore. See # https://github.com/getsentry/semaphore. "organizations:relay": False, # Sentry 10 - multi project interfaces. "organizations:sentry10": True, # Enable basic SSO functionality, providing configurable single sign on # using services like GitHub / Google. This is *not* the same as the signup # and login with Github / Azure DevOps that sentry.io provides. "organizations:sso-basic": True, # Enable SAML2 based SSO functionality. getsentry/sentry-auth-saml2 plugin # must be installed to use this functionality. "organizations:sso-saml2": True, # Enable Rippling SSO functionality. "organizations:sso-rippling": False, # Enable functionality to specify custom inbound filters on events. "projects:custom-inbound-filters": False, # Enable data forwarding functionality for projects. "projects:data-forwarding": True, # Enable functionality to discard groups. "projects:discard-groups": False, # DEPRECATED: pending removal "projects:dsym": False, # Enable functionality for attaching minidumps to events and displaying # then in the group UI. "projects:minidump": True, # Enable functionality for project plugins. "projects:plugins": True, # Enable functionality for rate-limiting events on projects. "projects:rate-limits": True, # Enable functionality for sampling of events on projects. "projects:sample-events": False, # Enable functionality to trigger service hooks upon event ingestion. "projects:servicehooks": False, # Use Kafka (instead of Celery) for ingestion pipeline. "projects:kafka-ingest": False, # Don't add feature defaults down here! Please add them in their associated # group sorted alphabetically. }
上面是目前 Sentry 支持的特性配置,具体查看 GitHub
修改方式是在 sentry.conf.py
文件中添加配置:
SENTRY_FEATURES['projects:custom-inbound-filters'] = True # SSO ON our OFF SENTRY_FEATURES['organizations:sso'] = True SENTRY_FEATURES['organizations:sso-saml2'] = True SENTRY_FEATURES['organizations:sso-rippling'] = True
2020-5-13 周三
Pandas to_csv
使用 Pandas
的 to_csv
函数导出结果后,用 Excel
打开会乱码
加上 encoding
选项后依然没有生效
result.to_csv('result.csv', encoding="utf-8")
正确的做法是把 utf-8
改成 utf_8_sig
result.to_csv('result.csv', encoding="utf_8_sig")
有可能是版本问题,好像 pandas 1.x 版本就没有这个问题了
2020-5-14 周四
Redis 缓存
缓存穿透
这是由于进行 Redis Key 的查询, 如果不存在 Value 的话,会在数据库中查询,这个并发请求量一旦突然很大的话,会突然加重数据库的压力
解决:这种情况可能是恶意穿透,可以由前端进行一定的风险控制
缓存雪崩
当缓存服务器重新启动,或者大量的缓存都集中在同一个时间段内失效的话,那么这时候会给数据库系统带来很大的压力
解决:连接数限制,错误阈值限制,超时处理,缓存失效均匀分布,前端永不失效和后端主动更新
Elastic Docker
Elastic 是用的官方自己维护的镜像版本:
https://www.docker.elastic.co/
2020-5-15 周五
查看 Linux 的守护进程
ps -eo ppid,pid,sid,stat,tty,comm | awk '{ if ($2 == $3 && $5 == "?") {print $0}; }'
查看某个进程的状态
先可以使用 top
命令把进程们都列出来
cat /proc/{PID}/status
2020-5-18 周一
Linux 文件目录
bin 二进制可执行文件目录
boot 系统引导
dev 设备
etc 系统配置
home 用户文件的根目录
lib 程序运行所使用的共享库以及内核模块
proc 虚拟文件系统,当前内存的映射
root 超级用户目录
sbin 二进制可执行文件目录(root 用户)
tmp 临时文件
usr 系统应用程序
var 程序运行时需要改变数据的文件
2020-5-19 周二
导出 Excel 设定列宽
需要 implements
WithEvents
class DataExport implements FromCollection, WithMapping, WithHeadings, WithTitle, WithStrictNullComparison, WithEvents { public function __construct($start, $end, $userIds, $headers, $type) { // ... } public function collection() { // ... } public function map($row): array { // ... } public function title(): string { // ... } public function headings(): array { // ... } public function registerEvents(): array { return [ AfterSheet::class => function (AfterSheet $afterSheet) { $columns = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; foreach ($columns as $column) { $afterSheet->sheet->getDelegate()->getColumnDimension($column) ->setWidth(15); } } ]; } }
2020-5-20 周三
Laravel 关联查询排序
可以使用 withCount
的方法
->withCount(['user_posts', 'user_address']) ->orderBy('user_posts_count', 'DESC')
2020-5-21 周四
Model 问题
Model
中的静态方法的名称不要和数据库中的字段名重复
否则在查询/取数据的时候会出现问题
2020-5-22 周五
Dingo 路由冲突
{"message":"sha1() expects parameter 1 to be string, object given", "status_code":500,"debug": {"line":565, "file":"F:\\develop\\tabllapi\\vendor\\dingo\\api\\src\\Routing\\Router.php","class":"ErrorException","trace":["#0 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'sha1() expects ...', 'F:\\\\develop\\\\tabl...', 565, Array)","#1 ... ...
路由冲突了
原先设置成了 Dingo
接管所有路由了
解决方案:把 Dingo
的路由设置和 admin 的路由设置区分开即可
2020-5-25 周一
Flask 自动重启
需要当修改了文件的时候自动重启
开启 DEBUG
模式可以自动重启:
DEBUG = True
没开 DEBUG
模式设置 RELOADER
也可以自动重启:
USE_RELOADER = True
2020-5-26 周二
单元测试报错
1) Tests\Feature\ExampleTest::testBasicTest RuntimeException: No application encryption key has been specified.
原因是单元测试连接的数据库的 APP_KEY 是用:
php artisan key:generate
随机生成的,这和原先测试数据库中的密钥不同
2020-5-27 周三
引入 dcat laravel admin 后 ci 报错
错误:
Fatal error in tests/Feature/Api/CalendarControllerTest.php: PHP Fatal error: Uncaught ReflectionException: Class config does not exist in /home/gitlab-runner/builds/F_P9j3J3/0/Tabll/tabllapi/vendor/laravel/framework/src/Illuminate/Container/Container.php:805 Stack trace: #0 /home/gitlab-runner/builds/F_P9j3J3/0/Tabll/tabllapi/vendor/laravel/fram ework/src/Illuminate/Container/Container.php(805): ReflectionClass->__construct('config')
解决方法:
<filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> <exclude> <directory suffix=".php">./app/Admin</directory> </exclude> </whitelist> </filter>
在 phpunit.xml
文件中加上 exclude
,排除 Admin
相关代码
2020-5-28 周四
Larave pluck
多层
使用 with
查询了两层关联的时候
->with([ 'companions.user:id,name,username,mobile' ])
在 Resource
里面这样取:
'companions' => $this->companions->pluck('user.name'),
2020-5-29 周五
日期格式
有一些小区别:
Y
是年份,如 2020
y
是末位年份,如 20
m
是月份,如 02
n
是月份,如 2