王骏的博客 http://blog.okbase.net/JO2000 大文件断点续传(几个JS开源库及文章) http://blog.okbase.net/JO2000/archive/56546.html JO2000 2018/2/10 21:24:21 http://www.zhangxinxu.com/wordpress/2013/11/xmlhttprequest-ajax-localstorage-%E6%96%87%E4%BB%B6%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/

 

https://github.com/transloadit/uppy

 

https://github.com/23/resumable.js

 

https://github.com/flowjs/flow.js

 

]]>
thinkphp5中的模板引擎 http://blog.okbase.net/JO2000/archive/56506.html JO2000 2017/12/24 14:32:00 1、thinkphp5自带的模板引擎

和tp3中的模板引擎基本一致

 

2、twig模板引擎
http://www.thinkphp.cn/topic/43078.html

 

3、Laravel Blade模板引擎

http://www.thinkphp.cn/extend/946.html

 

4、think-angular 模板引擎
此模板引擎针对能够使用angularjs的php开发者编写, 主要特点是 不需要额外的标签定义, 全部使用属性定义, 写好模板文件在IDE格式化代码的时候很整洁, 因为套完的模板文件还是规范的html
https://www.kancloud.cn/shuai/php-angular

 

5、Smarty
比较古老了。

 

【对比】
smarty与twig的性能对比,结论是twig比smarty慢
http://blog.csdn.net/jaketseng/article/details/7829431

 

twig模板引擎与thinkphp自带模板引擎比较
https://www.jianshu.com/p/d7c931978e37

 

 

]]>
PHP判断是不是通过HTTPS访问 http://blog.okbase.net/JO2000/archive/56505.html JO2000 2017/12/22 19:48:19 有时候$_SERVER['HTTPS']是无法取得值的,保险起见应该这样:

 

$ishttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;

]]>
微擎数据库表结构 http://blog.okbase.net/JO2000/archive/56504.html JO2000 2017/12/20 20:19:21 微擎数据库表结构,供参考!

 

