网站高并发处理

2013/04/23 | 星期二 分类:系统架构 | 没有评论 标签: | 作者: | 1,796 views

时下高并发的问题很Hot,面试中常常会提及到的。但个人认为高并发其实是最不需要考虑的东西,为何,他虚无缥缈,很少有网站真的需要这些东西,而且其中很多技术,其实在开发过程中很多的已经在用了,有这个意识就够了,不需要时刻盯着这个问题而纠结不放。

归纳:从低成本、高性能和高扩张性的角度来说有如下处理方案:
1.HTML静态化,优点不用额外陈述。
2.图片服务器分离,一般使用Lighttpd,.
3.数据库集群和库表散列,web一般用mysql,主从、集群,且数据库单表大于1千万必须分表。
4.缓存,页面缓存,数据查询缓存,比如memcached,图片缓存。
5.镜像,下载采用最多的技术。
6.负载均衡:一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。
阅读全文

PHP招聘MySQL知识点

2013/04/17 | 星期三 分类:求职招聘 | 没有评论 标签: , | 作者: | 1,503 views

PHP基本、基础知识点,Example PHP招聘Mysql知识点,在工作日常用或许亦能用到:
1.php程序中连接数据库,host是localhost,账号是root, 密码是123,查询数据库test中表user的记录并显示出来?

2、查看锁表命令:SHOW FULL PROCESSLIST;
MYSQL取得当前时间的函数是?,格式化日期的函数是:now(),dateformat()
MySQL远程登陆:.
mysql -uroot -p123 -h192.168.1.250
#用户名:root 密码:123
MySQL命令行修改密码:
>mysql -u root -p

3、建立索引:普通索引INDEX、唯一索引UNIQUE INDEX、主键索引PRIMARY KEY、全文索引FULLTEXT
创建:CREATE INDEX <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([…],INDEX[索引名](索引字段))

创建:CREATE UNIQUE <索引名> ON tablename (索引字段)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段)
创表指定索引:CREATE TABLE tablename([…],UNIQUE[索引名](索引字段))

它是唯一索引,一般在创建表是建立,格式为:
CREATA TABLE tablename ([…],PRIMARY KEY[索引字段])

修改:ALTER TABLE tablename ADD FULLTEXT [索引名] (索引字段).

4、优化MYSQL数据库的方法。
a.数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中 文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率;
b.系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master;
c.(a)和(b)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引;
d.写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句;
e.所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然后msql_num_rows.
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update … set title = ? where article_id = ?不要set content = ?(大文本);
f.必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度;.

5.Mysql导出数据
mysqldump –opt -h192.168.1.18 -uUsername -pPassword databaseName>database.sql
#mysqldump –opt -h192.168.1.88 -uwebsites -pseedpaddy -P3396 seedpaddy >E:\abc\seedpaddy.sql
本地服务器机器:
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
#mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

6.mysql导出数据库一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名.
#mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

7.mysql导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

8.mysql导入数据库
进入mysql数据库控制台,如mysql -u root -p
mysql>use 数据库
mysql>set names ‘utf8’
mysql>source d:\db.sql

9.创建数据库
#CREATE DATABASE jacking DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
a.复制表结构及数据到新表
#CREATE TABLE 新表 SELECT * FROM 旧表
b.只复制表结构到新表.
#CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
#即:让WHERE条件不成立.
c.复制旧表的数据到新表(假设两个表结构一样)
#INSERT INTO 新表 SELECT * FROM 旧表
d.复制旧表的数据到新表(假设两个表结构不一样)
#INSERT INTO 新表(字段1,字段2,…….) SELECT 字段1,字段2,…… FROM 旧表
#还可以用REPLACE INTO 这种方法会更好!

10.常用的SQL语句

PHP招聘基础函数库启发性扩展

2013/04/12 | 星期五 分类:求职招聘 | 没有评论 标签: , | 作者: | 2,873 views

基础函数知识点,通过这些可以让自己脑海中的基础函数库有启发性扩展,尤其是在某个紧张时刻看到这些函数、自然连带联想到其他的内置函数:
1.JSON 函数
json_encode — 对变量进行 JSON 编码
#string json_encode ( mixed $value )
$json = ‘{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}’;
json_decode — 对 JSON 格式的字符串进行编码
#json_decode ( string $json [, bool $assoc ] ) 默认为obj,设置为true 返回数组.

