如何使用php无损截取包括html标签的字符串

字符串截取很简单,但是像很多网站有些模块显示的地方是截取一部分文字的方式来显示部分文本..

在做模板的时候发现问题,首页截取出来的内容中包含了没有闭合的html标签,结果导致样式或内容显示有问题:

假如有一段字符串,例如:

“Thanks for use <a href=””http://www.wordpress.com”>wordpress</a>”,

如果要截取前面15个字符串,那肯定没问题,如果截取的是20个字符串,那肯定就落在<a>标签里,

这么一来截取后再显示取来的内容就有问题,标签不完整,可能会影响样式..

于是搜索了下,果然有料,腾讯的面试题?:php截取HTML字符串

围观了很久,试了几个贴出来的代码,都不行,人品问题?

索性还是自己写个,思路跟他们不一样:

 

发表在 BS架构后台语言 | 标签为 , | 留下评论

百万级PHP网站架构分析

在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。

Poppen.de目前有200万注册用户数、2万并发用户数、每天20万条私有消息、每天25万登录次数。而项目团队有11个开发人员,两个设计,两个系统管理员。该站点的商业模式采用免费增值模式,用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。

如果用户想享受不受限制发送消息和上载图片,那么就得根据需要支付不同类型的会员服务,视频聊天及网站其他服务也采用同样的策略。

Nginx

Poppen.de 所有的服务都是基于Nginx服务上的。前端有两台Nginx服务器在高峰期提供每分钟15万次请求的负载,每个机器已经有四年寿命,并且只有一个CPU 和3GB RAM。Poppen.de拥有三台独立的图像服务器,由三台Nginx服务器为*.bilder.poppen.de提供每分钟8万次请求服务。

Nginx 架构中一个很酷的设计就是有很多请求是由Memcached处理的,因此请求从缓存中获取内容而不需要直接访问PHP机器。比如,用户信息页(user profile)是网站需要密集处理的内容,如果把用户信息页全部缓存到Memcached上,那么请求直接从Memcached上获取内容。 Poppen.de的Memcached每分钟可以处理8000次请求。

架构中有三个Nginx图像服务器提供本地图像缓存,用户上载图 像到一个中央文件服务器。当向这三个Nginx之一中请求图像时,如果服务器本地中没有存在该图像,则从中央文件服务器下载到该服务器上作缓存并提供服 务。这种负载均衡的分布式图像服务器架构设计可以减轻主要存储设备的负载。

PHP-FPM

该网站运行在PHP- FPM上。共有28台双CPU、6GB内存的PHP机器,每个机器上运行100个PHP-FPM的工作线程。使用启用了APC的PHP5.3.x。 PHP5.3可以降低CPU和内存使用率的30%以上。

程序代码是基于Symfony1.2框架之上开发的。一是可以使用外部资源,二是 能够提高项目开发进度,同时在一个著名的框架上可以让新开发人员更容易加入到团队中来。虽然没有任何事情都是十全十美的,但可以从Symfony框架中得 到很多好处,让团队可以更多的精力放在Poppen.de的业务开发上去。

网站性能优化使用XHProf,这是Facebook开源出来的一个类库。这个框架非常容易个性化和配置,能够可以缓存大部分高代价的服务器计算。

MySQL

MySQL是网站主要的RDBMS。网站又几个MySql服务器:一台4CPU、32GB的服务器存储用户相关信息,如基本信息、照片描述信息等。这台机器已经使用了4 年,下一步计划会使用共享集群来替换它。目前仍基于这个系统上进行设计,以简化数据访问代码。根据用户ID进行数据分区,因为网站中大部分信息都是以用户 为中心的,如照片、视频、消息等。

有三台服务器按主-从-从配置架构提供用户论坛服务。一台从服务器负责网站自定义消息存储,到现在有 2.5亿条消息。另外四台机器为主-从配置关系。另外由4台机器配置成NDB族群专门服务于密集型写操作数据,如用户访问统计信息。

数据表设计尽量避免关联操作,尽可能缓存最多的数据。当然,数据库的结构化规范已经完全被破坏掉了。因此,为了更容易搜索,数据库设计创建了数据挖掘表。大部分表是MyISAM型表,可以提供快速查找。现在的问题是越来越多的表已经全表锁住了。Poppen.de正考虑往XtraDB存储引擎上迁移。

Memcached

网站架构中Memcached应用相当多,超过45GB的高速缓存和51个节点。缓存了Session会话、视图缓存以及函数执行缓存等。架构中有一个系统 当记录被修改时可以自动地把数据更新到缓存中去。未来改善缓存更新的可能方案是使用新的Redis Hash API或者MongoDB。

RabbitMQ

在 2009年中开始在架构中使用RabbitMQ。这是一个很好的消息解决方案,便于部署和集中到这个架构中去,在LVS后运行了两台RabbitMQ服务 器。在上个月,已经把更多的东西集成到该队列中,意味着同一时刻有28台PHP服务器每天要处理50万次请求。发送日志、邮件通知、系统消息、图像上载等 更多的东西到这个队列中。