字段名功能
ims_account 公众号账户表
ims_account_wechats 微信公众号账户详情表
ims_account_yixin 易信公众号账户详情表
ims_activity_coupon 折扣券活动表
ims_activity_coupon_allocation 卡券活动投放表
ims_activity_coupon_modules 卡券活动模版表
ims_activity_coupon_password 卡券核销人员密码表设置微信核销人员的帐号信息和密码
ims_activity_coupon_record 卡券使用记录表
ims_activity_exchange 积分兑换表
ims_activity_exchange_trades 兑换商品记录表
ims_activity_exchange_trades_shipping 商品兑换详情表
ims_activity_modules 活动模版使用表
ims_activity_modules_record 兑换记录模版表
ims_activity_stores 门店列表
ims_album 相册列表
ims_album_category 相册分类表
ims_album_photo 相册详情表
ims_album_reply 相册回复表
ims_article_category 文章分类表
ims_article_news 文章新闻表
ims_article_notice 文章提示表
ims_article_reply 文章回复表
ims_article_unread_notice 文章未阅读提示表
ims_basic_reply 基础回复表
ims_bbb_reply
ims_bbb_share
ims_bbb_user
ims_bbb_winner
ims_bi_restaurant_sysset 私厨系统设置表
ims_bigwheel_award 大转盘奖励表
ims_bigwheel_fans 大转盘粉丝表
ims_bigwheel_reply 大转盘回复表
ims_business 商户表
ims_core_attachment 核心文件-附件表
ims_core_cache 核心文件-缓存表
ims_core_menu 核心文件-菜单表
ims_core_paylog 核心文件-支付日志表
ims_core_performance 核心文件-运行情况表
ims_core_qqrobot 核心文件—QQ机器人发送管理表
ims_core_queue 核心文件—队列表
ims_core_queue_backup 核心文件—备用队列表
ims_core_resource 核心文件-资源表
ims_core_sessions 核心文件-进程表
ims_core_settings 核心文件-设置表
ims_core_wechats_attachment 核心文件-微信附件表
ims_coupon 卡券表
ims_coupon_location 店铺信息表
ims_coupon_modules 卡券模块表
ims_coupon_record 卡券核销表卡券核销情况
ims_coupon_setting 卡券设置表主要包括LOGO和白名单
ims_coupon_shakearound 摇一摇周边表
ims_coupon_shakearound_log 摇一摇周边表(日志)
ims_cover_reply 菜单响应表
ims_custom_reply 用户回应表
ims_dqq_award
ims_dqq_reply
ims_dqq_winner
ims_egg_award 砸蛋-奖励表
ims_egg_reply 砸蛋-回复表
ims_egg_winner 砸蛋-胜利表
ims_ewei_exam_course 测试项目表
ims_ewei_exam_course_category 测试项目分类表
ims_ewei_exam_course_reserve 测试项目服务表
ims_ewei_exam_member 测试会员列表
ims_ewei_exam_paper 测试文件表
ims_ewei_exam_paper_category 测试文件-分类表
ims_ewei_exam_paper_member_data 测试文件-会员数据表
ims_ewei_exam_paper_member_record 测试文件-会员记录表
ims_ewei_exam_paper_question 测试文件-提问表
ims_ewei_exam_paper_type 测试文件-分类表
ims_ewei_exam_pool
ims_ewei_exam_question 测试问题表
ims_ewei_exam_reply 测试回复表
ims_ewei_exam_sysset 测试系统设置表
ims_guitar_chord 吉他-和弦表
ims_guitar_english 吉他-中英文对照表
ims_guitar_shoponline 吉他-门店列表
ims_guitar_shopsearch 吉他-门店搜索表
ims_heka_list
ims_heka_reply
ims_hotel2
ims_hotel2_brand
ims_hotel2_business
ims_hotel2_member
ims_hotel2_order
ims_hotel2_reply
ims_hotel2_room
ims_hotel2_room_price
ims_hotel2_set
ims_hx_stores
ims_hx_subscribe_apply
ims_hx_subscribe_article
ims_hx_subscribe_data
ims_ibeacon_activities
ims_ibeacon_activity_gifts
ims_ibeacon_devices
ims_ibeacon_fans
ims_ibeacon_gifts
ims_ibeacon_profiles
ims_ibeacon_records
ims_images_reply
ims_lxy_marry_info
ims_lxy_marry_list
ims_lxy_marry_reply
ims_mc_card 用户卡券表
ims_mc_card_care 用户卡券-关怀表
ims_mc_card_credit_set 用户卡券-信用设置表
ims_mc_card_members 用户卡券-会员表
ims_mc_card_notices 用户卡券-提醒表
ims_mc_card_notices_unread 用户卡券-提醒未阅读表
ims_mc_card_recommend 用户卡券-推荐表
ims_mc_card_record 用户卡券-记录表
ims_mc_card_sign_record 用户卡券-签名记录表
ims_mc_cash_record 用户卡券-现金日志表
ims_mc_chats_record
ims_mc_credits_recharge
ims_mc_credits_record 积分日志表
ims_mc_fans_groups
ims_mc_groups
ims_mc_handsel
ims_mc_mapping_fans
ims_mc_mapping_ucenter
ims_mc_mass_record
ims_mc_member_address
ims_mc_member_fields 微信端用户信息字段设置表
ims_mc_members
ims_mc_oauth_fans
ims_menu_event
ims_mobilenumber
ims_modules
ims_modules_bindings
ims_music_reply
ims_news_reply
ims_old_weixin_fakeid
ims_profile_fields 用户信息字段设置表
ims_qrcode
ims_qrcode_stat
ims_research
ims_research_data
ims_research_fields
ims_research_reply
ims_research_rows
ims_restaurant_address
ims_restaurant_adminset
ims_restaurant_biz_set
ims_restaurant_cart
ims_restaurant_category
ims_restaurant_express
ims_restaurant_fans
ims_restaurant_fans_like
ims_restaurant_genius
ims_restaurant_goods
ims_restaurant_merchant
ims_restaurant_order
ims_restaurant_order_goods
ims_restaurant_reply
ims_restaurant_set
ims_restaurant_shop
ims_restaurant_supply
ims_restaurant_sysset
ims_rule
ims_rule_keyword
ims_shake_member
ims_shake_reply
ims_shopping3_address
ims_shopping3_adminset
ims_shopping3_biz_set
ims_shopping3_cart
ims_shopping3_category
ims_shopping3_express
ims_shopping3_fans
ims_shopping3_fans_like
ims_shopping3_genius
ims_shopping3_goods
ims_shopping3_order
ims_shopping3_order_goods
ims_shopping3_reply
ims_shopping3_set
ims_shopping3_shop
ims_shopping3_sysset
ims_site_article
ims_site_category
ims_site_multi
ims_site_nav
ims_site_page
ims_site_slide
ims_site_styles
ims_site_styles_vars
ims_site_templates
ims_solution_acl
ims_stat_keyword
ims_stat_msg_history
ims_stat_rule
ims_survey
ims_survey_data
ims_survey_fields
ims_survey_reply
ims_survey_rows
ims_uni_account
ims_uni_account_group
ims_uni_account_modules
ims_uni_account_users
ims_uni_group 套餐表
ims_uni_settings
ims_uni_verifycode
ims_userapi_cache
ims_userapi_reply
ims_users 后台登录用户表
ims_users_group 后台登录用户组表
ims_users_invitation
ims_users_permission
ims_users_profile 后台登陆用户信息表
ims_video_reply
ims_voice_reply
ims_vote_fans
ims_vote_option
ims_vote_reply
ims_we7car_album
ims_we7car_album_photo
ims_we7car_brand
ims_we7car_care
ims_we7car_message_list
ims_we7car_message_set
ims_we7car_news
ims_we7car_news_category
ims_we7car_order_data
ims_we7car_order_fields
ims_we7car_order_list
ims_we7car_order_set
ims_we7car_series
ims_we7car_services
ims_we7car_set
ims_we7car_type
ims_weblogin_fakeid
ims_weblogin_fakeid_t
ims_weblogin_mapping_fakeid
ims_weblogin_queue
ims_weihaom_wb_reply
ims_weihaom_wb_user
ims_weipos_employee
ims_weipos_goods
ims_weipos_goods_category
ims_weipos_goods_store
ims_weipos_ibeacon
ims_weipos_ibeacon_log
ims_weipos_member
ims_weipos_member_group
ims_weipos_member_group_mapping
ims_weipos_member_location_log
ims_weipos_member_log
ims_weipos_merchant
ims_weipos_store
ims_weipos_wifi_log
ims_weixin_cookie
ims_weixin_flag
ims_weixin_member
ims_weixin_shake_toshake
ims_weixin_vote
ims_weixin_wall
ims_weixin_wall_num
ims_weixin_wall_reply
ims_wxwall_award
ims_wxwall_members
ims_wxwall_message
ims_wxwall_reply
ims_zzz_reply
ims_zzz_share
ims_zzz_user
ims_zzz_winner
pre_blueidea_weixin_member
pre_weixin_fakeid
pre_weixin_member
]]>
记一次MySQL高并发时CPU占用率达到100%问题的解决 http://blog.okbase.net/JO2000/archive/56493.html JO2000 2017/12/10 19:43:25 系统是在ecshop基础上做的定制,siege进行压力测试访问category.php时,50用户100次就使CPU占用率达到100%,系统停止响应。