2.序列化与反序列化
$serialized_object=’O:1:”a”:1:{s:5:”value”;s:3:”100″;}’;
serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。
unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。返回的是转换之后的值,

3.preg_match_all 进行全局正则表达式匹配,采集数据的时候使用比较多

4.array 函数,罗列特常用的
array_merge — 合并一个或多个数组
array_pop — 将数组最后一个单元弹出(出栈)
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_rand — 从数组中随机取出一个或多个单元
array_search — 在数组中搜索给定的值,如果成功则返回相应的键名
array_shift — 将数组开头的单元移出数组
arsort — 对数组进行逆向排序并保持索引关系
asort — 对数组进行排序并保持索引关系
end — 将数组的内部指针指向最后一个单元 #echo end($array);
krsort — 对数组按照键名逆向排序
ksort — 对数组按照键名排序
rsort — 对数组逆向排序
sort — 对数组排序
shuffle — 将数组打乱
#list — 把数组中的值赋给一些变量.

5、能够使HTML和PHP分离开使用的模板?
Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate

6.在PHP中,$_SERVER
#当前脚本的名称(不包括路径和查询字符串): $_SERVER[‘PHP_SELF’]
#链接到当前页面的的前一页面URL记录在预定义变量:$_SERVER[‘HTTP_REFERER’]
#浏览当前页面用户的 IP:$_SERVER[“REMOTE_ADDR”]
#查询(query)的字符串(URL 中第一个问号 ? 之后的内容):id=1&bi=2 :$_SERVER[“QUERY_STRING”]
#当前运行脚本所在的文档根目录:$_SERVER[“DOCUMENT_ROOT”]

7.参考手册》语言参考》运算符》算术运算符》%为取模运算
echo 8%(-2); #输出0
echo ((-8)%3);#取模 $a % $b 在 $a 为负值时的结果也是负值。输出-2
echo (8%(-3));#输出2

8.见参考手册》函数参考》HTTP函数》header
在HTTP 1.0中,状态码 401 的含义是;未授权
如果返回“找不到文件”的提示,则可用 header 函数,其语句为:header(“HTTP/1.0 404 Not Found”);

9.HTTP协议中几个状态码的含义:503、500、401、200、301、302:
查阅RFC2616,返回码共分5类、41种状态,1XX已经作废了、2XX为成功、3XX为转向、4XX是客户端错误、5XX是服务器错误。
#400=”Bad Request”
#401=”Unauthorized”
#402=”Payment Required”
#403=”Forbidden”
#404=”Not Found”
#405=”Method Not Allowed”
#406=”Not Acceptable”
#详情:http://www.php.net/manual/zh/function.curl-getinfo.php

10.php防止sql注入式攻击,用什么函数转换字符串?
addslashes();

11.php中的文件读写操作,读取文件test.txt中前100字节的内容?.
$handle=fopen(“test.txt”,”r”);
$contents=fread($handle,100);
fclose($handle);

12.preg_replace 正则替换,部分数据启发性扩展

13.String 函数,一些特常用的
addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符
addslashes — 使用反斜线引用字符串
implode — Join array elements with a string #implode(“,”, $array);
ltrim — Strip whitespace (or other characters) from the beginning of a string
rtrim — Strip whitespace (or other characters) from the end of a string
trim — Strip whitespace (or other characters) from the beginning and end of a string
str_replace — Replace all occurrences of the search string with the replacement string #正则替换
ucfirst — #Make a string’s first character uppercase
ucwords — Uppercase the first character of each word in a string
strtolower — Make a string lowercase #全部小写
strtoupper — Make a string uppercase #全部大写
#你常用的php字符串函数?
substr(),implode(),explode(),str_replace(),strpos(),strrev()
#explode ( string $separator , string $string [, int $limit ] )
#如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

B2C系统站群架构

2013/04/09 | 星期二 分类:系统架构 | 没有评论 标签: , | 作者: | 1,725 views

本文是一篇关于B2C网站系统站群架构的文章,笔者的经验之谈。

对于站群系统,在百度百科是这样描述的:站群系统就是一网站的集合,但是一定要统一,分级管理,信息共享,单点登录才可以。最初的站群由政府提出,现在已经应用领域范围很广,例如政府门户网站群、大型企事业网站群、行业网站群等。现在的站群准确的说就是黑豹站群。.