应用PHP-FPM中的fastcgi_finish_request()函数集成队列消息,可以把消息异步发 送到队列中。当系统需要给用户发送HTML或JSON格式响应时,就调用这个函数,这样用户就没有必要等到PHP脚本清理。

这个系统可以改善架构资源管理。例如,在高峰期服务每分钟可以处理1000次登录请求。这表示有1000并发更新用户表保存用户的登录时间。由于使用了队列机制,可以 按相反的顺序来运行这些查询。如果需要提高处理速度,只需要增加更多的队列处理者即可,甚至可以增加更多的服务器到这集群中去,而不需要修改任何配置和部 署新节点。

CouchDB

日志存储CouchDB运行在一台机器上。在这台机器上可以根据模块/行为进行日志查询 /分组,或者根据错误类型等等。这对定位问题非常有用。在使用日志聚合服务CouchDB之前,不得不逐台登录到PHP服务器上设法日志分析定位问题,这 是非常麻烦的。而现在把所有的日志集中到队列中保存到CouchDB中,可以集中进行问题检查和分析。

Graphite

网站使用Graphite采集网站实时信息并统计。从请求每个模块/行为到Memcached的命中和未命中、RabbitMQ状态监控以及Unix负载等等。Graphite服务平均每分钟有4800次更新操作。实践已经证实要监测网站发发生什么是非常有用的,它的简单文本协议和绘图功能可以方便地即插即 用的方式用于任何需要监控的系统上。

一件很酷的事情是使用Graphite同时监控了网站的两个版本。一月份部署了Symfony框架新 版本,以前代码作为一个备份部署。这就意味着网站可能会面临性能问题。因此可以使用Graphite来对两个版本在线进行对比。

发现新版本上的Unix负载表较高,于是使用XHProf对两个版本进行性能分析,找出问题所在。

Red5

网站为用户也提供了两种类型的视频服务,一种是用户自己上载的视频,另外一种是视频聊天,用户视频互动和分享。到2009年年中,每月为用户提供17TB的流量服务。

Tsung

Tsung 是一个Erlang编写的分布式基准分析工具。在Poppen.de网站中主要用于HTTP基准分析、MySQL与其他存储系统(XtraDB)的对比分 析。用一个系统记录了主要的MySQL服务器的流量,再转换成Tsung的基准会话。然后对该流量进行回放,由Tsung产生数以千计的并发用户访问实验 室的服务器。这样就可以在实验环境中与真实场景非常接近。

发表在 生活随笔 | 标签为 , | 留下评论

PHP超大文件下载,断点续传下载示例代码

最近做项目的时候需要文件下载,用普通php读取源文件下载的时候出现一个php内存溢出的问题,原因就是在于下载的时候读取生成的临时文件过大,PHP内存无法容纳,一开如是想到更改PHP内存限制,但是这个只是一个缓兵之计,于是想到了另外一个方法是把文件分次读取,并下载。

以下是源代码:

发表在 BS架构后台语言 | 标签为 , | 留下评论

Nginx和Apache 优缺点整理

nginx 相对 apache 的优点:

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊

apache 相对nginx 的优点:

  • rewrite ,比nginx 的rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相对较多
  • 超稳定

存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。
这里要注意一点,epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。

  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.
  • Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.
  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.
  • Nginx 是一个安装非常的简单 , 配置文件非常简洁(还能够支持perl语法), Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 .
  • Nginx优于apache的主要两点:1.Nginx本身就是一个反向代理服务器 2.Nginx支持7层负载均衡;其他的当然,Nginx可能会比apache支持更高的并发,但是根据NetCraft的统计,2011年4月的统计数据,Apache依然占有62.71%,而Nginx是7.35%,因此总得来说,Aapche依然是大部分公司的首先,因为其成熟的技术和开发社区已经也是非常不错的性能。
  • Nginx 配置简洁, Apache 复杂Nginx 静态处理性能比 Apache 高 3倍以上Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用Apache 的组件比 Nginx 多
发表在 应用工具软件 | 标签为 , | 留下评论

如何使用mysql 将时间戳直接转换成日期时间

date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串
后面的 ‘%Y%m%d’ 主要是将返回值格式化
例如:

UNIX_TIMESTAMP()是与之相对正好相反的时间函数

UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)

若无参数调用,则返回一个 Unix timestamp (‘1970-01-01 00:00:00′ GMT 之后的秒数) 作为无符号整数。若用date 来调用 UNIX_TIMESTAMP(),它会将参数值以’1970-01-01 00:00:00’ GMT后的秒数的形式返回。date 可以是一个 DATE 字符串、一个 DATETIME字符串、一个 TIMESTAMP或一个当地时间的YYMMDD 或YYYMMDD格式的数字。

例如:

发表在 数据库相关技术 | 标签为 , | 留下评论

详解Apache配置站点与虚拟目录

Linux系统环境

一、单站点配置:

