比较长的时间没有更新了,因为一直被ecstore的高并发下订单支付状态回写异常所困恼,所以迟迟没有空,现在问题接近解决了,继续来更新一下。ecos的框架确实比较复杂,牵涉到的文件比较多,花了点时间写这篇文章,以供需要的人查阅。
示例执行代码,以用户登录时,更新members表数据为例。
$b2c_members_model->update($member_data,array('member_id'=>$member_id));
以下是所有执行上面那个update所需要执行的sql过程。
1. 执行base/lib/db/connections->exec()中的exec()方法:
$this->exec('UPDATE sdb_base_cache_expires SET expire = "' . $now . '" WHERE type = "DB" AND name = "' . $table . '"', true);
2. 步骤1执行成功后,执行kv存储:
cachemgr::set_modified('DB', $table, $now) base/lib/static/cachmgr->set_modified()
3. set_modified()函数具体如下:
self::store_vary_list(self::fetch_vary_list(true)); //kvstore更新 return self::instance()->set_modified($type, $vary_key, $time); //cache,因不会产生sql请求,故此处不讨论
4. self::fetch_vary_list(true)参数为true时,从数据库取数据,并返回数组格式vary_list,vary_list为base_cache_expires表里的type和name字段返回的array。
5. self::store_vary_list(vary_list) 返回代码:
return base_kvstore::instance('cache/expires')->store('vary_list', $vary_list);
6.base/lib/kvstore->store方法中,检查是否需要持久化,即config.php文件中的定义WITHOUT_KVSTORE_PERSISTENT,如果需要,则调用persistent()。
7. persistent()方法内容:
kernel::single('base_kvstore_mysql', $this->get_prefix())->store($key, $value, $ttl);
8. base/lib/kvstore/mysql->store()将vary_list存入base_kvstore表中做永久存储。
PS,vary_list是以数组的格式作为$data,传递进return app::get(‘base’)->model(‘kvstore’)->update($data, array(‘id’=>$rows[0][‘id’]))进行更新的,在base/lib/db/model中通过base_db_tools::quotevalue函数进行序列化之后存储在value字段中。
9. 执行base/lib/db/connections->exec()中最后mysql_query($sql,$db_lnk)进行对b2c_members表的更新请求。