一、使用PHP exec 启动 php 服务,出现 [php] <defunct>
ps -auxf //查看进程树
exec('/usr/bin/php SwooleConsole.php -a start')
程序中,禁止使用此函数
二、 大数据处理-添加
(1) 拼接SQL
1、for 循环坚决不能处理相关I/O操作,比如数据库操作,Redis
2、for 循环处理拼接SQL语句,查看 max_allowed_packet size
,请求报文大小
3、执行SQL语句,username 保证Unique 唯一性,获取插入ID
4、使用SELECT * FROM table WHERE username in ()
,查询获取对应id-username 关系
(2)关闭自动提交可以提高导入效率
在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入结束后执行set autocommit=1,恢复自动提交,可以提高导入效率。
三、大数据处理-更新
一般情况下,我们在更新批量操作的时候都使用循环更新数据
foreach ($data as $id => $val) {
$sql = "UPDATE user SET name = $val WHERE id = $id";
mysql_query($sql);
}
即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。
mysql并没有提供直接的方法来实现批量更新,但是可以用小技巧来实现。
将条件语句写在了一起。这里的where部分不影响代码的执行,但是会提高sql执行的效率
UPDATE user
SET name = CASE id
WHEN 1 THEN 'zhangsan'
WHEN 2 THEN 'lisi'
WHEN 3 THEN 'wangwu'
END
WHERE id IN (1,2,3)
这句sql的意思是,更新 user 字段,
如果id=1 则 name 的值为 'zhangsan',
如果id=2 则 name 的值为 'lisi',
如果id=3 则 name 的值为'wangwu'。
$all = (new UsersModel)->get()->toArray(); // 数据查询二维数组
$all_data = [];
foreach ($all as $k=>$v){
$id = $v['id'];
if($id > 1){
$username = trim($v['username']);
$all_data[$id] = md5($username);
}
}
$ids = implode(',', array_keys($all_data));
$sql = "UPDATE mpa_users SET passwd = CASE id ";
foreach ($all_data as $id => $ordinal) {
$sql .= " WHEN {$id} THEN '{$ordinal}' ";
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
使用这种方式更新,性能有很大提升。
网友评论