css字体图标的制作和使用

在项目开发的过程中,我们会经常用到一些图标。但是我们在使用这些图标时,往往会遇到失真的情况,而且图片数量很多的话,页面加载就越慢。所以,我们可以使用字体图标的方式来显示图标,既解决了失真的问题,也解决了图片占用资源的问题。

一:如何制作字体图标

1:上网下载需要的图标(svg格式),在这里推荐一个网站 “阿里巴巴图标库“,这里面几乎囊括了网站制作中所有需要的图标,而且是免费下载,(格式,大小,颜色都可以自定义)。
2:我们打开“iconmoon”这个网站(当然阿里巴巴图标库这个网站也可以制作),找到右上角 IcoMoon App 点击它 。
3:找到左上角 Import Icons 上传你的svg格式的图标。
4:当图标上传完后,图标的背景是灰色的,这个时候点击你需要的图标(选中后的背景会变白) 。
5:点击页面右下角的 Generate Font 这个按钮,跳转页面后,再点击 Font Download 这个下载按钮,等待下载完成。

二:如何使用字体图标

1:解压下载后的文件夹,我们需要的是fonts文件夹style.css, 将这个文件放入你的项目中,style.css文件中引入了字体文件,所以会有路径,这个时候你在使用的时候要注意路径问题,代码如下:(这里的多种字体文件是为了兼容浏览器)

@font-face {
    font-family: 'icomoon';
    src:  url('../fonts/icomoon.eot?snsrp8');
    src:  url('../fonts/icomoon.eot?snsrp8#iefix') format('embedded-opentype'),
    url('../fonts/icomoon.ttf?snsrp8') format('truetype'),
    url('../fonts/icomoon.woff?snsrp8') format('woff'),
    url('../fonts/icomoon.svg?snsrp8#icomoon') format('svg');
    font-weight: normal;
    font-style: normal;
}

2:在页面中,我们只要给一个元素添加相应的类名就行,因为在style.css中已经将类名对应的图标写好了。

.icon-account:before {
  content: "\e900";
}
.icon-caifu:before {
  content: "\e901";
}
.icon-edit:before {
  content: "\e902";
}

页面中添加如下类似元素:

<span class="icon-account"></span>

这样,我们的页面中就可以显示相应的图标了。

 注意:在某些小米手机上可能有些图标不会显示::

二:使用阿里的iconfont:

1:找到网站,搜索需要的图标

2:将图片加入购物车,点击页面右上角的购物车按钮,将所有图标添加到自定义项目中。

3:在弹出的页面中,点击下载至本地。

curl: (35) SSL connect error的解决方法

之前在服务器需要访问一个外部接口,可是执行程序后一直没结果返回,程序内是使用curl去访问的。想了一下,会不会是连接的问题,于是直接在命令行执行 curl 接口地址,结果直接报错,出现了curl: (35) SSL connect error的错误。搜索了一下解决方法,在此记录一下。

1.先升级nss (Network Security Service, 网络安全服务)

yum update nss

如果没有nss,则需要安装nss服务

yum install nss

2.更新/安装完成后,重启一下php-fpm(因为我的程序是php写的,所以这里需要重启一下)

service php-fpm restart

完成以上两步操作后,便可解决SSL connect error。

🙂

workerman创建wss服务

1.利用apache代理wss

可以利用apache作为wss代理转发给workerman(注意如使用apache代理SSL,则workerman部分千万不要设置ssl,否则将无法连接)。

准备工作: 1、GatewayWorker 监听 8282 端口(websocket协议)
2、已经申请了ssl证书, 放在了/server/httpd/cert/ 下
3、利用apache转发443端口至指定端口8282
4、httpd-ssl.conf 已加载
5、openssl 已安装

启用 proxy_wstunnel_module 模块

LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so 

配置SSL及代理

#extra/httpd-ssl.conf
DocumentRoot "/网站/目录"
ServerName 域名
# Proxy Config
SSLProxyEngine on

ProxyRequests Off
ProxyPass /wss http://127.0.0.1:8282/wss
ProxyPassReverse /wss http://127.0.0.1:8282/wss

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 证书公钥配置
SSLCertificateFile /server/httpd/cert/your.pem
# 证书私钥配置
SSLCertificateKeyFile /server/httpd/cert/your.key
# 证书链配置
SSLCertificateChainFile /server/httpd/cert/chain.pem

测试

// 证书是会检查域名的,请使用域名连接 
ws = new WebSocket("wss://域名/wss");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};

注意:我的服务器是在微软上买的虚拟机,配置完成之后一直报503错误
错误信息:
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

— 查看错误日志


