PHP imagepng 输出损坏的图片问题解决

问题发现

我和同事的两套本地开发环境,相同的一段返回随机验证码图片的代码,验证码代码参考的是 php实现的Captcha验证码类实例 里的代码。在同事的电脑上调用,出来的是裂开的图片,在我的电脑上调用,出来的就是正常的图片,这是为什么呢?解决这个问题花费了三四个小时,记录一下过程。

解决过程

因为代码上没有区别,所以开始怀疑环境问题,两台开发机都是相同型号,配置也相同,PHP 运行在 docker 容器下,检查 PHP 版本相同。

查了一下 PHP 文档,怀疑可能是因为什么特性没有启用,测试以下代码:

test.php
1
2
3
4
5
<?php
if (imagetypes() & IMG_PNG) {
echo "PNG Support is enabled";
}
?>

测试结果 imagetypes() & IMG_PNG 的值大于零,看起来两个环境都是支持 PNG 图的。

阅读更多

体验 Azure 应用服务:可以白嫖的 OneIndex 空间

之前已经写过一篇如何使用 Azure DevOps 实现自动部署 Hexo 的文章,这个月,受疫情影响在家,就把自己的 Azure 新用户体验账号开了,获得了限时 1 个月 200 刀的体验额度。

之后研究中发现了 Azure 提供的应用服务还挺好用的,当然重点是——可以白嫖!

免费套餐当然是有限制的——

  1. 配置上,1G内存,每天最多1小时CPU时间(计算量不大24小时开着没问题)
  2. 330M 左右的出站流量
  3. 无法绑定自定义域名,只能使用 *.azurewebsites.net
  4. 没有数据库,可以另建 MySQL,但不是免费的,想搭建 Typecho 和 Wordpress 的还是别想了
  5. 无国内节点,可选日本节点
  6. 需要 Azure 账号,也就是需要 VISA 或者 Master 卡

我们可以在上面部署 .Net Core, ASP.NET, Java, Node.js, PHP, Python, Ruby 语言的项目。

之前有访问过别人的 PyOne,发现下载速度还挺快,就一直想用 OneDrive 搭建一个自己的网盘,机会来了。

主流的 OneDrive 第三方 Directory Index,有老牌的 oneindex,还有后起之秀 PyOneOLAINDEX,虽然 Azure 的 PHP 环境可以自动识别 composer 安装依赖,也支持执行部署脚本、执行 php 命令,但是由于 PyOne 还要依赖 Python 环境,OLAINDEX 还要依赖 Nginx,别想了,搭建不了。

当我尝试在 Azure 应用服务上面部署 OLAINDEX 时,在执行安装脚本 php artisan od:install 时出错,遇到的错误是 SQLite General error: 5 database is locked,由于完全不会 PHP,就放弃了。

好了,就决定是 OneIndex 了!高手看到这里基本就可以自己去尝试了,下面是我的步骤。

阅读更多

Netlify 初体验——真就是几秒部署呗

Hexo 部署依赖 node 环境就让很多专注写作的人放弃这个框架,劝退萌新,并且难以随时随地写作。好在其 CLI 比较简单,前面我也介绍过如何利用免费的微软 Azure 持续部署博客

不过今天看 Ant Design Pro 官网的 footer 的时候发现了 Netlify 这个东西,试了以后,强烈安利!!!

来到它的首页,里面有这么几段话——

大字:

在几秒钟内部署您的网站*

小字:

*不,这里没有陷阱。
真的只需点击几下。

嗯……嗯?哼哼……有免费套餐,试试吧!

  1. 首先用 GitHub 授权登录
  2. 选择 New site from Git
  3. 选择项目托管的位置:GitHub
  4. 授权 GitHub 访问私有项目
  5. 输入构建命令……等等,你怎么给我自动输入了啊喂?
  6. 点 Deploy site

然后构建就启动了,1分钟后我的站点就到了 Netlify 上。

当时我的表情是 (⊙o⊙)?

我连部署命令都没打;
我连环境都没提供;
我甚至全程没有摸一下键盘……(你要问我注册登录不摸键盘?真就没摸,GitHub 是已登录的状态,点一下授权按钮就登录了。)
敢情 hexo 的部署配置,Azure 的 CICD 都白写了呗?

……

😓,流批……

这个网站还支持绑定域名,自动申请 HTTPS,配 Web Hook(就不用手动点部署了),还有很多很多真 · 自动化的功能,大家一起发掘吧!

