小蒋同学 发布的文章

72.jpg

从事网管工作的朋友,总会遇到一些局域网补丁更新不统一的问题,但是要每一台机都自行下载这补丁,未免太浪费网络带宽了。虽然可以通过其他计算机共享补丁,但补丁太多,总不能每个都手动点击安装吧?其实可以通过批处理解决。

1、将下载的补丁统一放到一个文件夹 hotfix:

20191124222348.png

2、在文件夹中新建一个 txt 文本文档 update.txt,输入以下内容:

FOR /R %%F IN (*.msu) DO start /wait wusa %%F /quiet /norestart

3、将 update.txt 的后缀名修改为 update.bat:

20191124222855.png

- 阅读剩余部分 -

d52a2834349b033bdaf702ea1cce36d3d539bd87.png

解决办法

在 MySQL 5.7 以上版本中,启用了严格模式。

在配置文件中 /etc/mysql/my.cnf 中找到:

sql-model=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

修改为:

sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

然后重启 MySQL

STRICT_TRANS_TABLES 存储引擎启用严格模式,非法数据值被拒绝

出现此问题的原因

在 MySQL 5.0.2 以前,MySQL 对非法值检查并不严厉,而且为了数据输入还会强制将他们变为合法值。

在 MySQL 5.0.2 以后的版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。

严格模式

如果未使用严格模式,下面的情况是合法的:

- 阅读剩余部分 -

CentOS7 默认使用的是 firewall 作为防火墙

firewall 防火墙

1、查看 firewall 服务状态

systemctl status firewalld

964175-20170704104259159-913218775.png

2、查看 firewall 的状态

firewall-cmd --state

964175-20170704104425769-698844041.png

3、开启、重启、关闭、firewalld.service 服务

停止 firewall

systemctl stop firewalld.service

开启 firewall

systemctl start firewalld.service

禁止 firewall 开机启动

systemctl disable firewalld.service

4、开启、重启、关闭、firewalld.service 服务

开启 firewall

service firewalld start

- 阅读剩余部分 -

20191112215429.png

原因分析

这个问题在 64 位的 PHP 版本中并不存在,因为是在 32 位版本中,以秒计算 PHP 只支持到 2147483648,即:2^31,到 2038-01-19 03:14:08。

有效的时间戳通常从 Fri, 13 Dec 1901 20:45:54 GMT 到 Tue, 19 Jan 2038 03:14:07 GMT(对应于 32 位有符号整数的最小值和最大值)。不是所有的平台都支持负的时间戳,那么日记范围就被限制为不能早于 Unix 纪元。这意味着在 1970 年 1 月 1 日之前的日期将不能用在 Windows,一些 Linux 版本,以及几个其它的操作系统中。不过 PHP 5.1.0 及更新的版本克服了此限制。 —— [ PHP手册 ]

解决办法

如果在32系统PHP 5.1.0之后的版本,可以使用new DateTime解决。代码如下:

将时间戳转为年月日:

$d = new DateTime("@21474836490");
$d->setTimezone(new DateTimeZone("PRC"));
echo $d->format("Y-m-d H:i:s");

将年月日转为时间戳:

$d = new DateTime('2650-07-06 16:21:30');
echo $d->format('U');

如果运行时,遇到如下报错:

WARNING: It is not safe to rely on the system’s timezone settings

- 阅读剩余部分 -

php.jpg

使用 COOKIEJAR 方法

PHP 中 CURL 类在做请求时非常好用,对于COOKIE,CURL类也有很不错的支持。

获得 COOKIE 并存为文件:

// 把 COOKIE 保存至 cookie.txt
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

// COOKIE 文件存放在至 temp 文件夹下的随机文件
$cookie_file = tempnam('./temp','cookie');
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

读取文件并携带 COOKIE:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

先把 COOKIE 保存文件,调用的时候再读取文件。

使用正则表达式

使用 COOKIEJAR 方法,会有两次 IO 操作,对效率有一定的损失。且运行在 BAE/SAE/GAE 等云计算平台时,不支持本地文件写入。使用正则表达式可以解决这些问题。

- 阅读剩余部分 -

JetBrainsLicenseServer 授权服务类

代码如下:

<?php

/**
 * JetBrains许可服务器
 */
