mysql

mysql 查询数据库是否存在 sql 语句

 废话不多说 直接上sql

SELECT * FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = ‘数据库名称’;

python, 我的作品

nginx 日志展示

显示nginx日志的小脚本.因为用的着急,所以写的仓促.请忽略各种语法和命名.代码是一坨屎,但是能用.

https://github.com/xiaoyaoking/xylog

 

Image text Image text

linux, 我的作品

自动备份脚本

 自动备份脚本,支持将网站和数据库打包为zip压缩包并上传自FTP,支持增加密码,打包前执行自定义脚本,支持同时或分别备份数据库和网站文件.

脚本修改自LNMP备份脚本,新增功能: 1)打包更换为zip. 2)新增压缩包密码. 3)新增打包前执行命令. 4)新增备份整个数据库. 5)支持同时或分别备份数据库和网站文件

预装环境: apt-get install -y lftp zip unzip 备份区分文件和数据库,可以分开备份. 备份数据库:./backup.sh 1 备份文件:./backup.sh 2 全都备份:./backup.sh 9

######备份文件存放目录###### Backup_Home="/home/backup/"

######~需要备份的目录,支持多个,举例:("/home/web1" "/home/web2") ~###### Backup_Dir=("/home/wwwroot/www.xxx.com" "/home/wwwroot/www.xxx2.com")

######~ 备份目录前要执行的命令,比如清理缓存 ~###### Backup_Dir_Shell="cd /home/wwwroot/www.xxx.com/Runtime && rm -rf Html Cache Temp Logs && cd /home/wwwroot/www.xxx2.com/Runtime && rm -rf Html Cache Temp Logs"

######需要备份的数据库名,支持多个,举例:("db1" "db2") 默认备份整个数据库###### Backup_Database=("–all-databases")

######设置压缩包密码###### ZIP_PassWord=’zippass’

######数据库的配置信息###### MySQL_Dump="/usr/local/mysql/bin/mysqldump"

MYSQL_UserName=’root’ MYSQL_PassWord=’pass’

######是否启用FTP远程备份###### Enable_FTP=0 ######设置FTP配置信息###### FTP_Host=’192.168.1.1′ FTP_Username=’ftpuser’ FTP_Password=’ftppass’ FTP_Dir="/"

 

https://github.com/xiaoyaoking/autobackup

python, 我的作品

btc冷钱包监视,隐藏钱包地址. 自定义显示货币. 自定义显示时间内的交易

 

功能:冷钱包监视,隐藏钱包地址. 自定义显示货币. 自定义显示时间内的交易.

缺点:需要放到海外vps,因为获取数据的站点已经被墙.

配置信息

{

"title": "My Btc", //显示标题

"password":"123", //暂时未添加

"currency": "CNY", //当前法币

"currencylist":["USD","CNY"], //显示的法币汇率

"showtime":"a", // 显示的时间段 a:全部 y:本年 m:本月 d:本日

"btc": [ //btc地址列表

{

"name": "小金库", //显示名称

"key": "1JNwRa9SVHYtakuyAhAi48h5wSEWRncg8Z" // btc地址

},

{

"name": "大宝库", //显示名称

"key": "3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd" // btc地址

}

]
}

 

https://github.com/xiaoyaoking/showmybtc

 

python, 我的作品

批量展示网站SEO信息

 

show my site seo info

展示批量网站SEO信息的小工具

分为两部分

数据展示部分:index.html 和 style 目录随便丢到一个站点里。 数据爬虫部分:xysite.py 和 xysite.json 随便丢到个目录下 修改配置文件

比如 index.html 和 style 目录在 /home/wwwroot/www.test.com/xxx/ 下

配置文件中要修改 jsonpath 为 /home/wwwroot/www.test.com/xxx/

后台服务部分:

python 需要安装 requests

命令:pip install requests

运行爬虫程序:

命令:nohup python xysite.py >/dev/null 2>&1 &

配置文件:xysite.json

