在PHP中我们经常对比2个数组不同的元素时候经常用到一个函数array_diff.然而当我们用一个由对象组成的数组和一个普通的数组对比时候,array_diff就不能达到要求了。PHP提供了另外array_udiff($array1, $array2, call_function)
案例:
结果:
note:array_udiff在调用自定义的方法时候,会将$a,$b2个数组的值循环传入compare函数中。
在PHP中我们经常对比2个数组不同的元素时候经常用到一个函数array_diff.然而当我们用一个由对象组成的数组和一个普通的数组对比时候,array_diff就不能达到要求了。PHP提供了另外array_udiff($array1, $array2, call_function)
案例:
结果:
note:array_udiff在调用自定义的方法时候,会将$a,$b2个数组的值循环传入compare函数中。
在yii2的yii\base\Object.php文件有段初始化方法
这个方法主要是调用yii\BaseYii.php中的configure方法
configure方法会将自己类中的变量赋值。
测试代码:
输出结果:
在PHP中array_merge实现源码(php版本5.4.45)
源码路径:ext/standard/array.c
|
|
|
|
今天在写迁移脚本时候,发现脚本执行时间花了太多时间了。最后定位到时再往一个数组中添加新数组的过程中消耗了很多时间。
在调试过程中,发现在处理小数据的时候,用PHP自带的函数比如array_merge的性能与直接开辟空间的方法处理速度相当,但是当数据上去了之后,直接开辟空间的方法的优势就显示出来了。所以在操作小数据时候,为了代码简洁可以直接使用PHP自带的函数。
现在我们来测试下:
array_merge测试:
时间列表(时间保存小数点10位)
开辟空间方式:
测试数据时间和前面一样。
现在我把测试数据添加到20000,他们测试时间如下,array_merge花费的时间比直接开辟空间的方式多。
由此可见大数据时候推荐使用直接开辟空间方式,小数据时候用户自带函数。
note:当前面的source数据越来越大时候array_merge每次合并数组的时候,花费的时间开销成倍数增长。(我测试时候在一万以内每秒处理一千多个,达到一万以上速度一下子就慢下来了,每秒只能处理几十个数组,直接开辟空间处理速度还是没有发生变化)
平时在工作中,我们经常看到一段运行很正常的功能代码,一旦遇到用户并发请求的时候,总会出现一些让人意外的bug。
首先来看下这2个方法,一个从redis中取数据,一个往redis中存数据:
|
|
现在调用这2个方法,并且在redis的cacheKey中存入一个数组。
然而在用户并发调用上面操作时候会发生什么操作。
首先,如果存在2个并发的用户从redis中获得相同的缓存数据。然后将一个mongoId存入数组,这时候2个用户生成的数组就不一样了,当他们把数据存入redis中时候,第一写入数据库中的数据就会被后面写入的数据给覆盖掉了。从而造成数据的丢失。
因此,平时写代码过程中,我们要考虑到用户正常请求和并发请求的案例。
最近在window2003系统上面部署了一个apache2.4。在运行一段时间,经常出现网页访问不了的现象,但是登录服务器上面看Apache服务还在。看到Apache的日志中报了一个错
我们可以通过通过修改配置文件禁用AcceptEx操作
|
|
设置Win32DisableAcceptEx参数是为了解决“指定的网络名不再可用”的问题的,原因是apache在某些Windows版本上可能兼容性不足,在调用AcceptEx接收请求时可能有问题,只在APAche2.0.49以上版本会有这中问题。
《Apache 2_2 中文版参考手册》winnt(MPM)上说:“AcceptEx()是一个微软的WinSock2 API ,通过使用BSD风格的accept() API提供了性能改善。一些流行的Windows产品,比如防病毒软件或虚拟专用网络软件,会干扰AcceptEx()的正确操作。如果你遇到类似于如下 的错误:一般的解决办法是关闭 AcceptEx()”。也就是说,可能是 Windows Update 或是防火墙、防毒软件更新了某些网络原件,造成 Microsoft WinSock v2 API 动作不正常,会干扰WinSock2 API,就会影响AcceptEx()的正确操作,就可能出现上面所出现的问题。
另外在网络上搜索到在Apache的配置文件里面添加Win32DisableAcceptEx参数以后还是会出现“指定的网络名不再可用”,网上提供了如下进一步解决办法:
1、网上邻居-;本地连接-;属性-;internet协议(TCP/IP)-;属性-;高级-;wins标签-;去掉启用LMhosts查询前的勾.
2、控制面版-;windows防火墙-;高级标签-;本地连接设置-;服务的标签里勾选安全Web服务器(HTTPS)。
3、然后退出Apache,再打开启动就可以了 ,一定要先停止,在开启即可。
|
|
一个内存优化:禁用内存映射
内存映射会消耗我们过多的内存,发送文件会消耗我们过多的缓存空间,会造成通道异常,堵塞。
这个问题我的解决方案是:
ArrayDataProvider may be used in the following way:
今天在配置lnmp环境时候,出现nginx在解析PHP文件时候总是页面总是出现空白。查看nginx日志也没有报错。
查了一下资料才知道是原来是fastcgi-params文件中少配置了
fastcgi-params详解:
在使用mongodb查询数据时候,有些字段是数组,我们需要在用$all来查询数据。($all的条件值是数组)
源数据:
查询包含”first”,”second”的数据
用$all会搜索出包含查询条件中的所有元素的数据。查询值各个元素的的关系是与的关系。但是如果我们想查询满足他们之间关系是或关系的数据,这个时候我们要使用$in这个操作。
在mongodb中用$in来查询数据数据不会按照数组的顺序来显示结果。(扩展:在MySQL数据库中in操作查询数据可以find_in_set来显示数据的顺序)
在查询mongodb中,我们经常需要数据排序。在用到排序的时候我们自然用到了mongodb提供的sort这个方法。
然而在用到sort方法时候,我们会遇到一些问题。
1.在mongodb export的工具时候,mongodb export提供很多参数给用户到处数据。其中一个–sort参数提供给我们排序数据。在用到这个参数时候,要查看你本地安装的mongodb export版本是否支持,我用过2.0,2.6和3.0版本的mongodb export其中2.0是不支持–sort这个参数的。所以在用这个参数时候,要做出兼容处理,不要因为版本不兼容的问题导致我们程序的崩溃。
2.mongodb的sort在使用的时候有一个很重要的限制问题。mongodb排序的最大数量是100M,当排序的数据量超出100M时候,mongodb就会抛出异常。在2.6版本之后,mongodb提供了一个一个方案去解决这个问题。
|
|
3.mongodb sort索引问题
在mongodb官网上面有这样一段话
把$sort放置在$project, $unwind, and $group aggregation operators之前可以用到索引,之后就不会用到索引。[点击]
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true