在apache中,配置一个站点是最基础的配置,在这里我只是要配置一个最基础的WEB站点,因此配置方式也是非常简单,具体配置方式如下:

 

二、单站点虚拟目录配置:

对于不同的DocumentRoot指定的不同页面,我们可以通过别名的方式来实现,实现的功能与IIS中的虚拟目录一样,具体的配置如下:

 

三、多站点配置:

一台apache服务器如果跑的小网站,不可能只跑一个站,可能需要在这台服务器上配置很多个站点,实现配置方式也是比较简单的,具体实现方式如下:

 

四、多站点虚拟目录配置:

由于配置多站点的方式有两种,本文就用第一种最常用的单IP多域名的方式进行配置,具体配置如下:

 

Windows系统环境

一、基于名称的虚拟主机

打开Apache2\conf下的httpd.conf,查找#NameVirtualHost *:80,去掉前面的注释。

添加虚拟主机www.test.com,在httpd.conf的最后,添加如下代码:

二、增加虚拟目录

1、全局的

如httpd.conf中的/icons/

2、虚拟主机内的

在<VirtualHost *:80></VirtualHost>之间添加上面内容

如:

发表在 应用工具软件 | 标签为 , | 留下评论

如何刷新DNS缓存

运行:ipconfig /displaydns这个命令,查看一下本机已经缓存了那些的dns信息的,然后输入下面的命令

ipconfig /flushdns

这时本机的dns缓存信息已经清空了,我们可以再次输入第一次输入的命令来看一下,

ipconfig /displaydns

ipconfig /displaydns显示dns缓存

ipconfig /flushdns 刷新DNS记录

ipconfig /renew重请从DHCP服务器获得IP

先可以输入ipconfig /displaydns显示dns缓存根据显示结果你可以很直观的看到现在你的DNS所指上的IP,然后运行ipconfig /flushdns 刷新DNS记录和ipconfig /renew重请从DHCP服务器获得IP就可以了,如果一次刷新没有用,可以多次用ipconfig /flushdns进行刷新

发表在 操作系统相关 | 标签为 | 留下评论

使用jquery来实现撒金币效果




稚子网络工作室送金币啦 http://blog.zzstudio.net









发表在 Web前台开发技术 | 标签为 | 留下评论

jQuery旋转插件rotate的使用—rotate支持(ie/Firefox/SafariOpera/Chrome)

网上发现一个很有意思的jQuery旋转插件,支持Internet Explorer 6.0+ 、Firefox 2.0 、Safari 3 、Opera 9 、Google Chrome,高级浏览器下使用Transform,低版本ie使用VML实现。

调用和方法:

angle参数:[Number] – 默认为 0 – 根据给定的角度旋转图片

例如:

rotate(parameters)

parameters参数:[Object] 包含旋转参数的对象。支持的属性:

1.angle属性:[Number] – default 0 – 旋转的角度数,并且立即执行

例如:

2.bind属性:[Object] 对象,包含绑定到一个旋转对象的事件。事件内部的$(this)指向旋转对象-这样你可以在内部链式调用- $(this).rotate(…)。例如 (click on arrow):

3.animateTo属性:[Number] – default 0 – 从当前角度值动画旋转到给定的角度值 (或给定的角度参数)例如: 结合上面的例子,请参阅使用。

4.duration属性:[Number] – 指定使用animateTo的动画执行持续时间例如 (click on arrow):

5.step属性:[Function] – 每个动画步骤中执行的回调函数,当前角度值作为该函数的第一个参数

6.easing属性:[Function] – 默认 (see below) – Easing function used to make animation look more natural. It takes five parameters (x,t,b,c,d) to support easing from http://gsgd.co.uk/sandbox/jquery/easing/ (for more details please see documentation at their website). Remember to include easing plugin before using it in jQueryRotate!Default function:

Where:t: current time,

b: begInnIng value,

c: change In value,

d: duration,

x: unused

No easing (linear easing):

Example (click on arrow):

7.callback属性:[Function] 动画完成时执行的回调函数例如 (click on arrow):

getRotateAngle

这个函数只是简单地返回旋转对象当前的角度。

例如:

stopRotate

这个函数只是简单地停止正在进行的旋转动画。

例如:

用这个可以实现很多关于旋转的网页特效。

jqueryrotate项目地址:http://code.google.com/p/jqueryrotate/

代码示例:http://code.google.com/p/jqueryrotate/wiki/Examples

稚子的成长博客

发表在 BS架构后台语言, Web前台开发技术 | 标签为 , , , | 留下评论

C#判断文件路径或文件是否存在的方法

//判断文件路径是否存在,不存在则创建文件夹
if (!System.IO.Directory.Exists(@"D:\Export"))
{
System.IO.Directory.CreateDirectory(@"D:\Export");//不存在就创建目录
}
//判断文件是否存在
添加引用using System.IO;
if(File.Exists(@"文件路径"))
{
//存在
}
else
{
//不存在
}

发表在 BS架构后台语言, CS架构后台语言 | 标签为 , | 留下评论