分类目录归档:未分类

MySQL笔记

MySQL里的日期与时间

格式化:select DATE_FORMAT(now(), ‘%Y-%m-%d %T’);
从1970年1月1日到指定时间的天数:select to_days(now());

取当前时间:
select now(), current_timestamp(),current_timestamp,current_time, curtime(),current_date, curdate(), sysdate();
sysdate()函数是这个函数执行时候的时间,其它的是语句开始执行的时间。

时间的加减:

DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)
DATEDIFF(date1,date2),2个时间的天数
TIMESTAMPDIFF(type,date1,date2),2个时间的差额
TIMESTAMPADD(type,int_expr,date1),加时间

 

存储过程

set @var = '';
set @var2 = 'fff';
set @var = @var2;

-- 这种只能用在declare了的变量
set var = 'sdfdf';

-- 这里不会输出返回结果,只会设置变量
select `day` into @var from redash_queue_flush_sem_base_data limit 1;
-- 这里在设置变量的同时,也会返回
select @day:=`day` from redash_queue_flush_sem_base_data limit 1;


CREATE DEFINER=`dealam_stat_prod`@`%` PROCEDURE `flush_sem_base_data`()
-- 注意这里的BYEBYE,在里面用leave BYEBYE就可以退出了,存储过程里没有return之类的功能
BYEBYE:BEGIN
    declare vday varchar(100);
    declare vvar VARCHAR(50);
    declare vvalue VARCHAR(200);
    declare select_done int default 0;
    -- 定义select游标
    declare cur_queue cursor for select `var`, `value` from redash_variable limit 2;
    -- 定义游标是否循环完成的标记变量
    declare continue handler for not found set select_done = 1;
    
    if @queue_count > 0 then
        insert into redash_logs (`what`) values (concat('刷新队列里还有数据:', @queue_count));
        select concat('刷新队列里还有数据:', @queue_count) as msg;
        leave BYEBYE;
    else
        -- 找出待更新订单对应的订单日期,放入待刷新队列中
        insert ignore redash_queue_flush_sem_base_data 
            select distinct(from_unixtime(transaction_time, '%Y-%m-%d')) from da_sem_order where updated_time>@sem_last_update_time order by updated_time;
    end if;
    
    open cur_queue;
    
    loop_label:loop
        -- 注意这里变量前没有加@
        fetch cur_queue into vvar, vvalue;
        -- select_done 前没有加@
        if select_done = 1 then
            leave loop_label;
        end if;
        
        -- 注意这里变量前也没有加@,也就是说如果是declare的变量,好像是不用加的
        select vvar, vvalue;
        set @vvar2 = vvar;
        select @vvar2;
        insert into redash_logs (`what`) values (concat('刷新了sem base data,日期:', vvar));
        
    end loop;
    
END

 

查看未提交的事务
select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx\G;

查看锁信息
select * from information_schema.INNODB_TRX WHERE trx_state=’LOCK WAIT’\G

 

PHP发送AWS邮件

安装SDK:
https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_installation.html

发送demo代码:
https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-using-sdk.html

准备好key, sec

use Aws\Ses\SesClient;
use Aws\Exception\AwsException;

$credentials = new Aws\Credentials\Credentials('xx', 'xx');

$SesClient = new SesClient([
    'version' => '2010-12-01',
    'region'  => 'us-east-1',
    'credentials' => $credentials,
]);

$sender_email = '[email protected]';

$recipient_emails = ['[email protected]'];

$subject = 'Amazon SES test (AWS SDK for PHP)';
$plaintext_body = 'This email was sent with Amazon SES using the AWS SDK for PHP.' ;
$html_body =  '<h1>AWS Amazon Simple Email Service Test Email</h1>'.
              '<p>This email was sent with <a href="https://aws.amazon.com/ses/">'.
              'Amazon SES</a> using the <a href="https://aws.amazon.com/sdk-for-php/">'.
              'AWS SDK for PHP</a>.</p>';
$char_set = 'UTF-8';

try {
    $result = $SesClient->sendEmail([
        'Destination' => [
            'ToAddresses' => $recipient_emails,
        ],
        'ReplyToAddresses' => [$sender_email],
        'Source' => $sender_email,
        'Message' => [
          'Body' => [
              'Html' => [
                  'Charset' => $char_set,
                  'Data' => $html_body,
              ],
              'Text' => [
                  'Charset' => $char_set,
                  'Data' => $plaintext_body,
              ],
          ],
          'Subject' => [
              'Charset' => $char_set,
              'Data' => $subject,
          ],
        ],
    ]);
    $messageId = $result['MessageId'];
    echo("Email sent! Message ID: $messageId"."\n");
} catch (AwsException $e) {
    // output error message if fails
    echo $e->getMessage();
    echo("The email was not sent. Error message: ".$e->getAwsErrorMessage()."\n");
    echo "\n";
}

 

对于使用php比较老的版本,可以用这个第三方实现库。

https://github.com/daniel-zahariev/php-aws-ses

 

使用阿里云的Redis时,Laravel把Job发布到Queue失效的问题

又是一个坑人的大坑。

之前遇到的问题是在设置密码的时候,不是用户名和密码,需要把用户名和密码用冒号串起来写进去进行认证。

我们用的是阿里去的ecs和redis,用的是laravel框架,里面有用到Job,以队列的方式在执行:

ProductUpdateJob::dispatch($product);