Bitnami MariaDB 重启失败记录

自动部署的 Magento 附带的 MariaDB 镜像第一次启动能够成功,但 stop 之后就无法再次启动。启动命令 docker-compose up -d,重启命令 docker-compose restart

关键 log:

1
2
3
InnoDB: Assertion failure in file /bitnami/blacksmith-sandox/mariadb-10.2.28/storage/innobase/dict/dict0dict.cc line 1467
InnoDB: Failing assertion: table->can_be_evicted
[ERROR] mysqld got signal 6 ;

详细的 stdout 如下——

阅读更多

Windows 下通过 Vagrant 简单搭建 Magento

准备软件

  1. VirtualBox 5.2.8
  2. Vagrant 2.0.1

官网下载安装,比我的新即可,安装路径自选。

创建 Vagrantfile

新建文件夹并创建 Vagrantfile 放在里面,我配置的环境是 Ubuntu 16.04,内存8G,可以换成自己熟悉的环境。
映射端口80,443(Web),3306(数据库),9200,9300(搜索引擎)。

Vagrantfile
1
2
3
4
5
6
7
8
9
10
11
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "forwarded_port", guest: 443, host: 443
config.vm.network "forwarded_port", guest: 3306, host: 3306
config.vm.network "forwarded_port", guest: 9200, host: 9200
config.vm.network "forwarded_port", guest: 9300, host: 9300
config.vm.provider "virtualbox" do |vb|
vb.memory = "8192"
end
end
阅读更多
纯本地搭建 EFK 管理远程服务器日志

纯本地搭建 EFK 管理远程服务器日志

项目staging环境日志难以搜索,计划搭建EFK管理日志,但是EFK内存消耗太大,再新增云服务器不划算,打算搭建在本地(16G内存)。

什么是 EFK

EFK不是一个软件,而是一套解决方案,并且都是开源软件,其中 ELasticsearch 负责日志保存和搜索,FileBeat 负责收集日志,Kibana 负责界面。

  1. Elasticsearch
    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  2. FileBeat
    Filebeat 隶属于 Beats,搜集日志数据并上载到 ElasticsearchLogstashRedis 等平台。
  3. Kibana
    Kibana 提供日志分析的友好 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

环境现状

  1. 本地环境:Windows 10,Intel(R) Core(TM) i5-7500 CPU,内存 16G
  2. 远程环境:SUSE Linux Enterprise Server 11,可用内存不足 1G
  3. 本地可以启虚拟机,但没钱买额外的云服务器。

最初想法

目前有3种思路:

  1. 本地启动Elasticsearch、Kibana、Filebeat,服务器启动FTP,并映射到本地网络驱动器,Filebeat配置从网络驱动器读取log。
  2. 本地启动Elasticsearch、Kibana,用反向代理工具FRP暴露Elasticsearch的9200端口到公网(注意配置鉴权),远程启动Filebeat,输出到本地的Elasticsearch。
  3. 本地启动Elasticsearch、Kibana,Logstash,远程启动Filebeat、Redis,远程的Filebeat输出到Redis,本地的Logstash从Redis上读取,转发给Elasticsearch。
阅读更多
Vagrant 修改 box 保存位置 & 虚拟机位置到非系统盘

Node.js 实现 HTTP 访问日志

越来越咸,两个月没发文章了,刚刚换项目了,开始学一些新的知识。
近来调试 webhook 和 http callback 比较多,想要使用 Node.js 写一个接收所有 HTTP 请求,并把请求头和请求体写进log,返回 200 OK 的 service。

其实就是简单的 access.log 啦。
其实就是刚学习 Node.js 写的 demo 啦。
啊这是很简单你不要拆穿啦。

这是输出的 log 的样子,优化了可读性,时间、method、path、URL参数(Query)、请求头(Header)、请求体(Body)都详细记录了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
info: 2019-07-25 18:04:36
POST /v1.0/standard
Query:
search: keyword
Header:
cache-control: no-cache
postman-token: f4103067-4b07-447d-9fab-f09a75b6ddda
content-type: application/json
user-agent: PostmanRuntime/3.0.11-hotfix.2
accept: */*
host: localhost:4000
accept-encoding: gzip, deflate
content-length: 209
connection: keep-alive
Body:
appId: XXX
data:
userId: 123
requestId: 456
timestamp: 0
阅读更多