# tail /var/log/httpd/error_log
[Fri Mar 08 16:38:14 2013] [error] (13)Permission denied: proxy: HTTP: attempt to connect to 192.168.168.132:8089 (192.168.168.132) failed
[Fri Mar 08 16:38:14 2013] [error] ap_proxy_connect_backend disabling worker for (192.168.168.132) 


解决方法:

sudo  /usr/sbin/setenforce 0   


网上其他解决方法:

— 猜测SELinux影响
# /usr/sbin/getsebool -a | grep httpd_can_network_connect
httpd_can_network_connect –> off
httpd_can_network_connect_cobbler –> off
httpd_can_network_connect_db –> off

— 把httpd_can_network_connect设置为on
# /usr/sbin/setsebool -P httpd_can_network_connect=1
# /usr/sbin/getsebool -a | grep httpd_can_network_connect
httpd_can_network_connect –> on
httpd_can_network_connect_cobbler –> off
httpd_can_network_connect_db –> off

再次访问 http://www.a.com/ ,一切OK。

当然关闭 SELinux 也行
1)修改 /etc/selinux/config 然后重启
   SELINUX=disabled
2)# /usr/sbin/setenforce 0   实时生效

🙂


使用winrar将debug/release下文件打包成一个可直接运行exe文件

最新想把我的虚拟币交易网站做一个桌面应用程序,但是本人只会PHP,所以就想看看有没有什么简单的方法可以做。

  1. 选择debug/release下所有文件,鼠标右键“添加到压缩文件…”
  2. 常规->压缩选项->创建自解压格式压缩文件,可将默认文件名重命名
  3. 高级->自解压选项

3.1 设置->提取后运行程序(填写exe文件名) 
3.2 模式->勾选解包到临时文件夹 
3.3 模式->安静模式->全部隐藏 
3.4 更新->更新方式->解压并更新文件 
3.5 更新->覆盖方式->覆盖所有文件 
3.6 文本和图标,可选

参考:https://blog.csdn.net/harvic880925/article/details/27675073

linux磁盘空间用满的处理方法

磁盘空间不足会出现各种情况:
重启php-fpm报错:

unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) 

linux下空间满可能有两种情况

可以通过命令
df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block)
df -i  查看索引节点的占用(Inodes)

磁盘块和索引节点其中之一满,都会导致无法创建文件,提示磁盘空间已满。
所以请注意,查看磁盘还有空间,但是创建文件提示空间满,可能是inodes节点已满
通过命令:find / -size +100M |xargs ls -lh
列出系统内大于100M的文件
du -h –max-depth=1
查看当前目录内文件夹的大小
可以两种方式都测试下,有些时候,占用了大量空间的其实是系统日志或业务附件等小文件,
所以根据文件大小去查找不一定能查出正在占用硬盘空间的【目录】或文件,建议使用第二种


日志文件较大
web访问日志,建议做定时任务日志切割,以天为单位做压缩备份(可以通过脚本实现),保留一定时间以备查看,有需要可以做日志分析。
以一键安装包的环境为例,/alidata/log/ 目录下是是日志文件,可以检查文件大小是否占满磁盘使用,通常,access目录下文件为访问日志,error为错误日志。如磁盘占慢,这些日志又不重要,那么可以做清空处理,方法1,可以rm 删除掉,2 echo”” >access.log 

大量小文件引起
由于业务需求,产生大量小文件,需要考虑新增加磁盘或者使用oss存储服务
http://help.aliyun.com/all/11108271.html?spm=5176.383377.1996834802.6.7hPoRe
可以根据以上的步骤进行排查,如果仍然无法解决,可以提交售后工单,服务器账号口令信息等,进行排查。

注意:
当我把apache的日志文件都删除之后过了几天磁盘又满了,然后查看文件,并没有大文件存在,那是什么占用了磁盘呢?
解答:
在apache/tomcat服务在运行状态下,清空了运行服务的日志,从而导致了/dev/sda2 满了的问题。一般情况下,大多数服务(包括脚本)在运行时,是不能删除当前正在写入的日志文件的。
原理分析:
1. 当前access.log日志正在被apache进程占用。
2. 通过rm命令删除access.log,实际只删除了文件名(该日志文件应用记数不为0,因此空间不会被释放)。
3. 通过rm命令删除了access.log后,apache依然写日志到access.log中,当开启apache进程时,已经通过access.log定位到该文件的inode了,就是说再写日志是不通过access.log,因此即使删除了access.log,apache依然写日志到access.log所在的inode节点,所以导致硬盘空间增加。
4. 因为删除了access.log,所以我们就找不到该文件了,du也查不到,就会出现硬盘满了但看不到究竟是哪些文件占用的。
(写的不甚详细,不明白的大家再google下。)
解决方法:
重启该日志文件的相关服务或程序,如:为apache日志文件则重启apache(如下图,重启后才硬盘空间占用正常)。

