分类 技术 下的文章

MYSQL 不写脚本,用 SQL 乱序 ID 主键

添加一个 r INT(10),复制一个同样结构的表

UPDATE table SET r=FLOOR(1 + (RAND() * 10800));

INSERT INTO table_copy (xxx,xxx,xxx)
SELECT xxx,xxx,xxx FROM table ORDER BY r DESC;

PHP 加密:关于 ENPHP 加密之注释加密说明

最近 ENPHP 上线了两种注释加密,

这也是我个人在代码加密混淆的实际应用场景里最常用的两种方法:

1、隐藏代码

示例:

/*<hide>*/
echo 1;
/*</hide>*/

能在加密混淆前,去掉

   echo 1;

这样,中间有部分逻辑就会去除。

语法说明:

/*<hide>*/
需要隐藏的代码
/*</hide>*/
/*<hide>*/和/*</hide>*/字符串固定,<和>之间不能有任何空格,hide只能小写

应用场景?我举个例子:

  • 你需要加密一部分代码给第三方,但是中间有些核心方法他们用不到。
  • 你的商业代码,但是在打包时,你只想隐藏一部分功能给用户。

2、字符串+数字加密

示例:

    $a = /*<encode>*/"明文数据1"/*</encode>*/;
    echo /*<encode>*/2/*</encode>*/;
    print(/*<encode>*/"明文数据3"/*</encode>*/);

加强字符串混淆强度,即使反编译后仍无法找到原字符串,使 hacker 们反编译后依旧无法正常阅读。

语法:

/*<encode>*/'字符串'/*</encode>*/
/*<encode>*/"字符串"/*</encode>*/
/*<encode>*/123/*</encode>*/

仅支持字符串变量和数字,如果中间是其它格式将不会转换。同理,encode 前后<和>都不能有空格

应用场景:

  • 假如你做的是一个商业软件,要限制域名。对域名加密判断过程可以这样写(仅供参考):
$domain = /*<encode>*/'djunny.com'/*</encode>*/;
$message = /*<encode>*/'Plz Register'/*</encode>*/;
if(strpos($_SERVER['HTTP_HOST'], $domain) !== false){
   exit($message);
}

当然,还有一个更加优化版本:

$a = 'd';
$b = 'j';
$k = '*';
$domain = str_replace($k, '', $a.$k.$b.$k)./*<encode>*/'unny.com'/*</encode>*/;
$message = /*<encode>*/'Plz Register'/*</encode>*/;
if(strpos($_SERVER['HTTP_HOST'], $domain) !== false){
   exit($message);
}

随意发挥~

好了,先说到这,有什么问题可以留言给我。

curl和wget 在linux下出现证书错误的另类解决方案

今天在部署两台新机器的时候,rpm、wget 和 curl 均出现:

Peer certificate cannot be authenticated with known CA certificates

然后整了很多方法,例如:

curl https://curl.haxx.se/ca/cacert.pem --insecure -o /etc/pki/tls/certs/ca-bundle.crt

例如:

update-ca-trust

结果依旧无法识别证书。

甚至在准备要升级下 tlinux 内核...

正当一愁莫展的时候,ls 发现新建的文件时间都是2015年...心想会不会和时间有关?

于是立马执行:

rdate -s time.nist.gov

成功后,再试一次 curl https

结果成功了。。。。。。

这踏马就尴尬了,低级错误。。。。

写到这里,希望后来有人遇到这个问题可以看到。

操作系统:centos 6.7 / centos 6.8

如何在PHP7中安装ImageMagick扩展(centos版)

(YUM 安装 PHP7 的方法在这里:PHP7安装

yum 命令(先安装 php7、PHP7-devel、ImageMagick-devel):

yum install -y php70w php70w-devel ImageMagick-devel

mkdir download/
cd download/
git clone https://github.com/mkoppanen/imagick.git
cd imagick
phpize
./configure
make && sudo make install
echo extension=imagick.so >> /etc/php.d/imagick.ini

然后,看看扩展是否正常安装:

php -m | grep imagick

返回结果为imagick 即安装成功。

利用 MYSQL 的 PARTITION 来实现海量数据高性能研究笔记(一)

PARTITION 分区技术介绍就在这里不细述了,有心人请自行百度。

遇到问题

我这里遇到的情况是,一个平台,下边有许多许多的代理商,每个代理商对应一个 site_id.

因为每个代理商之间的数据都是互不影响的,想根据 HASH(site_id) 来分区。

数据量因为不是很大,而且写比读频繁,所以暂时只考虑 MYISAM 引擎。

CREATE TABLE `test` (
   `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
   `site_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '站点id',
    PRIMARY KEY (`id`),
    KEY `siteIndex` (`site_id`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8 PARTITION BY HASH (site_id) PARTITIONS 10;

于是遇到

错误码: 1503
A PRIMARY KEY must include all columns in the table's partitioning function

这个问题的原因是因为 分区的参数必须包含 PRIMARY KEY , 主键id, 必须放在HASH(id)中。

所以,在创建表的时候不能设置主键。因此 id 字段也不能自增。

解决方案

将id 改成 char(16),创建使用唯一 guid的方案:

/**
 * get guid by
 *
 * @return string|void
 */
function guid($pre = '') {
    return ($pre ? $pre : '') . substr(md5(uniqid(($pre ? $pre : '') . mt_rand(), true)), 9, 16);
}

因为 id 必须要为数字(需要coreseek配合全文索引),所以这个方案暂时放一放。

后来,还是决定把 id 字段 INT(10) 不变,变为索引字段。

然后外建一个表:

CREATE TABLE `maxid` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `tb` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '表名',
  `maxid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '最大自增id',
  `step` INT(5) UNSIGNED NOT NULL DEFAULT '1' COMMENT '步长',
  PRIMARY KEY (`id`),
  UNIQUE KEY `tb` (`tb`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

手工统计自增的id。
(在高并发的系统中,需要在获取 maxid 之前要加锁。否则极有可能会产生重复的id。)