按照《解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记 https://www.xiaohui.com/weekly/20070307.htm》一文提供的方法优化了mysql的配置,情况依旧。
因没有SUPER权限,用show processlist;没啥效果,所以只能手工检查代码。

 

includes目录下的cls_mysql.php中的query函数是所有SQL执行时最终调用的函数。当DEBUG_MODE=8时会记录所有sql语句到log文件中。

 

一、发现重复执行的数据库操作函数
执行一次category.php后,得到所有SQL命令,发现里面有大量重复执行的SQL。到底是谁调用了这些SQL命令,在query函数里加上:
if(strpos($sql, '这里填SQL语句的关键词') > 0) {
$array = debug_backtrace();
print_r($array);
}

打印出调用堆栈,比较容易地找到调用源头。发现在一个循环中调用了重复的数据库操作函数,将之移出。

 

二、发现未索引的表
在SQL命令前加上EXPLAIN,例如 EXPLAIN SELECT * FROM ecs_products WHERE product_id=1000; 这样很容易找到索引没有起作用的SQL命令。

 

经过这两项修改,成功地解决了MySQL高并发时CPU占用率达到100%的问题。

]]>
重装Windows默认TCP/IP协议(亲测有效) http://blog.okbase.net/JO2000/archive/56461.html JO2000 2017/11/25 20:40:45 1、运行regedit.exe,打开注册表编辑器,删除以下两个键(删除前可以导出备份一下):

HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Winsock
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Winsock2

 

2、用记事本打开c:\windows\inf\nettcpip.inf文件,找到:
[MS_TCPIP.PrimaryInstall]
Characteristics = 0xa0 <------把此处的0Xa0改为0x80 保存退出

 

3、打开本地连接的TCP/IP属性,添加协议,从磁盘查找,浏览找到刚刚保存的nettcpip.inf或者nettcpqmt.inf(X:/windows/inf/)文件,然后选择“TCP/IP协议”(不是选择那个TCP/IP 版本6)。
经过这一步之后,又返回网络连接的窗口,但这个时候,那个“卸载”按钮已经是可用的了。点这个“卸载”按钮来把TCP/IP协议删除,然后重启电脑。

 

4、重启后再照着第3步,重新安装一次TCP/IP协议。

 

5、再重启一次,这时就可以了,可以照着需要,设置一下IP地址。

]]>
ThinkPHP的ISAPI_Rewrite静态转写规则 http://blog.okbase.net/JO2000/archive/56433.html JO2000 2017/10/18 21:43:38 Apache环境下ThinkPHP的转写规则是这样的:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

但在IIS里用ISAPI_Rewrite3来转写,上面的规则不好使,可以采用如下规则:

<IfModule mod_rewrite.c>
  RewriteEngine On
  Options +FollowSymLinks
  
  RewriteRule ^(Public|admin)($|/) - [NC,L]
  
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  
  RewriteRule ^/$ /home/index/index [NC,L]
  RewriteRule ^index.php/(.*)$ index.php/$1 [NC,L]
  RewriteRule ^(.*)$ index.php/$1 [NC,L]
</IfModule>

把首页转写为 /home/index/index,并过滤掉Public目录的转写。

]]>
PHP应该下载安装线程安全还是非线程安全版本? http://blog.okbase.net/JO2000/archive/56430.html JO2000 2017/10/17 11:38:08 Windows下的PHP分为线程安全Thread Safe和非线程安全Non Thread Safe版本。

如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;
而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本运行效率更高。

 

在PHP的下载页面http://windows.php.net/download,对于PHP5有下面几个版本:
1)x86 Non Thread Safe
这是32位非线程安全版本, 适合以FastCGI模式运行PHP
2)x86 Thread Safe
这是32位线程安全版本,适合以ISAPI方式运行PHP
3)x64 Non Thread Safe
这是64位非线程安全版本, 适合64位操作系统中以FastCGI模式运行PHP
4)x64 Thread Safe
这是64位线程安全版本,适合64位操作系统中以ISAPI方式运行PHP

 

]]>
微擎通过订阅号借权(认证服务号)获取微信用户信息 http://blog.okbase.net/JO2000/archive/56428.html JO2000 2017/10/13 20:34:10  

粉丝未关注公众号获取资料时,需要弹出确认授权的登录框,粉丝同意后公众号才可以获取到用户信息,此操作需要手动调动函数来完成。 通过 mc_oauth_userinfo() 来获取粉丝信息。

 

$fans = $_W['fans'];
if(empty($fans['nickname'])){
    load()->model('mc');
    $fans = mc_oauth_userinfo();
}
var_dump($fans);

更多信息请参考:https://www.kancloud.cn/donknap/we7/135455

]]>
微擎 Hack (1) – 启动过程 http://blog.okbase.net/JO2000/archive/56423.html JO2000 2017/10/11 20:30:34 作者:huangwc

由于在开发过程中,发现有一些很不厚道的设置,让我不得不试图去修改一些微擎的 Kernel 代码,下面将探索的过程笔记一下。