安装Nginx支持php-fpm

> yum install -y nginx
> vi /etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name 服务器的ip地址 localhost;

    location / {
        root /usr/share/nginx/html/;
        index index.php  index.html  index.htm;
    }

    location ~ \.php$ {
        root /usr/share/nginx/html/;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME        $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
> systemctl restart nginx
> vi /usr/share/nginx/html/index.php
<?php
	echo phpinfo();
?php>

访问ip地址 出现phpinfo()的内容

🙂

安装PHP7.2

安装php7.2之前先卸载了5.4版本,可以看我的上一篇卸载PHP5.4

> yum install epel-release [安装所需的依赖]
> yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm [配置CentOS 7.0 yum源]
> yum install yum-utils
> yum-config-manager --enable remi-php72 [查看php72的扩展]
> yum update [更新yum源]
> yum search php72 | more [查看当前的yum中有哪些php扩展]
> yum search php72 | egrep 'fpm|gd|mysql|memcache' [匹配查看某种源的包名]
> yum install php72 [安装php72]
> yum install php72-php-fpm php72-php-gd php72-php-json php72-php-mbstring php72-php-mysqlnd php72-php-xml php72-php-xmlrpc php72-php-opcache [安装php的扩展]
> php72 --version [查看php的版本]
> php72 -m [查看php的扩展]
> ps aux | grep php-fpm [查看php-fpm的启动情况]
> systemctl restart php72-php-fpm.service [启动php-fpm的服务 重启:restart 停止:stop]
> systemctl enable php72-php-fpm.service [添加php为开启启动项]
> systemctl status php72-php-fpm.service [查看php-fpm的状态]

php7.2安装之后我再安装nginx ,可以看我的下一篇安装Nginx支持php-fpm

🙂

卸载PHP5.4

环境:CentOS7,PHP5.4

最近想安装PHP7.2,所以卸载原来的PHP5.4版本

因为安装的时候是用yum,所以也使用yum卸载

> yum remove php 
> php -v

但是还是会看到版本信息,所以必须强制删除, 使用下面命令查看全部php软件包

> rpm -qa|grep php 
//提示如下
php-pdo-5.1.6-27.el5_5.3
php-mysql-5.1.6-27.el5_5.3
php-xml-5.1.6-27.el5_5.3
php-cli-5.1.6-27.el5_5.3
php-common-5.1.6-27.el5_5.3
php-gd-5.1.6-27.el5_5.3

注意卸载要先卸载没有依赖的
pdo是mysql的依赖项;common是gd的依赖项;

> rpm -e php-common-5.4.16-46.el7.x86_64 

由于我先执行了rpm -e php-5.4.16-46.el7.x86_64
再执行rpm -e php-common-5.4.16-46.el7.x86_64
报错,信息如下:
warning: /etc/php.ini saved as /etc/php.ini.rpmsave

> hash -r  

再用

 > php -v 

就会发现没有版本信息提示了,成功卸载

🙂

令人困惑的strtotime

本文地址: http://www.laruence.com/2018/07/31/3207.html 转载请注明出处

经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…

这不, 刚刚就有人在微博上又问我:

"鸟哥,今天是2018-07-31 执行代码: "
> date("Y-m-d",strtotime("-1 month"))
"怎么输出是2018-07-01? "

好的吧, 虽然这个问题看起来很迷惑, 但从内部逻辑上来说呢, 其实是”对”的, 你先别着急哈, 让我慢慢讲:

我们来模拟下date内部的对于这种事情的处理逻辑:

1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.

2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:

> var_dump(date("Y-m-d", strtotime("2017-06-31"))); 
//输出2017-07-01

也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论:

 
> var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2017-03-31"))));
//输出2017-03-03
> var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2017-08-31"))));
//输出2017-10-01
> var_dump(date("Y-m-d", strtotime("next month", strtotime("2017-01-31"))));
//输出2017-03-03
> var_dump(date("Y-m-d", strtotime("last month", strtotime("2017-03-31"))));
//输出2017-03-03

那怎么办呢?

从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:

 
> var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2017-03-31"))));
//输出2017-02-28
> var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2017-08-31"))));
//输出2017-09-01
> var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2017-01-31"))));
//输出2017-02-01
> var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2017-03-31"))));
//输出2017-02-28

那如果是5.3之前的版本(还有人用么?), 你可以使用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅.

现在, 搞清楚了内部原理, 是不是就不慌了? 

🙂