class JetBrainsLicenseServer
{
    // 授权给谁
    public $licensee = 'jxx';
    // license 有效时间(单位:毫秒),默认约为7天多(607875500),原厂 server 传递的数值。
    public $prolongationPeriod = 607875500;
    // RSA 私钥
    public $privateKey = <<<Eof
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeO
mxk4YZW9aaV9ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2A
a5FpNNj0BDlf38hOtkhDzz/hkYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN
4QIhAMsJQ3xiJemnJ2pD65iRNCC/Kr7jtxbbBwa6ZFLjp12pAiEA54JCn41fF8GZ
90b9L5dtFQB2/yIcGX4Xo7bCvl8DaPMCIBgOZ+2T33QYtwXTOFXiVm/O1qy5ZFcT
6ng0m3BqwsjJAiEAqna/l7wAyP1E4U7kHqbhKxWsiTAUgLDXtzRbMNHFMQECIQCA
xlpXEPqnC3P8if0G9xHomqJ531rOJuzB8fNtRFmxnA==
-----END RSA PRIVATE KEY-----
Eof;

    public function ping($salt, $isAnswer = false)
    {
        $str = '<PingResponse><message></message><responseCode>OK</responseCode><salt>%s</salt></PingResponse>';
        $out = sprintf($str, $salt);
        return $isAnswer ? $this->writeAnswer($out) : $out;
    }

    public function obtainTicket($salt, $isAnswer = false)
    {
        $ticketId = 1;
        $str      = "<ObtainTicketResponse><message></message><prolongationPeriod>%u</prolongationPeriod><responseCode>OK</responseCode><salt>%s</salt><ticketId>%d</ticketId><ticketProperties>licensee=%s\tlicenseType=0\t</ticketProperties></ObtainTicketResponse>";
        $out      = sprintf($str, $this->prolongationPeriod, $salt, $ticketId, $this->licensee);
        return $isAnswer ? $this->writeAnswer($out) : $out;
    }

    public function prolongTicket($salt, $isAnswer = false)
    {
        $ticketId = 1;
        $str      = '<ProlongTicketResponse><message></message><responseCode>OK</responseCode><salt>%s</salt><ticketId>%d</ticketId></ProlongTicketResponse>';
        $out      = sprintf($str, $salt, $ticketId);
        return $isAnswer ? $this->writeAnswer($out) : $out;
    }

    public function releaseTicket($salt, $isAnswer = false)
    {
        $str = '<ReleaseTicketResponse><message></message><responseCode>OK</responseCode><salt>%s</salt></ReleaseTicketResponse>';
        $out = sprintf($str, $salt);
        return $isAnswer ? $this->writeAnswer($out) : $out;
    }

    public function writeAnswer($str)
    {
        $signature    = $this->sign($str);
        $signatureHex = bin2hex($signature);
        $out          = sprintf("<!-- %s -->\n%s", $signatureHex, $str);
        return $out;
    }

    private function sign($data)
    {
        if (empty ($data)) {
            return null;
        }
        $pkeyid = openssl_get_privatekey($this->privateKey);
        if (empty ($pkeyid)) {
            return null;
        }
        $signature = '';
        $verify    = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
        openssl_free_key($pkeyid);
        return $verify ? $signature : null;
    }

}

index.php 文件

代码如下:

- 阅读剩余部分 -

mount:挂载

挂载本地光盘:

mount /dev/cdrom /mnt

NFS 挂载:

mount -t nfs 192.168.1.2:/a /b

CentOS 挂载 U 盘:

mkdir /mnt/u
mount /dev/sda1 /mnt/u

查看挂载的情况:

df -h

查看某台主机提供的 NFS 服务:

showmount -e 192.168.1.2
nc -v -w 2 192.168.1.2 -z 2049

umount:卸载

umount /mnt

umount /dev/cdrom

umount /dev/cdrom /mnt

注意:

当你的当前路径为 /mnt 下,即在挂载文件的里面时,卸载会失败,提示:Dev is besy。解决办法:退出挂载的目录。

- 阅读剩余部分 -

下载代码:

composer require medivh/oauth dev-master

GitHub 项目地址:https://github.com/medivh-jay/oauth

QQ 登录

<?php
require 'vendor/autoload.php';

// 配置信息
$config = [
    'appid' => '申请的appid',
    'secret' => '申请的appKey',
    'redirect_uri' => '跳转地址',
    'response_type' => 'code',
    'display' => 'default', // 分 default 和 mobile
    'scope' => 'get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,get_tenpay_addr' // 这里可以固定成这个
];

得到认证对象

Driver命名空间下提供了部分认证驱动类,亦可以自己实现,只要继承了OAuthInterface接口, 都可以使用OAuth来调用

$oAuth = \medivh\OAuth\OAuth::register(new \medivh\OAuth\Driver\QQ, $config);

生成登录地址

$oAuth->getAuthorizeURL();

获取access_token

$oAuth->getAccessToken();

获取用户信息

这个方法可以传入两个参数,openid 和 access_token
当服务器保存了用户的 openid 和 access_token 时,可以在用户登录时直接调用这个方法获取用户信息

- 阅读剩余部分 -