同时也记录一下我的问题本身: 我希望重用微擎的用户系统,微擎的设计中,用户相关的库表在 ims_members 相关的表中,主键是 uid; 可以通过用户登录微擎后台,通过统一的验证使用后台的逻辑; 一个公众号只能捆绑到一个用户上面(用户指定当前公众号的时候,该公众号会指定给该用户),通过右上角的公众号切换处切换,一个用户切换上去,原来的用户就会被切换下来(这一点太蛋疼了,以至于无法做出稳定的用户 – 管理的微信号假设,问题还在后面)。 在没有设置当前公众号的情况下,很多功能会返回错误页面——请您从“管理公众号”或是从顶部“切换公众号”选择要操作的公众号! 我现在要做的事情是:要创建一些其他的系统角色用户,但是必须能够自己设置权限访问到我插件指定的 site.php 和 mobile.php 指定的模块,这些页面在这种情况下,都会显示第4点的错误信息。 那么现在我要做的就是,在 kernel 里面把这个跳过去。


一、哪些公众号是当前登录用户可以管理的(设置为当前)

全局搜索代码——“请切换公众号”,定位到 frame.tpl.php

发现点击下方的公众号按钮会跳转这个 url:

create_url(‘account/switch’, array(‘id’ => $account[‘weid’]));

就是这段,继续深究:

发现获取当前“可切换公众号”的逻辑在 account.mod.php 的 account_search() 方法中:

如果是根用户 $_W[‘isfounder’] = true 或者 ims_wechats 的 uid(公众号管理员)是当前登录的 uid 的时候,可以切换到该 ims_wechats.weid 指定的公众号。

 

二、“切换公众号”的动作在哪里

以上,找到 /source/controller/account/switch.ctrl.php

业务逻辑如下: 先从 $_GPC 即 get post cookie 获取 id 字段; 用这个 id 获取 ims_wechats 里面的公众号记录; 检查公众号是否存在,并且当前用户是否有权限管理这个公众号; 执行切换操作; 执行切换操作是如下几行:

cache_write(‘weid:’ . $_W[‘uid’], $row[‘weid’]); isetcookie(‘__weid’, $row[‘weid’], 7 * 46800); message($row[‘name’], ”, ‘success’);

干得好!就在这里,结论应该就是在这里: 1. 只要 $_GPC 定义了 weid,并且当前用户有权限,“当前公众户就是这个”; 2. 加载的同时还会将 __weid 写入 cookie,作为当前客户访问的 __weid; 3. 同时还会将 {key: ‘weid:{weid}’, value: uid} 写入 ims_cache 表;


三、ims_cache 里面的这个 weid:{weid} 干什么用的

看起来在全局的 cache 里面将公众号指定给一个用户,就已经将这个公众号绑死给一个人了,这样极是危险,起码 yy 一下就觉得只要在同一个公众号上面重复 switch 还是会把另一个人踢出去。

于是找一下 ‘weid:’ 这个关键词,看看 cache 里面这个东西是造嘛的。

只有在 cache.mysql.func.php 的 cache_read($key) 方法里面有,再查找引用。

经过几层查找,发现 cache.func.php 里面 有个 cache_load($key, $unserialize) 函数,会将 ims_cache 的键值对加载到 $_W 中。

… 好乱。。暂不深究算了。


四、结论及测试

只要在【一】中有权限的登录用户,在 cookie 里面 __weid 字段指定了用户是当前用户,就可以将当前公众号设置为当前公众号。

实测:在 chrome 中直接在 js console 里面运行 cookie.set(‘__weid’, 1),公众号就切换到了,另外在 firefox 里面设置另一个用户,互不影响。

于是,如果想让一个用户登录可以绑定公众号,只需要写一下 cookie 然后刷新页面即可。

或者,在 querystring 里面加入 &__weid=1,也可以突破这个限制!

但是,现在问题是,如果一个用户不具有公众号的管理权限,这一点就有难度了。

但是我实测了一下,居然是可以的!!

这下就一点问题都没有了!

 

转载自:http://www.huangwenchao.com.cn

]]>