存档

‘PHP技术’ 分类的存档

centos 安装php5.5 扩展之imagick

2014年4月14日 没有评论

近日在公司内部安装php5.5.11的测试环境,前面的安装都很顺利,当要
安装php扩展imagick时


pecl install imagick

遇到了如下错误


checking ImageMagick MagickWand API configuration program... configure: error: not found. Please provide a path to MagickWand-config or Wand-config program.
ERROR: `/var/tmp/imagick/configure --with-imagick' failed

通过排查发现是由于ImageMagick-devel库没有安装,随后运行如下命令


yum install ImageMagick
yum install ImageMagick-devel

最后再次运行


pecl install imagick

编译安装成功,成功后要编辑php.ini文件,确保扩展载入成功



分类: PHP技术 标签:

一些php开发忽略的问题总结

2012年8月14日 没有评论

include与require的区别?

Php在遇到include时就重新解释一次,如果一个页面中出现10次include,php就重新解释10次,而php遇到require时只解释一次,即使页面中出现多次require,php也直解释一次。

使用require包含文件时,被包含的文件当成了当前文件的一个组成部分,如果被包含的文件中有语法错误或者文件不存在,程序就提示错误信息,并结束执行。

使用include包含文件时,相当于指定了文件的路径,被包含的文件中有语法错误或者文件不存在时,页面只是给出警告信息,不响应程序本身的执行。

本问将不定期编辑,只为收集自己容易忽略的问题。以上的问题对于各位看官来说或许简单了点。



分类: PHP技术 标签:

一道php面试题(一)

2012年6月21日 没有评论

斐波那契数列
根据以下一些数字找出规律,并推算出第100个数字为多少。

1,1,2,3,5,8,13,21,34……..


< ?php
/**
 *方法一采用递归算法,把计算的数据压入数组中,最后返回整个数组
 *在数组中查找需要的结果
 */
function sum_in($n,$k=1){
    static $array=array(1,1);
        if($n>$k){
            if($k>1){
                $array[]=($array[$k-2]+$array[$k-1]);
            }
            return  sum_in($n,$k+1);
        }else{
            return $array;
        }
}
/**
 * 这个思路仍然是把数据压入数组中,但没有使用递归
 */
function sum_in($n){
    $array=array(1,1);
    for($i=2;$i< $n;$i++){
        $array[$i]=$array[$i-1]+$array[$i-2];
    }
    return $array;
}
?>

上面的两个方法运行的后返回的结果都是元素个数为一百的数组,直接pop一个元素即可得到想要的第N个是多少了
接着思考有没有其他的思路,如果有我在补充,如果各位客官有其他什么方法,也可以补充。



2011PHP技术高峰论坛演讲-张宴

2012年1月5日 没有评论



mysql支撑百万级流量高并发的网站部署讲解

2010年6月10日 没有评论

用MySQL做数据库的网站一天几十万个IP的小站还能承受,要是几百万甚至上千万的IP恐怕就撑不住了.下面介绍一下如何用mysql支撑大流量的网 站.
1. MySQL服务器集群
由于是小公司在资金和成本上都有所限制,而且在技术上也没有几个技术员接触过,所以这个方法自然就让大伙否决了。
这里说说我个人的理解!做集群不但添加资费的开销,而且在技术上也有很大的挑战,对于我们公司目前的情况是不大现实的。集群无非就是把一台服务器 的压力转接到两台或是多台服务器上,我是这么理解的,也许我理解有误,还请大家指教。

2. 分而治之
这个方法和集群差不多,不过是把统计的代码放在不同的服务器上跑,由于公司有不少配置低的服务器跑几万到几十万IP还是没有问题的,我们可以把几 百万流量分成十来个几十万的量分而统计。
优点:充分的利用了现在的资源,解决了目前的问题。
缺点:这样的方法不是长久之计,迟早还是会出问题的。而且在统计数据的时候比较麻烦。

3. 统计代码的修改
由于之前采用的是在插入数据之前加以判断,这个IP是否存在,来路等的处理,无形中增加了服务器的压力,所以大伙把统计代码改成来一个就插入数据 库,不管三七二十一等以后在处理。
这个方法基本上把当天的数据保留下来了,可是在处理的时候由于数据量的庞大,来来回回还是把服务器跑死了,而且在插入的时候由于当时设计数据结构 的时候留有的索引,也大大的消耗了不少的服务器资源。
那么把索引去掉到最后处理的时候又是老慢的,得不偿失。

4. 统计方式的修改
最后这一个方法,效果非常的明显。那是什么方法呢!
这里就主要介绍这个方法:
A、 保留原用的数据结构不变,并把所有的数据按一定的结构存入文件
结构:可以是xml,json,也可以是你自己想的任何有规律的数据排放。
例如:
1) 221.2.70.52,http://www.baidu.com,windowxp\r\n
2) 221.2.70.52,http://www.baidu.com,windowxp\r\n
写入文件:fopen,fwrite??no 这里介绍一个非常好用的技巧,也许大家都知道,但是像我这样的菜鸟大概都不知道,那就是用error_log,这不是写错误日志的吗?对就是他,非常方 便。
格式:
1 error_log(“内容”, 3, “/date.dat”);
这里我就不说他的具体用了,不明白的朋友可以查一下手册。
B、数据文件的命名
为什么这里要讲文件的命名呢?如果就一味的把数据的写入文件不作任何的处理那么他和直接插入数据库有多大的区别呢?那么我们所作的一切都是无用功 了。
首先是在时间的利用上:date(‘YmdH’)得到的值是如:2008121112这有什么好入,这样一来这个数据就是一个小时一个文件必免了 文件过大,而且不用去判断自动生成。
IP的应用:由于在很多数据上都是一个IP操作的,所以把相同IP的数据放在一个文件里在后面的处理就非常方便处理。请看后面的介绍,这里我们取 IP成三位为文件名字的一部分。
C、数据的导入处理
通过以上两位的操作当天的数据会一个不少的保留下来,接下来怎么处理其实并不是很重要了。但是这里还是讲讲我的想法。
入库前处理:
前面讲到把IP三位相同的放一个文件就是为了入库前到它们进行处理,首先可以用最笨的方法把数据拆成N个数据。在进行重复数据的删除。
如果一个IP浏览多页那么PV在这里就可以得到统计,并把访问的页面进行处理,组成新的数据。
导入方法:
这里要介绍一下数据的导入方法:
1 $sql=”LOAD DATA INFILE ‘”.$file.”‘ INTO TABLE `test` FIELDS TERMINATED BY ‘, ‘ LINES TERMINATED BY ‘\r\n'(2 3 `time` , `md5`4 5 )”;
就这一个语句,在导入几十万数据的时候可以说是十分快速的,用法我这里也不过多介绍了,大家有不明白的可以查手册,所以说解决数据库的瓶颈的办法 不定要加设备,也不一定要换数据库,只要换一个思路就能解决不少问题。



分类: PHP技术, 网站高并发 标签:

面向对象程序的设计原则

2010年4月14日 没有评论

1.什么是开闭原则
“开—闭”原则是指软件实体应当对扩展性开放,对修改关闭。即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标。我们知道软件设计 应当充分考虑软件的可维护性,即需求发生变化的时候软件结构能够灵活地适应这种变化。就评价软件的可维护性而言,“开—闭”原则提供了一个依据。实际上, 设计模式的应用就是使软件的结构在某种程度上满足“开—闭”原则。

2.“开— 闭”原则的实现
“开—闭”原则为设计提供了目标,但却没有明确给出实现的手段,下面说明在面向对象的设计中实现“开—闭”原则的方法。

(1)面向接口的编程
面向接口的编程的优势如下:
a.降低程序各部分之间的耦合性,使程序模块互换成为可能。这样客户无需知道自己使用的对象的类型,只要对象有客户所期望的接口即可。并且客户也不需要知 道对象是如何实现的,只要知道定义接口的抽象类。
b.使软件各部分便于单元测试,通过编制与接口一致的模拟类(Mock),可以很容易地实现软件 各部分的单元测试。从而提高软件的可靠性,降低错误率。

c.已于实现软件的模块的呼唤,软件升级时可以只部署发生变化的部分,而不会影响其它部分。
对于设计模式来说,创建型模式的产生是面向接口编程的 必然结果,面向接口编程要求使用对象的客户不了解对象的具体类型,客户只能通过一个负责实例化对象的对象——我们称之为“工厂”——来实例化对象,而工厂 对象在应用初始化时集中进行实例化或者在集中的模块中进行。

3.封装变化
程序中任何可能发生变化的部分都可以封装为对象,包括命令、事件、属性、算法和状态等。封装变化是实现“开—闭”原则的重要手段,也是在设计中发现对象的 重要途径。因此在分析需求时,一定要注意什么是不变的,什么是可能发生变化的,以及这些可能的变化会对封装带来的影响。
例如,如果对象的行为基本 不变,那么这些行为可以作为对象的方法;否则就要考虑是否抽象和封装这些行为。再如,状态可以用状态参数来表示,例如温度和压力等。可以将状态参数作为独 立的属性,但如果状态参数之间相互关联,则有必要进行抽象。
总之,封装可能发生变化的部分,将可能的变化作为对象。在面向对象设计中,对象不仅是指现实中存在的事物或者可视的事物,任何可能变化的部分都是侯选对 象。

4.采用组合替代继承
继承是面向对象系统的特点之一,没有继承,很多面向对象的设计就无从谈起。在设计模式中,没有哪个模式不涉及到继承。采用组合替代继承并不适合任何情况, 实际上,如果没有继承,很多组合根本无法实现,涉及到基础结构的继承无法替换。
组合和继承针对模块中的复用而言,当功能需要扩展时,采用继承实现复用比较简单直观。只要派生一个类,在这个类中增加新的特性,即可实现对现有类复用。然 而类继承在编译时定义,无法在运行时改变。并且继承对子类暴露了父类的实现细节,从而破坏了封装性,使子类与父类耦合性非常强。一旦父类发生变化,必然导 致子类也发生变化。如果继承下来的实现不能解决新问题,则需要修改父类,这种依赖性限制了灵活性。
如果我们希望通过增加子类来扩展功能,可能会出 现如图所示的情况。

如果不修改类而仅仅依靠增加子类扩展,尽管似乎满足“开—闭”原则,但结果变得非常可笑。替换这个方案的一种方法是采用对象组合,将人的行为抽象为类,如 图所示。

通过与行为对象的组合,可以扩展“人”的行为。通过增加新的行为类来实现扩展,类层次并没有增加。

对象组合在运行时通过获得对其他对象的引用来实现,组合要求对象遵守彼此的接口约定。只要符合这个约定,一个对象可以在运行时动态地玮不同的对象组合,从 而实现复用。在设计时,每一部分只要关注接口约定即可,不必考虑具体的实现。因此对象组合有最小的耦合性并且更灵活,在设计模式中大量地采用了对象组合。

再次强调,继承是面向对象的基石之一。采用组合代替继承者是在需要复用的前提下,并不是所有的继承都可以用组合替代。不仅如此,没有继承,组合也无从谈 起。在上面的例子中,行为的扩展仍然需要增加行为子类。



分类: PHP技术 标签:

关于远程调用新浪股票接口的思考

2009年12月18日 没有评论

最近一直在忙于开发模拟炒股的应用程序,首先考虑的是如何获取股票数据信息的问题。后来在Google上Google了一下,查询到依靠新浪的股票信息接口。在测试中获得的是字符串,javasript是可以直接使用,如果采用Ajax的话,怎么办呢?尝试了N种方法,无效后只好采用,先写入文本文件中,然后读取该文件并将其数据重新整理,整理成json数据流。反馈到js中进行输出。思路大致就是这样。完成后在上传代码。

但是有一点需要说明,这样获得方式比较慢,需要等候一段时间,尤其是在后台通过php函数中的flie()比较慢。

如果谁有好的方法可以告诉我。



分类: PHP技术 标签:

无觅相关文章插件,快速提升流量

互联网安全