B2C为什么要做站群?对于电子商务网站来说,就是让百度、谷歌收录,一旦收录量上去了,排名上去了,自然盈利的方法就多了!对于电子商务外贸站点来说,主要是google收录与排名,这个类似在大都市繁华地段开了N多实体连锁店,所以就有了这套站群系统的开发,请看图架构:

先看站群架构流程图1:
zhanqun

站群架构商店配置流程图2:
zhanqun_shop
阅读全文

B2C产品属性逐层筛选模块架构

2013/04/07 | 星期日 分类:系统架构 | 没有评论 标签: , | 作者: | 1,606 views

本文简单介绍B2C产品属性逐层筛选模块架构,笔者的经验之谈。

产品属性筛选,适合中小型网站处理,效率不高,但至少实现了电商商品分类页属性逐层筛选功能,先看属性筛选截图1:.
attrbute

大型网站:京东jd.com 兰亭集序:lightinthebox.com 在这方面是这么处理的,2013年以前也是有数量逐层筛选消减的,可目前这两大网站是:属性可以逐层筛选,但不消减、对应属性亦没显示产品数量。
阅读全文

B2C后台权限控制模块架构

2013/04/04 | 星期四 分类:系统架构 | 没有评论 标签: , | 作者: | 1,851 views

B2C小型站点管理后台权限控制模块架构。

网站运营后台,员工登录后台只需要显示相关工作的模块,业务无关的他不需要看到或者普通员工不开放报表统计模块,一些商业信息等,所以有了权限控制功能需求的开发,而且是必须的,电商后台也注定了庞大而严谨,先看如下图1。.
chown

简单权限列表流程图2:
control

从图2可以看出,后台先控制着用户、用户组、角色……具体到用户的时候,分配权限如图1所示,需要什么权限打钩即可,权限可以细分到产品尺寸上下架、产品上下架!要多细就多细。.
阅读全文

Godaddy设置开通SSH

2013/04/02 | 星期二 分类:建站优化 | 没有评论 标签: , | 作者: | 1,648 views

Godaddy主机的SSH功能是免费的,可自行开通。在最近购买的Godaddy主机里,开通SSH也不再需要你删除主机里的所有数据库,而是可以直接在线开通,免除了以前为开通SSH而迁移数据的烦恼,前后只需要不到一分钟就行。具体操作过程如下:

1、首先登陆自己的Godaddy主机管理页面,点击如下图菜单进入SSH开通设置
goddy_ssh

2、随后的选项中输入电话号码(Godaddy开通SSH需要在电话认证, 不会收取费用)
Country Code (国家代码): 中国的国际代码是86
Phone Number (电话号码): 视自己情况输入.
Extension(分机号):一般不用输入
Enable 确定按钮,提交验证,获取PIN码
阅读全文

Mysql数据库优化

2013/03/31 | 星期日 分类:数据库 | 没有评论 标签: , | 作者: | 1,540 views

Mysql数据库优化,对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要!从以下几个方面了解读:恰当的硬件资源、数据库设计、sql语句优化、数据库参数配置

A.合理的硬件资源,Mysql读写分离,数据库集群
2. 如果数据库压力很大,一台机器支撑不了,那么可以用mysql复制实现多台机器同步,将数据库的压力分散。主库master用来写入,slave1—slaveN都用来做select,每个数据库分担的压力小了很多。.
3.利用中间层(中间件)来实现这个代理,对程序来读写哪些数据库是透明的。比如官方有个mysql-proxy。或者使用新浪的amobe for mysql,也可达到这个目的,结构流程图如下 Master_slave

B.数据库设计

1.三范式与适当的数据冗余,已达到高查询效率的目的。

2.适当的建立索引:普通索引INDEX,唯一索引UNIQUE INDEX,主键索引PRIMARY KEY(属于唯一索引一种),全文索引FULLTEXT;另外索引可以是(单列索引与多列索引),还可以对长字段支持前缀索引。
a.选择适当的字段类型,特别是主键
b.效率问题:选择字段的一般原则是保小不保大,能用占用字节小的字段就不用大字段。比如主键用自增类型!
c.外键表示清楚,方便建立索引.
d.Example:datetime和timestamp,datetime占用8个字节,而timestamp占用4 个字节,只用了一半,而timestamp表示的范围是1970—2037,对于大多数应用,尤其是记录什么考试时间,登录时间这类信息,绰绰有余。.

3.对表进行水平划分:单表记录超过千万条时考虑对表水平切分:划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。