结果任务死活发布不到Redis的List里,对应的Job也没有运行。

后面一步步的跟到Laravel的框架里: vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php

public function command($method, array $parameters = [])
{
    var_dump($method, $parameters);
    $start = microtime(true);

    $result = $this->client->{$method}(...$parameters);

    $time = round((microtime(true) - $start) * 1000, 2);

    if (isset($this->events)) {
        $this->event(new CommandExecuted($method, $parameters, $time, $this));
    }

    return $result;
}

输出:

string(4) "eval"
array(3) {
  [0]=>
  string(153) "-- Push the job onto the queue...
redis.call('rpush', KEYS[1], ARGV[1])
-- Push a notification onto the "notify" queue...
redis.call('rpush', KEYS[2], 1)"
  [1]=>
  array(3) {
    [0]=>
    string(14) "queues:default"
    [1]=>
    string(21) "queues:default:notify"
    [2]=>
    string(579) "{"uuid":"5b31adf4-4646-4435-a13e-9940450261da","displayName":"App\\Jobs\\TestJob","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"maxExceptions":null,"backoff":null,"timeout":null,"retryUntil":null,"data":{"commandName":"App\\Jobs\\TestJob","command":"O:16:\"App\\Jobs\\TestJob\":10:{s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"},"id":"H97AvylnadgDi2Vp8eA0ieXiNxrgY8Ok","attempts":0}"
  }
  [2]=>
  int(2)
}

发现里面用的是eval命令执行的rpush。

最后在redis里用命令执行eval,结果发现没有这个权限运行:

eval "redis.call('rpush', KEYS[1], ARGV[1])\nredis.call('rpush', KEYS[2], 1)" "queues:default" "queues:default:notify" 
返回:
"ERR command eval not support for your account"

最后联系阿里的客服,建议我们升级Redis的版本后,问题就好了。

期待ing, Mac Book Pro 16寸原型机曝光

相对当前代的mac book pro, 苹果做了这些改变:

  • ARM构架的引入,这是大家所期待的,随着配套软件的成熟,arm带来的速度和功耗优势非常的棒。
  • Touch bar取消了!!这是一个鸡肋的设计,耗电不说,很多软件都不支持,要你何用?快哉!
  • HDMI和SD卡槽又回来了,这才亲民嘛,能放下身段迎合用户,此子可教也,特别是hdmi,方便了很多,SD卡槽对我们做软件开发的用户来讲可能不大,但对于摄影的来讲,很方便。
  • 最后就是屏蔽的圆角变成了硬件层面的了,之前的总感觉怪怪的。

下面就等上市啦,

更重要的是看价格,我要努力存钱了。。。。

linux shell 常用操作

用awk分析nginx日志

BEGIN {
#FS = "\t"
print("start...\n")
}

/deploy\.php(.*?)302/ {
print $1
}

END {
print("end.\n")
}

awk -f awk access.log 

BEGIN {
   pos = 1
   isupdate = 0
   title = ""
}

/Table_map: `55shantao_prod`\.`product_sku_data`/ {
   title = NR":"$0
}

/UPDATE `55shantao_prod`\.`product_sku_data`/ {
   print NR":"title
   print NR":"$0
   isupdate = 1
}


{
if (isupdate == 1 && pos < 28) {
   print NR":"$0
   pos = pos + 1
} else {
   pos = 1
   isupdate = 0
}
}

输出百度抓取的POST的ID和时间

more www.bianhua8.com.log | grep "Baiduspider" | grep "/post/" | awk 'BEGIN{FS=" "}{match($0, /\[(.+)\].+?post\/([0-9]+)/, m);print NR""m[1]"\t"m[2];}'

把找出执行时间大于多少ms的日志,注意:下面的match只支持在gawk里使用,有的linux默认是gawk,但在mac下面,需要安装gawk才支持,不然会报错。

more access.log-20210630 | awk '{match($0,/urt="([0-9\.]+)"/, m)}m[1]>0.1{print m[1]"\t"$7}' | grep -v "search"

tail -f xxxx.com.access.log | awk '{match($0,/urt="([0-9\.]+)"/, m)}m[1]>0.5{print $4"]\t" m[1]"s\t"$7}'

找出最近访问次数多的ip

tail -n 50000 /data/log/nginx/www.xxx.com.access.log | awk -F' ' '{print $1}' | sort | uniq -c | sort -n

 

grep取上下几行:
-B 前几行
-C 上下几行
-A 后几行

gerp用正则匹配
grep -E ‘xxxx’
但正则好像不能用\d之类的,只能用[0-9]这样

去重
cat xx.txt | sort | uniq

去重并统计行数按倒序排
cat xx.txt | sort | uniq -c | sort -r

curl显示请求时间
curl -o /dev/null -s -w 'dns解析时间:%{time_namelookup}\n连接时间:%{time_connect}\n开始传输时间:%{time_starttransfer}\ntotal:%{time_total}\n速度:%{speed_download}\n' "http://localhost/404.html"

切换用户

su xxx,切换到某用户
sudo -i,切换到管理员
sudo -u nginx php xxx.php,以某个用户运行,像一些无法登录的用户可以以这种方式执行
sudo -su nginx,可以切换到该用户去,并一直在那个用户

查看运行时间久的进程

ps aux | grep " cli.php " | sort -k 10 -n

查看网络连接状态

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

上面的$NF表示是最后一列的内容, NF表示最后一列的索引, END 是各个{}块之间需要的