开发、架构总结
1、
简单、直接
2、
php 流,java 流的好处
3、
php序列化和json的区别
http://www.cnblogs.com/gnielee/archive/2009/08/02/1536906.html
4、
php合并两个数组注意点
如果两个数组的key值唯一,不一样,并且有特殊含义,合并数组的时候,不能用array_merge(),否则会把key值重新按0开始计算,要用+号,会保留之前的key值。
如果两个数组的key值有重复,并且没有特殊含义,合并数组的时候,不能用+号,否则可能不会合并成功。要用array_merge(),这样只是key值重新从0开始排序。
5、
获取数组的一部分如何保留之前的键值
$temp_array = array_slice($temp_array, $start,intval($end-$start),true);加上这个true,就会保留之前数组的key值。如果不加,如果之前数组的键值是数字,就会丢失,按照0重新排序。
6、
理解preg_match_all,preg_split的用法
7、
画流程图很重要,便于理解
8、
mysql的where子句也有正则表达式查询。php,java也有正则匹配,估计其他语言也有。
select * from * where test REGEXP '"baidu_info":"[^"]' order by id desc limit 2\G;
9、
使用fsockopen异步调用脚本,适用于高并发调用脚本。为了测试被调用脚本是否被调用,可以用file_put_contents()把记录写到文件中,可以记录代码执行到哪一行。有时候跟踪到数据,有时候不行,不行的原因是被调用脚本出现错误(有时候是可以忽略的错误,但是用ini_set('display_errors', true);error_reporting(E_ALL);打开错误之后,也会导致被调用脚本执行错误,这是可以将错误显示关闭)。本地调试的时候,域名要配成本地的ip地址,不能配成127.0.0.1 域名。正式环境调用域名访问脚本的时候,确保发布的脚本同步到各个服务器(找运维),否则通过域名调用脚本的时候,可能调不通。本地测试的时候,更改被调用脚本的域名时,需要重启apache服务器才能生效。order by id 很影响性能
php的错误日志要谨慎使用
10、
记录日志的两种方式,可以记录在数据库表中,也可以记录在服务器的文件中。
建议记录到服务器的文件中,因为如果数据量很大,无法保存在数据库的表中。也不会影响数据库表的性能。
@file_put_contents('each_send.log',print_r( json_encode($temp_array),true),FILE_APPEND);
11、
记录日志的方式
可以接收参数,将最终的数据打印出来,这是一个很好的方法,要么记录到文件里面,要么记录到数据库表里面,要么打印出来,灵活处理。
http://hi.baidu.com/hdjdcyl/item/285d2b93f8293cf1291647cd
12、
json_decode($str,true);得到是数组
json_decode($str);得到的是对象
13、
数据库超时;接口超时。
http://dev.mysql.com/doc/refman/5.0/en/error-handling.html
mysql_errorno()
14、
php超时处理全面总结
http://wenku.baidu.com/view/de459c42e45c3b3567ec8b37.html
15、
缓存的威力很巨大。
if (class_exists('Memcache')){
$memcache = new Memcache;
$memAvailable = $memcache->connect(MEMCACHED_HOST, MEMCACHED_PORT);
}
if ($memAvailable) {
$memKey = 'project_'.md5(json_encode($temp_array));
$res_temp = $memcache->get($memKey);
}
if (!$res_temp) {
try {
$res_temp = $client->request(RESTFUL_GET, $url, $temp_array,60);
} catch (Exception $e) {
}
if ($res_temp) {
$memcache->set($memKey,$res_temp,0,43200);//12个小时
}
}
http://wenku.baidu.com/view/d528c6340b4c2e3f5727633c.html
http://wenku.baidu.com/view/bbb7a14d767f5acfa1c7cda0.html
16、
进程锁
$command = "ps aux | grep 'order/*.php' | grep -v 'grep' | grep -v '/bin/sh' | wc -l";
需要注意的地方是
在服务器的crontab配置必须是
* * * * * (cd /opt/tuniu/www/crm/scripts/order/; /opt/tuniu/php/bin/php /opt/tuniu/www/crm/scripts/order/*.php)
红色字体部分,进程锁命令中文件及其路径必须是crontab配置文件及其路径中的一部分。
否则进程锁无法正确获取到当前进程的数量
17、
看书,可以这样,为了扩展知识,知道能作什么就可以。想想什么场景会用到。
18、
http://www.cnblogs.com/umlonline/p/3531288.html
19、
对应restful接口,为了必须不知道哪个地方输出echo,导致最终调用方base64解密失败,json节目失败。
采用
ob_start();
ob_get_clean();
将额外的输出echo放在缓冲区里面并删除掉。
20、
将日志记录在数据库中,如果超过mysql的最大连接数,就会插入失败,以后还是把日志记录在服务器的文件上面。
21、
ps aux|grep '*'
在linux服务器上面使用上面的命令即可显示当前用户的连接数。如果sql语句写的不好,导致查询很慢,需要终止数据库查询连接,就可以使用上面的命令显示当前的连接,然后kill -9 进程号即可。
22、
什么情况下需要用到异步?
场景分析:
编辑产品推送搜索基本信息,如果实时推送,加入mq挂掉了,就会影响客服编辑产品的性能,改为编辑的时候,将产品id插入数据库表中。
另外一个脚本扫描表中的数据(产品id),组装产品信息数据,推送到搜索。
两个功能点:
1、客服编辑产品,并将产品设为已审核。
2、将产品设为已审核之后推送产品信息到搜索。
第一个操作对性能要求很高,如果程序处理缓慢,影响客服体验。
如果客服将产品设为已审核立即推送产品信息到搜索,肯定影响性能,如果mq挂掉,更加影响。
需要一个中间结点将二者联系起来。
设为已审核=》插入产品id到数据库表(也可以是mq)=》脚本扫描这张表,组装产品数据推送到搜索=》如果产品id很多,发现扫描处理很慢,多个脚本同时扫描(查询奇偶id)(多个脚本获取mq)。
散客票获取也是这样做的。
场景分析:
一个脚本的功能如下:调用第三方接口获取散客票信息存入表中然后更新所有散客票的价格。
因为是获取所有散客票的信息,并且更新所有散客票的价格,所以这个脚本执行速度很慢,大概好几个小时才能执行一次。
由于散客票价格经常变动,需要及时更新散客票的最新报价,并且同步到前台。
很明显现在的脚本不能满足需求。脚本执行时间很长,想让脚本一个小时执行一次是不可能的。
怎么办?只能将这个脚本拆成多个脚本。拆成脚本如下:
脚本1调用第三方接口获取散客票信息存入表中。
脚本2查询这些表更新所有散客票的价格。
上线之后发现脚本1和脚本2还是有些慢,可以多进程调用,比如分别设为10个进程来调用,进程数不能设置太多,设置太多,apache的进程总数是固定的,这两个脚本占用的进程数太多,会影响其他功能,比如下单进程。之前遇到的问题是,晚上推送搜索的进程总数是255个,但是apache的进程总数是300个,还剩45个进程。如果这时下单进程超过45个,就会提示下单失败。
缩短全量脚本的执行总时间的方法还包括:
加大每个进程脚本的查询量,比如之前是查询50条,现在改成2000条。
之前每个脚本2分钟左右执行完毕,但是全量执行总时间是6个小时;
现在每个脚本5分钟左右执行完毕,但是全量执行总时间只需要1个小时。
这样虽然每个脚本执行时间延长一倍,但是1个小时就全量更新了,虽然一个脚本的执行时间延长,但是执行总时间缩短,可以满足业务的需求。