4.对表进行垂直划分:记录不多,但占用空间大的表,对字段长占空间大的数据拆分出来,比如:表中的text字段分拆,减少检索表时执行I/O以提高性能,分拆表与原表是一对一的关系。

5.文件、图片等大文件用文件系统存储,不用数据库,Mysql数据库只存储图片路径。

6.掌握表的写入时机,宁可集中批量操作,避免频繁读写:Example 文章访问数据统计,要求不是实时更新的情况下,可以夜深人静的时候批量处理。

7.选择合适的引擎:Mysql提供了很多种引擎,用得最多的是myisam,innodb,memory这三类。

C.SQL语句优化

1.Sql语句优化工具
a.慢日志
如果发现系统慢了,又说不清楚是哪里慢,那么就该用这个工具了。只需要为mysql配置参数,mysql会自己记录下来慢的sql语句。配置很简单,参数文件里配置:
slow_query_log=d:/slow.txt
long_query_time = 2
就可以在d:/slow.txt里找到执行时间超过2秒的语句了。

b.mysqldumpslow.pl
慢日志文件可能会很大,让人去看是很难受的事。这时候我们可以通过mysql自带的工具来分析。这个工具可以格式化慢日志文件,对于只是参数不同的语句 会归类类并,比如有两个语句select * from a where id=1 和select * from a where id=2,经过这个工具整理后就只剩下select * from a where id=N,这样读起来就舒服多了。而且这个工具可以实现简单的排序,让我们有的放矢。
2.Explain 很强大,SQL分析.
a.用explain可以看到mysql执行计划,详情请查手册。
b.借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。
3. 如果什么都做不了,试试全索引扫描

D.Mysql数据库参数配置
1.innodb_additional_mem_pool_size
2.innodb_buffer_pool_size
3.myisam,需要调整key_buffer_size
当然调整参数还是要看状态,用show status语句可以看到当前状态,以决定改调整哪些参数
Cretated_tmp_disk_tables 增加tmp_table_size
Handler_read_key 高表示索引正确 Handler_read_rnd高表示索引不正确
Key_reads/Key_read_requests 应小于0.01 计算缓存损失率,增加Key_buffer_size
Opentables/Open_tables 增加table_cache
select_full_join 没有实用索引的链接的数量。如果不为0,应该检查索引。
select_range_check 如果不为0,该检查表索引。.
sort_merge_passes 排序算法已经执行的合并的数量。如果该值较大,应增加sort_buffer_size
table_locks_waited 不能立即获得的表的锁的次数,如果该值较高,应优化查询
Threads_created 创建用来处理连接的线程数。如果Threads_created较大,要增加 thread_cache_size值。
缓存访问率的计算方法Threads_created/Connections。

参考文档:http://www.cnblogs.com/villion/archive/2009/07/23/1893765.html
归档与总结,并加以消化。

B2C产品颜色尺寸SKU模块架构

2013/03/28 | 星期四 分类:系统架构 | 没有评论 标签: , | 作者: | 2,008 views

B2C小型站点产品颜色尺寸管理研究可行方案。产品流程图:

sku

流程图简要说明:
1.主要是对库存表goods_number做管理,.其中goods_id,color_id,size_id 对应唯一产品SKU。
2.颜色尺寸基本表,后台开发相应的增删改管理基本数据,一旦确定不建议经常改动。
3.出入库、盘点模块请看另外一个流程模块出入库盘点管理。
4.后台订单管理,必定关联到库存管理,但为在流程中标出,就是goods_numbers表的虚拟库存做增减。
5.有了这个模块的库存管理,.商品页的颜色、尺寸筛选模块即可以轻松实现。

站点管理产品:SKU、颜色、尺寸同时还涉及到库存管理!规划与数据存储都很重要,设计三个基本数据表:

阅读全文

分布式缓存与Memcached相关问题

2013/03/26 | 星期二 分类:资源 | 没有评论 标签: , | 作者: | 1,319 views

分布式缓存从几方面说明:1.缓存本身的水平线性扩展问题,2.缓存大并发下的本身的性能问题,3.避免缓存的单点故障问题(多副本和副本一致性)。

分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制。其次是分布式管理和分布式算法,其次是缓存键值管理和路由。

什么是Memcached?

  1. 许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态Web 应用的速度、提高扩展性。如图:

1 阅读全文

第 5 页,共 7 页1234567