{

"time":120, // 数据抓取时间

"jsonpath":"web/", //数据保存目录

"sitelist":["baidu.com","qq.com","wanren.com"] //网站域名列表
}

 

https://github.com/xiaoyaoking/showmysiteseo

python

python 处理zip文件 解压zip 压缩zip文件和压缩目录

 自己需要 就写了两个函数 。

import zipfile
#解压zip文件
def unzip(zip_path=None,file_path=None):
    if zip_path is None or file_path is None:
        return False
    if os.path.exists(zip_path):
        zip_file = zipfile.ZipFile(zip_path)
        zip_file.extractall(file_path)
        zip_file.close()
#压缩文件
def zip(file_path=None,zip_path=None):
    zip_path_type = 0
    if file_path is None or zip_path is None:
        return False
    if os.path.isdir(file_path):
        zip_path_type = 1
    elif os.path.isfile(file_path):
        zip_path_type = 2
    else:
        return False
    zip_file = zipfile.ZipFile(zip_path,‘w’,zipfile.ZIP_DEFLATED)
    if zip_path_type == 2:
        zip_file.write(file_path)
    if zip_path_type == 1:
        for fpathe,dirs,fs in os.walk(file_path):
            for f in fs:
                tmp_file_path = os.path.join(fpathe,f)
                zip_file.write(tmp_file_path)
    zip_file.close()
