关于laravel 数据库事务使用的一个小坑

事情大概发生在几个月前,在开发过程中遇到了事务无法回滚的情况,前后排查了1小时没有找到问题的原因,最后我觉得从这个业务的每一个model去排查,最后发现了事务开启过程中的细微差别。

在我们线上的业务应用中,为了缓解数据库的访问压力,我们通常会为数据库设置主从数据库,主数据库用于写,从数据库用于读。而在我们的model配置中如果不设置连接主数据库的话,通常会走default配置。而如果你的default配置是读库,那么在进行数据库回滚的时候就会出现问题。

相当于你在主数据库开启了失误,而在从数据库进行commit或roallback,而避免出现这种情况的最好方式就是在model使用的过程中,加上强制连接主库,这样就不会出现与我类似的问题。

lua学习笔记

本周入职了新公司,经过了短暂的入职,很快就投入到热火朝天的工作当中,领导帮忙开了虚拟机,就可以开干了。

lua也是一门脚本语言,在学些了一段时间之后,感觉比php更自由。

1.首先变量的默认声明 将 声明为 全局变量 ,局部变量将通过 local var 进行声明。

2.lua的语句结束之后,不需要分号做为结束,换行后即代表语句的结束。

3.lua的table结构与php数组结构类似,它同时支持数组和键值存储的形式。

4.lua的判断只有 nil和false为假 ,0和空字符串也会为真,这点与php也是有不晓得区别。

5.lua的table循环 需要使用到迭代器 对于数组性质的table 采用ipairs迭代器 ,对于 键值性质的table采用pairs迭代器。

6.lua if for 和function 的开始结束 没有{} 结束是通过end进行。

7.关于字符串的拼接 需要时使用 .. 而不是一般语言的 . 或者 + ,这也会对一些其他语言的使用者造成困扰。

8.关于正则模式匹配问题。OpenResty 中并行着两套字符串匹配方法,

Lua 自带的 sting 库,以及 OpenResty 提供的 ngx.re.* API。

php实现冒泡排序

冒泡排序

上一次我们用php实现了快速排序算法,今天我们就用php来实现一下冒泡排序算法,首先我们来介绍一下冒泡排序。

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
下面是代码的实现过程:

<?php
$a = [3,5,2,8,6] ;
public function soap_soft($array){
$length =count($array);
$temp = 0;
for($i=1;$i<$length-1;$i++)
{
 for($j=0;$j<$length-$j;$j++)
 if($array[$j] < $array[$j-1])
     {
          $temp = $array[$j-1];
          $array[$j-1] = $array[$j];
          $array[$j] = $temp;
     }
}
return $arr;
}
print_r(sort_soap($a));

 

php实现快速排序

 

<?php

$a = [6,10,3,8,15,28,2];//待排序数组;
public function quickSort($a){
    if(!is_array($a)){
         return false;
    }
    $length = count($a);
    if($length<=1){
        return $a;
     }
    $left=$right=[];
    for($i=1;$i<$length;$i++)
     {
        if($a[$i]<$a[0]){
          $left[]=$a[$i];
        }else{
          $right[]=$a[$i]'
        }
     }
    $left=quickSort($a);
    $right=quictSort($a);
    return array_merge($left,[$a],$right);
}
echo quickSort($a);



 

php 将字数串打散为数组

今天在学习算法的过程中遇到了一道试题 :找出无重复字符串的长度。

在使用php解答的过程中需要将字符串的每个字符存入数组当中,因为很多小的函数长时间未使用所以有些遗忘,一番寻找之后找到了这个函数。

str_split — 将字符串转换为数组

说明

str_split ( string $string [, int $split_length = 1 ] ) : array

将一个字符串转换为数组。

参数

string

输入字符串。

split_length

每一段的长度。

返回值

如果指定了可选的 split_length 参数,返回数组中的每个元素均为一个长度为 split_length 的字符块,否则每个字符块为单个字符。

如果 split_length 小于 1,返回 FALSE。如果 split_length 参数超过了 string 超过了字符串 string 的长度,整个字符串将作为数组仅有的一个元素返回。

通过这个函数就可以将我们的字符串存入到数组中了。

线上服务器排错

今天公司主站出现了宕机,一段时间内大家都没有找到问题原因。因为线上做了错误的隐藏,并且错误日志没有打印成功,给大家的问题排查造成了一定困难,最终找到原因是因为刚上线的代码因认为操作原因,收到了预发布代码的污染。导致还在测试中的其他项目被代入了发布项目中,线上数据库字段缺失,造成了服务不可用。

因为项目历史比较久,还是使用的PHP ci框架的模板渲染,未进行前后端分离,所以导致了页面整个挂掉。这个事情引起我的一些思考:首先,如果代码发布后,出现问题应该首先即时回滚代码到上个版本,确保服务的可用性,其次,网站首页应该做到纯静态,因为公司的首页是一个展示公司形象的地方,作为一个互联网公司更不能让长时间的服务不可用。最后要经常进行日志的检查,确保错误信息能够及时的输出到日志文件,今天的问题给我们日后处理相关事件提供了宝贵的经验。

& 和 && 的区别

& 符 大家经常使用,不过有些基础不牢的同学能会误用它。

一个&表示位运算,如果有运算 $a&$b,那么首先会将两个变量转换为2进制数,然后进行位于算。两个&&表示逻辑运算,首先判断&&左边是否为真,如果未假则不进行右边的运算,所以当我们进行 if判断是推荐大家使用&&。

PV操作P和V缩写词的来源

在我们学习信号量相关处理的时候,都会使用PV操作,大家也都明白P是-1,V是+1,但我们可能没有去了解过它们是什么缩写,今天在做扩展的时候正好用到信号量操作,索性就去溯本求源了。

PV操作信号量的处理相关,P表示通过的意思,V表示释放的意思。

P和V是来源于两个荷兰语词汇

P—— passeren,中文译为”通过”;

V—— vrijgeven,中文译为”释放”。

谈到PV操作绕不开一位著名的计算机大神—— Edsgar Wybe Dijkstra,中文名”埃德斯加·狄克斯特拉”,荷兰人,毕业于莱顿大学、剑桥大学。

为了在单处理器的情况下确定进程能否占有处理器,狄克斯特拉将每个进程分为“就绪”、“运行”和“阻塞”三个状态。

通过信号量来对进程的状态进行操作。

PHP 字符串的整数化探究

故事背景:上周在做共享内存相关的项目过程中,遇到了一个问题,函数的入参锁定为整形,而我想要保存的数据为字符型,这样就造成了冲突。

过程:于是我第一想到的就是使用md5函数,进行字符串的摘要操作。首先使用的是md5($str,true),这样先将字符串转换成16位字符串,然后进行强制转换使用base_convert(16,10)将16进制数转换为10进制数,最后用整形进行保存。

问题:首先我们知道md5这种hash函数是不可逆的,也就是说,我得到的值必须一开始就写入对应关系,否则取出的时候是无法还原的,其次md5这类hash函数会发生hash碰撞,导致我们的数据有误,所以为了避免这两种情况,我继续进行了深入的研究。

解决方案:使用bin2hex函数代替md5函数,这个函数也是可以将字符串转换成16进制数,然后我们再进行16进制转10进制进行存入。而当我们获取的时候可以使用hex2bin函数进行逆向转换,最终获得我们需要的数据,而且也很好的避免的hash冲突。

转载请注明出处,谢谢。