Jul21

array_map,array_filter,array_walk区别小记

Author: leeon  Click: 10141   Comments: 0 Category: php  Tag: array_map,array_filter,array_walk,php,trim

array_walk:

array_walk()返回布尔值,如果回调函数需要直接作用于数组中的值,则给回调函数的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。此函数可以同时获取到数组的key和value。

array_map:

array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。

简单点说就是回调函数对数组中每个值都会产生最终影响,并在调用array_map的返回值中体现。

此函数可以同时对多个数组进行操作。并最终合并为一个数组(每个数组根据下标平行对其到同一个二维数组中)。


array_filter:

此函数是专门用于过去数组中的元素,简单点说就是对数组中的经过回调函数判断的value进行过滤,并通过array_filter()函数返回处理后的数组。


因此分析到此我们可以是哟on个array_walk和array_map来做数组的预处理,最常见的是对每个数组值的trim操作。以下是笔者的示例代码:

[code="php"]
<?php
$tmp = array(' AAAA BBBB CCCC ', 'aaaa bbbb c ', ' dddddd eeeeee');

function array_walk_func(&$v, $k) {
$v = trim($v);
}
array_walk($tmp, 'array_walk_func');
var_dump($tmp);

function array_map_func($v) {
return trim($v);
}
$ret = array_map('array_map_func', $tmp);
var_dump($ret);
[/code]

输出结果:

[code="php"]
array(3) {
[0] =>
string(14) "AAAA BBBB CCCC"
[1] =>
string(11) "aaaa bbbb c"
[2] =>
string(13) "dddddd eeeeee"
}
array(3) {
[0] =>
string(14) "AAAA BBBB CCCC"
[1] =>
string(11) "aaaa bbbb c"
[2] =>
string(13) "dddddd eeeeee"
}

[/code]

Dec20

【原创】PHP中关于mysqli_affected_rows作用行数返回值的小记

Author: leeon  Click: 10106   Comments: 0 Category: php  Tag: php,mysqli_affected_rows,mysqli

mysqli中关于update操作影响的行数可以有两种返回形式:

1. 返回匹配的行数

2. 返回影响的行数

默认情况下mysqli_affected_rows返回的值为影响的行数,如果我们需要返回匹配的行数,可以使用mysqli_real_connect函数进行数据库连接的初始化,并在函数的flag参数位加上:

MYSQLI_CLIENT_FOUND_ROWS return number of matched rows, not the number of affected rows

 

Aug16

【原创】为PHP增加LDAP扩展模块支持

Author: leeon  Click: 19883   Comments: 0 Category: php  Tag: php,ldap,so,ldap2-devel

今日需要部署一套ldap的测试环境,但发现现有php并不支持ldap模块,遂打算重新编译so,但这种方式比较麻烦并且繁琐,如果仅仅是增加一个ldap模块可以通过phpize和configure的方式编译外挂加载ldap的so文件来使php支持ldap扩展拓展。

第一步是找到当前运营环境的php版本,并将此版本的源码包放入运营机器某个目录,解压。

第二步

[code="bash"] cd /xxx/xxx/php-5.2.17/ext/ldap/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-ldap[/code]

但是检查过程异常退出,提示如下错误:

 [code="bash"]
checking for LDAP support... yes, shared
checking for LDAP Cyrus SASL support... no
checking for 3 arg ldap_set_rebind_proc... yes
checking for ldap_parse_result... no
checking for ldap_parse_reference... no
checking for ldap_start_tls_s... no
checking for ldap_bind_s... no
configure: error: LDAP build check failed. Please check config.log for more information.
[/code]

始终验证不通过,这时候排查openldap2-devel版本,以为此版本比较老,就往高版本升级,但是依旧是同样的错误,最终排查觉得有可能是openldap2-client的版本和openldap2-devel版本不一致导致,于是在网上找了一个和client版本完全匹配的devel rpm包,重新configure顺利通过校验。这个问题比较奇怪,通常情况下编译php是不需要开发包和二进制包版本完全一致,但ldap的编译却需要client和devel包版本完全一致。 

记得在make ,make install之后在php.ini上将ldap.so写入extension扩展配置中。

Jul16

【原创】php中ajax异步阻塞解决

Author: leeon  Click: 14148   Comments: 2 Category: php  Tag: jquery,ajax,php,session

在一个项目中使用php调用pcntl模块实现多进程并发队列任务并通过jquery异步获取后台执行结果,但是在前台ajax轮询后台结果的时候出现阻塞,如图所示:

 

第一个请求是用来启动后台多任务进程deamon的ajax请求,这个请求由于调用pcntl派生子进程执行任务,故这个ajax请求会长时间处于等待响应的状态,后面的请求是每隔400毫秒请求一次后台查找结果。如图一所示,第一个请求发送后,后面的请求一直处于阻塞状态,导致setInterval轮询的请求全部被hold住。当第一个请求任务全部执行完毕后,后面的请求基本在统一时刻去后台拉取结果,这个时候每个请求返回的结果是一摸一样的,也就是说轮询已经不存在实际意义。

在网上找了一些说法,肯定了jQuery是具有非常强大异步并发处理能力,同时也排除了浏览器导致阻塞的可能。从一些文章中找到一种说法是有可能session在使用session file的时候会lock住,导致多个请求会等待第一个请求结束使session file释放,并给出了使用session_write_close函数解决锁文件的问题。

PHP官方文档是有如下解释:

void session_write_close ( void )

End the current session and store session data.

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

在请求的队列逻辑前面加上session_write_close()函数,将session立即写入session file,释放文件,而不是php script执行完毕再写入file,再释放,这样可以避免file长时间锁住,而导致后面请求的逻辑不能读取session file。

改造后的效果非常明显,轮询结果恢复正常:

分类

标签

归档

最新评论

Abyss在00:04:28评论了
Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
shallwe99在10:21:17评论了
【原创】如何在微信小程序开发中正确的使用vant ui组件
默一在09:04:53评论了
Berkeley DB 由浅入深【转自架构师杨建】
Memory在14:09:22评论了
【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
leo在17:57:04评论了
shell中使用while循环ssh的注意事项

我看过的书

链接

其他

访问本站种子 本站平均热度:8823 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次