#使用方法
unzip(‘需要解压的zip文件路径’,'解压到的目录’) #解压模板
zip(‘需要zip压缩的文件或目录’,'压缩到zip的文件路径’) #重新打包
 
#demo
unzip(‘/home/wwwroot/test.zip’,'/home/wwwroot/test’)
zip(‘/home/wwwroot/test’,'/home/wwwroot/test.zip’)
 

 

php

ThinkPHP3.1迁移到PHP7

一、在PHP7中,preg_replace不能用/e修饰符,所以用preg_replace_callback代替preg_replace,
需要修改的文件包括

ThinkPHP\Lib\Template\ThinkTemplate.class.php
ThinkPHP\Lib\Core\Dispatcher.class.php
ThinkPHP\Lib\Core\Db.class.php
ThinkPHP\Lib\Behavior\CheckRouteBehavior.class.php
ThinkPHP\Extend\Mode\Lite\Dispatcher.class.php
ThinkPHP\Lib\Behavior\ReadHtmlCacheBehavior.class.php
ThinkPHP\Common\common.php

1)ThinkPHP\Lib\Template\ThinkTemplate.class.php
这个文件大约需要修改8处地方
NO1. 大约在137行,将

[php] view plain copy

$tmplContent = preg_replace(‘/<!–###literal(\d+)###–>/eis’,"\$this->restoreLiteral(‘\\1′)",$tmplContent);
替换为
[php] view plain copy

$tmplContent = preg_replace_callback(‘/<!–###literal(\d+)###–>/is’, function($r) {
return $this->restoreLiteral($r[1]);
}, $tmplContent);

NO2. 大约在168行,将
[php] view plain copy

$content = preg_replace(‘/’.$begin.’literal’.$end.’(.*?)’.$begin.’\/literal’.$end.’/eis’,"\$this->parseLiteral(‘\\1′)",$content);
替换为
[php] view plain copy

$content = preg_replace_callback(‘/’ . $begin . ‘literal’ . $end . ‘(.*?)’ . $begin . ‘\/literal’ . $end . ‘/is’, function($r) {
return $this->parseLiteral($r[1]);
}, $content);

NO3. 大约在197行,将
[php] view plain copy

$content = preg_replace(‘/(‘.$this->config['tmpl_begin'].’)([^\d\s'.$this->config['tmpl_begin'].$this->config['tmpl_end'].’].+?)(‘.$this->config['tmpl_end'].’)/eis’,"\$this->parseTag(‘\\2′)",$content);
替换为
[php] view plain copy

$content = preg_replace_callback(‘/(‘ . $this->config['tmpl_begin'] . ‘)([^\d\s' . $this->config['tmpl_begin'] . $this->config['tmpl_end'] . ‘].+?)(‘ . $this->config['tmpl_end'] . ‘)/is’, function($r) {
return $this->parseTag($r[2]);
}, $content);

NO4. 大约在266行,将
[php] view plain copy

preg_replace(‘/’.$begin.’block\sname=(.+?)\s*?’.$end.’(.*?)’.$begin.’\/block’.$end.’/eis’,"\$this->parseBlock(‘\\1′,’\\2′)",$content);
替换为
[php] view plain copy

preg_replace_callback(‘/’ . $begin . ‘block\sname=(.+?)\s*?’ . $end . ‘(.*?)’ . $begin . ‘\/block’ . $end . ‘/is’, function ($r) {
$this->parseBlock($r[1], $r[2]);
}, $content);

NO5. 大约在271行,将
[php] view plain copy

$content = preg_replace(‘/’.$begin.’block\sname=(.+?)\s*?’.$end.’(.*?)’.$begin.’\/block’.$end.’/eis’,"\$this->replaceBlock(‘\\1′,’\\2′)",$content);
替换为
[php] view plain copy

$content = preg_replace_callback(‘/’ . $begin . ‘block\sname=(.+?)\s*?’ . $end . ‘(.*?)’ . $begin . ‘\/block’ . $end . ‘/is’, function ($r) {
return $this->replaceBlock($r[1], $r[2]);
}, $content);

NO6. 大约在273行,将
[php] view plain copy

$content = preg_replace(‘/’.$begin.’block\sname=(.+?)\s*?’.$end.’(.*?)’.$begin.’\/block’.$end.’/eis’,"stripslashes(‘\\2′)",$content);
替换为
[php] view plain copy

$content = preg_replace_callback(‘/’ . $begin . ‘block\sname=(.+?)\s*?’ . $end . ‘(.*?)’ . $begin . ‘\/block’ . $end . ‘/is’, function ($r) {
return stripslashes($r[2]);
}, $content);

NO7和NO8,这两处是连在一起的 大约在396行,改成如下:
[php] view plain copy

if (!$closeTag){
$patterns = ‘/’.$begin.$parseTag.$n1.’\/(\s*?)’.$end.’/is’;
$replacement = "\$this->parseXmlTag(‘$tagLib’,'$tag’,'$1′,”)";
$content = preg_replace_callback($patterns, function($r) use($tagLib, $tag) {
return $this->parseXmlTag($tagLib, $tag, $r[1], ”);
},$content);
}else{
$patterns = ‘/’.$begin.$parseTag.$n1.$end.’(.*?)’.$begin.’\/’.$parseTag.’(\s*?)’.$end.’/is’;
$replacement = "\$this->parseXmlTag(‘$tagLib’,'$tag’,'$1′,’$2′)";
for($i=0;$i<$level;$i++)
$content = preg_replace_callback($patterns, function($r) use($tagLib, $tag) {
return $this->parseXmlTag($tagLib, $tag, $r[1], $r[2]);
},$content);
}

2)ThinkPHP\Lib\Core\Dispatcher.class.php
大约132行,将
[php] view plain copy

preg_replace(‘@(\w+)\/([^\/]+)@e’, ‘$var[\'\\1\']=strip_tags(\’\\2\’);’, implode(‘/’,$paths));
改为
[php] view plain copy

preg_replace_callback(‘@(\w+)\/([^\/]+)@’,function($r) use (&$var){
$var[$r['1']] = strip_tags($r[2]);
},implode(‘/’,$paths));

3)ThinkPHP\Lib\Core\Db.class.php
大约605行,将
[php] view plain copy

$joinStr = preg_replace("/__([A-Z_-]+)__/esU",C("DB_PREFIX").".strtolower(‘$1′)",$joinStr);
改为
[php] view plain copy

$DB_PREFIX = C("DB_PREFIX");
$joinStr = preg_replace_callback("/__([A-Z_-]+)__/sU",function ($r) use($DB_PREFIX) {
return $DB_PREFIX.".strtolower({$r[1]})";
},$joinStr);

4)ThinkPHP\Lib\Behavior\CheckRouteBehavior.class.php
这个文件需要修改的地方共4处
NO1. 大约151行,将
[php] view plain copy

$url = preg_replace(‘/:(\d+)/e’,'$values[\\1-1]‘,$url);
改为
[php] view plain copy

$url = preg_replace_callback(‘/:(\d+)/’,function($r) use (&$values){
return $values[$r[1]-1];
},$url);
NO2. 大约168行,将
[php] view plain copy

preg_replace(‘@(\w+)\/([^\/]+)@e’, ‘$var[strtolower(\'\\1\')]=strip_tags(\’\\2\’);’, implode(‘/’,$paths));
改为
[php] view plain copy

preg_replace_callback(‘@(\w+)\/([^\/]+)@’,function($r) use (&$var){
$var[strtolower($r['1'])] = strip_tags($r[2]);
},implode(‘/’,$paths));

NO3. 大约191行,将
[php] view plain copy

$url = preg_replace(‘/:(\d+)/e’,'$matches[\\1]‘,$url);
改为
[php] view plain copy

$url = preg_replace_callback(‘/:(\d+)/’, function($r) use (&$matches) {
return $matches[$r[1]];
},$url);

NO4. 大约201行,将
[php] view plain copy

preg_replace(‘@(\w+)\/([^,\/]+)@e’, ‘$var[strtolower(\'\\1\')]=strip_tags(\’\\2\’);’, $regx);
改为
[php] view plain copy

preg_replace_callback(‘@(\w+)\/([^,\/]+)@’,function($r) use (&$var){
$var[strtolower($r['1'])] = strip_tags($r[2]);
},$regx);

5)ThinkPHP\Extend\Mode\Lite\Dispatcher.class.php
大约65行,将
[php] view plain copy

$res = preg_replace(‘@(\w+)’.$depr.’([^'.$depr.'\/]+)@e’, ‘$var[\'\\1\']="\\2";’, implode($depr,$paths));
改为
[php] view plain copy

preg_replace_callback(‘@(\w+)’.$depr.’([^'.$depr.'\/]+)@’,function($r) use (&$var){
$var[$r['1']] = $r[2];
},implode($depr,$paths));
6)ThinkPHP\Lib\Behavior\ReadHtmlCacheBehavior.class.php
大约65行处的一个if判断替换为:

[php] view plain copy

if(!empty($html)) {
// 解读静态规则
$rule = $html[0];
// 以$_开头的系统变量
//$rule = preg_replace(‘/{\$(_\w+)\.(\w+)\|(\w+)}/e’,"\\3(\$\\1['\\2'])",$rule);
$rule = preg_replace_callback(‘/{\$(_\w+)\.(\w+)\|(\w+)}/’,function($r){
$system = "$r[3](\${$r[1]}['$r[2]‘])";
eval( "\$system = $system ;" );
return $system;
},$rule);
//$rule = preg_replace(‘/{\$(_\w+)\.(\w+)}/e’,"\$\\1['\\2']",$rule);
$rule = preg_replace_callback(‘/{\$(_\w+)\.(\w+)}/’,function($r){
$system = "\${$r[1]}['$r[2]‘]";
eval( "\$system = $system ;" );
return $system;
},$rule);
// {ID|FUN} GET变量的简写
//$rule = preg_replace(‘/{(\w+)\|(\w+)}/e’,"\\2(\$_GET['\\1'])",$rule);
$rule = preg_replace_callback(‘/{(\w+)\|(\w+)}/’,function($r){
return $r[2]($_GET[$r[1]]);
},$rule);
//$rule = preg_replace(‘/{(\w+)}/e’,"\$_GET['\\1']",$rule);
$rule = preg_replace_callback(‘/{(\w+)}/’,function($r){
return $_GET[$r[1]];
},$rule);
// 特殊系统变量
$rule = str_ireplace(
array(‘{:app}’,'{:module}’,'{:action}’,'{:group}’),
array(APP_NAME,MODULE_NAME,ACTION_NAME,defined(‘GROUP_NAME’)?GROUP_NAME:”),
$rule);
// {|FUN} 单独使用函数
//$rule = preg_replace(‘/{\|(\w+)}/e’,"\\1()",$rule);
$rule = preg_replace_callback(‘/{\|(\w+)}/’,function($r){
return $r[1]();
},$rule);
if(!empty($html[2])) $rule = $html[2]($rule); // 应用附加函数
$cacheTime = isset($html[1])?$html[1]:C(‘HTML_CACHE_TIME’); // 缓存有效期
// 当前缓存文件
define(‘HTML_FILE_NAME’,HTML_PATH . $rule.C(‘HTML_FILE_SUFFIX’));
return $cacheTime;
}
7)ThinkPHP\Common\common.php

大约217行,将
return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper(‘\\1′)", $name));

改为
$str = preg_replace_callback(‘/_([a-zA-Z])/’, function($r) {
return strtoupper($r[1]);
}, $name);

return ucfirst($str);

 

二、如果有用到验证码,请把ThinkPHP\Extend\Library\ORG\Util目录下的String.class.php复制一份放在一起,并改名为Stringnew.class.php

打开Stringnew.class.php
把所有的String::替换为Stringnew::

并把类名Class String 改为 Class Stringnew
打开ThinkPHP\Extend\Library\ORG\Util\Image.class.php,把所有的

[php] view plain copy

import(‘ORG.Util.String’);
替换成

[php] view plain copy

import(‘ORG.Util.Stringnew’);
三、自定义函数的参数最好给定默认值,如果自定义函数规定了参数,但是没有指定默认值,在外部调用的时候,如果传参的时候少传值了,那么运行会报错!

 

这样,在PHP7下就能运行ThinkPHP3.1了。

 

服务常见问题, 站长工具

Let’s Encrypt SSL 证书验证CAA错误 Verify error:DNS problem: query timed out looking up CAA for

 

具体报错如下

[Thu Dec 10 13:10:00 CST 2020] www.526net.com:Verify error:DNS problem: query timed out looking up CAA for www.526net.com
[Thu Dec 10 13:10:00 CST 2020] Please check log file for more details: /usr/local/acme.sh/acme.sh.log
Let’s Encrypt SSL Certificate create failed!

 

在你的dns解析服务商那里添加相应的CAA解析。比如下面是我的。

主机记录 记录类型  记录值 
blog         CAA         1 issue letsencrypt.org

php

重建(替换)一些被 PHP7 废弃的函数

 

重建(替换)一些被 PHP7 废弃的函数
<?php
if(!function_exists(‘ereg’)) { function ereg($pattern, $subject, &$matches = []) { return preg_match(‘/’.$pattern.’/', $subject, $matches); } }
if(!function_exists(‘eregi’)) { function eregi($pattern, $subject, &$matches = []) { return preg_match(‘/’.$pattern.’/i’, $subject, $matches); } }
if(!function_exists(‘ereg_replace’)) { function ereg_replace($pattern, $replacement, $string) { return preg_replace(‘/’.$pattern.’/', $replacement, $string); } }
if(!function_exists(‘eregi_replace’)) { function eregi_replace($pattern, $replacement, $string) { return preg_replace(‘/’.$pattern.’/i’, $replacement, $string); } }
if(!function_exists(‘split’)) { function split($pattern, $subject, $limit = -1) { return preg_split(‘/’.$pattern.’/', $subject, $limit); } }
if(!function_exists(‘spliti’)) { function spliti($pattern, $subject, $limit = -1) { return preg_split(‘/’.$pattern.’/i’, $subject, $limit); } }

 

温馨提示
有些地方替换函数中的 / 可能会报错,可以将 / 换成 ~,比如:

return preg_match(‘/’.$pattern.’/i’, $subject, $matches); 改为: return preg_match(‘~’.$pattern.’~i’, $subject, $matches);

愚人愚语

勇者斗恶龙

困难重重