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冲突。

转载请注明出处,谢谢。

JAVA VO、DTO、DO、PO的概念、区别和用处

概念

VO(View Object):

视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 

DTO(Data Transfer Object):

数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。 

DO(Domain Object):

领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。 

PO(Persistent Object):

持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

继续阅读JAVA VO、DTO、DO、PO的概念、区别和用处

Laravel 表单请求验证实践

在项目中使用了laravel的表单验证组件,因为没有打印出错误信息,所以一直是请求302却找不到原因,重新阅读文档后,终于找到了302返回当前页的原因。

表单请求验证(FormRequest)的工作机制,是利用 Laravel 提供的依赖注入功能,在控制器方法,如上面我们的 update() 方法声明中,传参 UserRequest。这将触发表单请求类的自动验证机制,验证发生在 UserRequest 中,并使用此文件中方法 rules() 定制的规则,只有当验证通过时,才会执行 控制器 update() 方法中的代码。否则抛出异常,并重定向至上一个页面,附带验证失败的信息。

Laravel 查询器orWhere使用

之前做开发的过程中,一直在使用原生的sql,在接触laravel框架之后,开始使用laravel 的数据库查询构造器,一些常用的查询语句如select()、where等都比较好理解,但是今天在使用or条件查询时遇到了问题,没有办法将两个or条件进行内部关联,所以在百度之后找到了解决方案,使用闭包的方式。

$query->where(function ($query) use (参数1) {
        $query->where('字段1',参数1)->orWhere('字段2', '=',参数1;
    });
}

上述写法等同于

where (条件1 or 条件2)

由此即可完成需求