用popen实现在PHP代码异步调用服务器端的shell脚本

先看代码:

Php代码  收藏代码
  1. //php code …  
  2.   
  3. //然后执行一个服务器端操作  
  4. pclose(popen(“/usr/local/php/bin/php /htdocs/www/site/task.php &”, “r”));  

 

—————

适用场合

—————

 

在执行完PHP代码之后,需要在服务器端执行一个操作,比如,用户点击了“发送”按钮,系统在成功显示发送成功页面之后,通过上面的代码,就可以激活服务器上的某个PHP文件。由于该脚本在后台运行,不会影响页面执行时间。

 

它有个好处——该脚本好像是紧随着PHP代码执行的,免去了写crontab的麻烦,尤其是那些需要多少秒执行一次的,也算作“lazy”的方式吧~

 

PHP中的 抽象类(abstract class)和接口(interface)

一、 抽象类abstract class

1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了abstract 关键字)的类。

2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。

3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

 

  1. abstract class A  
  2. {  
  3.       
  4.     protected $value1 = 0;  
  5.     private $value2 = 1;  
  6.     public $value3 = 2;  
  7.       
  8.     public function my_print()  
  9.     {  
  10.         echo “hello,world\n”;  
  11.     }  
  12.       
  13.     abstract protected function abstract_func1();  
  14.     abstract protected function abstract_func2();  
  15. }  
  16. abstract class B extends A  
  17. {  
  18.     public function abstract_func1()  
  19.     {  
  20.        echo “implement the abstract_func1 in class A\n”;  
  21.     }  
  22.       
  23.     //abstract protected function abstract_func2();  
  24. }  
  25. class C extends B  
  26. {  
  27.     public function abstract_func2()  
  28.     {  
  29.        echo “implement the abstract_func2 in class A\n”;  
  30.     }  
  31. }  

 

 

4 .如果像下面这样创建了一个继承自 A 的子类 B ,但是不实现抽象方法 abstract_func() :

 

  1. Class B extends A{};  

 

那么程序将出现以下错误:

 

  1. Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)  

 

 

5 .如果 B 实现了抽象方法 abstract_func() ,那么 B 中 abstract_func() 方法的访问控制不能比 A 中abstract_func() 的访问控制更严格,也就是说:

(1)      如果 A 中 abstract_func() 声明为 public ,那么 B 中 abstract_func() 的声明只能是 public,不能是 protected 或 private

(2)      如果 A 中 abstract_func() 声明为 protected ,那么 B 中 abstract_func() 的声明可以是public 或 protected ,但不能是 private

(3)      如果 A 中 abstract_func() 声明为 private ,嘿嘿,不能定义为 private 哦!( Fatal error: Abstract function A::abstract_func() cannot be declared private )

二、 接口interface

1 .抽象类提供了具体实现的标准,而接口则是纯粹的模版。接口只定义功能,而不包含实现的内容。接口用关键字 interface 来声明。

2 . interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及protected 的方法,不能定义方法体,也不能声明实例变量 。然而, interface 却可以声明常量变量 。但将常量变量放在 interface 中违背了其作为接口的作用而存在的宗旨,也混淆了 interface 与类的不同价值。如果的确需要,可以将其放在相应的 abstract class 或 Class 中。

 

  1. interface iA  
  2. {  
  3.     const AVAR=3;  
  4.     public function iAfunc1();  
  5.     public function iAfunc2();  
  6. }  
  7. echo iA:: AVAR;  

3 .任何实现接口的类都要实现接口中所定义的所有方法

  1. class E implements iA  
  2. {  
  3.     public function iAfunc1(){echo “in iAfunc1”;}  
  4.     public function iAfunc2(){echo “in iAfunc2”;}  
  5. }  

否则该类必须声明为 abstract 。

 

  1. abstract class E implements iA{}  

 

4 .一个类可以在声明中使用 implements 关键字来实现某个接口。这么做之后,实现接口的具体过程和继承一个仅包含抽象方法的抽象类是一样的。一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前。 PHP 只支持继承自一个父类,因此 extends 关键字后只能跟一个类名。

 

  1. interface iB  
  2. {  
  3.     public function iBfunc1();  
  4.     public function iBfunc2();  
  5. }  
  6. class D extends A implements iA,iB  
  7. {  
  8.     public function abstract_func1()  
  9.     {  
  10.        echo “implement the abstract_func1 in class A\n”;  
  11.     }  
  12.     public function abstract_func2()  
  13.     {  
  14.        echo “implement the abstract_func2 in class A\n”;  
  15.     }  
  16.     public function iAfunc1(){echo “in iAfunc1”;}  
  17.     public function iAfunc2(){echo “in iAfunc2”;}  
  18.     public function iBfunc1(){echo “in iBfunc1”;}  
  19.     public function iBfunc2(){echo “in iBfunc2”;}  
  20. }  
  21.    
  22. class D extends B implements iA,iB  
  23. {  
  24.     public function abstract_func1()  
  25.     {  
  26.        parent::abstract_func1();  
  27.        echo “override the abstract_func1 in class A\n”;  
  28.     }  
  29.     public function abstract_func2()  
  30.     {  
  31.        echo “implement the abstract_func2 in class A\n”;  
  32.     }  
  33.     public function iAfunc1(){echo “in iAfunc1”;}  
  34.     public function iAfunc2(){echo “in iAfunc2”;}  
  35.     public function iBfunc1(){echo “in iBfunc1”;}  
  36.     public function iBfunc2(){echo “in iBfunc2”;}  
  37. }  

 

 

5 .接口不可以实现另一个接口,但可以继承多个

 

  1. interface iC extends iA,iB{}  
  2. class F implements iC  
  3. {  
  4.     public function iAfunc1(){echo “in iAfunc1”;}  
  5.     public function iAfunc2(){echo “in iAfunc2”;}  
  6.     public function iBfunc1(){echo “in iBfunc1”;}  
  7.     public function iBfunc2(){echo “in iBfunc2”;}  
  8. }  

 

 

三、 抽象类和接口的异同

1. 相同点:

(1)      两者都是抽象类,都不能实例化。

(2)      interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。

2. 不同点:

(1)      interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends 。

(2)      一个类可以实现多个 interface ,但一个类只能继承一个 abstract class 。

(3)      interface 强调特定功能的实现,而 abstract class 强调所属关系。

(4)      尽管 interface 实现类及 abstract class 的子类都必须要实现相应的抽象方法,但实现的形式不同。 interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 的子类可以有选择地实现。这个选择有两点含义: a) abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。那些没有 abstract 的方法,在 abstract class 中必须定义方法体; b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

(5)      abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

(6)      接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。

(7)      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。

3. interface 的应用场合

(1)      类与类之间需要特定的接口进行协调,而不在乎其如何实现。

(2)      作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。

(3)      需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。

(4)      需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class 的应用场合

一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

(1)      定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用 abstract class 定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。

(2)      某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。 abstract 的中介作用可以很好地满足这一点。

(3)      规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特 定的功能 。

FFmpegPHP

FFmpegPHP 是一个纯面向对象的 ffmpeg 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息,可直接从视频中获取帧的图片,这常用来做视频的缩略图。支持的视频格式包括: MOV, AVI, MPG, 和 WMV.

HTTP_X_FORWARDED_FOR 获得ip的说明

以前做投票,有人刷票,发现其ip如下

203.98.182.163, 203.98.182.16

两个ip拼起来了,查了下google,解释如下

 

一、没有使用代理服务器的情况:

      REMOTE_ADDR = 您的 IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

      REMOTE_ADDR = 最后一个代理服务器 IP
      HTTP_VIA = 代理服务器 IP
      HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

      REMOTE_ADDR = 最后一个代理服务器 IP
      HTTP_VIA = 代理服务器 IP
      HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

      REMOTE_ADDR = 代理服务器 IP
      HTTP_VIA = 代理服务器 IP
      HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

      REMOTE_ADDR = 代理服务器 IP
      HTTP_VIA = 没数值或不显示
      HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

   完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

mysql where id in 排序 按in的顺序排序

select id fromtablewhere id in(2,1,3,5)order bysubstring_index(‘2,1,3,5’,id,1);
substring_index(str,delim,count) 字符串截取函数
str 要截取的字符串 delim 截取的分割符 count 截取的数量
返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数,返回最后的分隔符到右边的所有字符(从右边数)。
那 order by substring_index(‘2,1,3,5′,id,1) 这个啥意思呢
这个是在字符串’2,1,3,5′里查找id,如果找不到,就返回整个字符串select id fromtablewhere id in(2,1,3,5)order by find_in_set(id,‘2,1,3,5’)
find_in_set(str,strlist)
字符串函数
如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。如果str不是在strlist里面或如果strlist是空字符串,返回0。

SELECT FIND_IN_SET(‘b’,‘a,b,c,d’);
->2
所以 find_in_set返回的是一个1到N的值,在order by的话,就是按顺序排了。

此句测试中id为主键,type一直为all,不知是有优化方法?

 

另一种,没有试过(收藏一下)

SQL: select * from table where id IN (3,6,9,1,2,5,8,7);
这样的情况取出来后,其实,id还是按1,2,3,4,5,6,7,8,9,排序的,但如果我们真要按IN里面的顺序排序怎么办?SQL能不能完成?是否需要取回来后再foreach一下?
其实可以这样
sql: select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7);
出来的顺序就是指定的顺序了

 

 

项目 中用到

$order = “order by substring_index(‘$ids’,g.goods_id,1)”;//按in 排序用

PHP APC 配置详解

本文详细解释PHP APC模块的参数配置,由于内容是从PHP Manual中翻译而来,可能存在不全面的地方。希望得到各位的指正!

APC是Alternative PHP Cache的简称,是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

APC模块的参数配置

Name Default Changeable Changelog
apc.enabled 1 PHP_INI_ALL
apc.shm_segments 1 PHP_INI_SYSTEM
apc.shm_size 30 PHP_INI_SYSTEM
apc.optimization 0 PHP_INI_ALL
apc.num_files_hint 1000 PHP_INI_SYSTEM
apc.ttl 0 PHP_INI_SYSTEM
apc.gc_ttl 3600 PHP_INI_SYSTEM
apc.cache_by_default On PHP_INI_SYSTEM
apc.filters “” PHP_INI_SYSTEM
apc.mmap_file_mask “” PHP_INI_SYSTEM
apc.slam_defense 0 PHP_INI_SYSTEM
apc.file_update_protection 2 PHP_INI_SYSTEM
apc.enable_cli 0 PHP_INI_SYSTEM > APC 3.0.6

apc.enabled 布尔型
apc.enabled 可以被设成 0 来禁用 APC。这主要是有用的,当 APC 被静态编译入 PHP 时,因为没有其它方法来禁用它(当编译为 DSO 的时候,可以将 php.ini 中的 extension 行注释掉)。

apc.shm_segments 整型
对编译缓存分配共享内存块的数量。如果APC用光了共享内存,而且你已经设置 apc.shm_size为系统允许的最大值的情况下,你可以试着去提高这个参数的值。

apc.shm_size 整型
每个共享内存块的大小是以MB为单位的。在默认情况下,一些系统(包括大多数BSD变种系统)的共享内存块的大小限制的很低。

apc.optimization 整型
优化等级。设为0则禁用优化,越高的值使用越强有力的优化。期待有适度的速度上的改进。这个还是实验性质的。

apc.num_files_hint 整型
对在你的Web服务器上被包含和请求的不同的源文件的数量的提示。如果你无法确定,设置为0或者省略;这个设置主要可能用于有成千的源文件的站点。

apc.ttl 整型
当一个缓存条目在缓存区的位置被另一个条目需要时,我们需要考虑的是这个缓存条目在缓存区的位置被允许空闲的秒数。将这个参数设置为0意味着你的缓存可能充满不新鲜的条目,同时导致新的条目无法被缓存。

apc.gc_ttl 整型
缓存条目在垃圾收集列表中存活的秒数。这个值提供了出错保护在执行一个缓存源文件,而同时服务器进程死了的事件中。如果那个源文件被修改,内存分配给旧版本的缓存条目将不会被回收,直到这个参数设定的TTL值到的时候。设置为0就是禁止这个特性。

apc.cache_by_default 布尔型
默认为On,但可以被设置为Off并和以加号开头的apc.filters配合使用,文件仅仅在匹配过滤器时才被缓存。

apc.filters 字符串
一个以逗号分割的POSIX扩展正则表达式的列表。如果任何模式匹配源文件名,这个文件将不会被缓存。注意用来匹配的文件名是传递给 include/require 的文件名,而不是绝对路径。如果正则表达式的第一个字符是 + ,则这个表达式就意味着任何匹配表达式的文件将会被缓存,如果第一个字符是 – 则任何匹配都不会被缓存。 – 是默认值,所以可以被省略。

apc.mmap_file_mask 字符串
If compiled with MMAP support by using –enable-mmap this is the mktemp-style file_mask to pass to the mmap module for determing whether your mmap’ed memory region is going to be file-backed or shared memory backed. For straight file-backed mmap, set it to something like/tmp/apc.XXXXXX (exactly 6 Xs). To use POSIX-style shm_open/mmap put a .shm somewhere in your mask. e.g. /apc.shm.XXXXXX You can also set it to /dev/zero to use your kernel’s/dev/zero interface to anonymous mmap’ed memory. Leaving it undefined will force an anonymous mmap.

apc.slam_defense 整型
在非常繁忙的服务器上,无论你启动服务还是修改文件,你都会导致一种多进程都试图在同一个时间缓存同一个文件的竞争。这个选项设置了进程跳过试图去缓存一 个未被缓存的文件的百分比。或者可以把这个想象成一个单独进程跳过缓存的机率。例如,设置apc.slam_defense为75就意味着进程有75%的 机率不去缓存未被缓存的文件。所以,设置的越高,越能减少缓存的碰撞机率。设置为0则禁用这个特性。

apc.file_update_protection 整型
当你在一个运行着的服务器上修改文件时,你应该执行原子操作。也就是,先写一个临时文件,当写完后再重命名(mv)这个文件到它的最终位置。许多文本编辑 器,cp,tar和其他一些类似程序都不是这样操作的。这就意味着有机会去访问和(缓存)文件,当这个文件还在被写的情况下。 apc.file_update_protection的设置使得缓存标记新文件的延迟。默认值是2,意味着如果发现文件的修改时间距离访问时间不到2 秒,文件将不会被缓存。访问写到一半的文件的不幸用户将会看到离奇的情况,但至少这种情况不是持续的。如果你确信你经常使用原子操作来更新你的文件,你可 以关闭这个保护通过设置这个参数为0。如果你的系统充满io操作,并导致更新程序花费超过2秒,你可能需要去增大这个值。

apc.enable-cli 整型
大多是为了测试和调试。为CLI版本的PHP开启动APC功能。一般来说,你将不会想到为每一个 CLI请求创建,移植和放弃APC的缓存,但对于各种测试情况,这是很容易的为了CLI版本开启APC。

周鸿祎语录:新的创业公司要忍住抄袭的诱惑

【中国企业家网】(编者按)曾经“3Q”大战到最近因为在微博中炮轰雷军“山寨成不了乔布斯”,奇虎360董事长周鸿祎又掀起一场口水大战。这个个 子不高的湖北男子勤奋、偏执,有着极强的好胜心和攻击性。有人把他比作“牛虻”,在用自己独特的方式刺激中国互联网这头“牛”缓慢前进,也有人把他视为一 个作恶的人。而他自称自己为愣头青、250,也毫不讳言自己是网络世界的“110”。

他推崇阿甘精神,认为只有像阿甘那样懂得坚持,一步一步地走下去,才会取得最终的成功。他也曾表示,“偏执是一把双刃剑,但是过于偏执我就绝对不做 任何挑战,也不对。”然而,他仍坚信中国互联网是全球最有价值的互联网市场,中小公司应勇敢地走创新之路,“要忍受住抄袭的诱惑”,才可打破行业垄断模 式。

以下为周鸿祎的经典语录部分整理:

1、我跟马化腾先生没有任何个人矛盾,在许多方面我们其实颇为相似,比如说,我们都具有工程师背景,对于开发互联网产品都很有激情,他是中国最优秀的产品经理之一。很长时间以来,我们经常交换想法,包括通过短信形式联系,可不过这一切在3Q大战之后都停止了。

2、中国网络行业是封闭式市场,由几家大公司把持,缺乏美国那种创意火花。过去这就像是一大潭死水,里面满是硕大无朋却静止不动的鱼。今年所有这些公司都开始谈论开放平台,市场变得更活跃了。

3、我最大的优势在于善于倾听,如果我意识到我做错了,我会立即改弦更张。即使是低阶员工,也可以推翻我的决定。我这人不太耐心,有时对员工相当严厉,可许多人仍愿意追随我超过十年,或许这是因为他们觉得跟着我能学到一些东西。

4、我优点和缺点特别明显,是个性格非常鲜明的人。年轻的时候人肯定都做过荒唐的事,我就那点荒唐事,就是3721。很多人认为你干过一次坏事,你 就永远是坏蛋,我是非常不接受这一点的。所以我觉得因为3721这件事情,就把帽子永远扣在我头上,对我是不公平的,因为我已经公开承认错误了。

5、我被雷倒了忍无可忍,这是真实的雷军,乔布斯的伟大和你有矛盾冲突么?他的光芒不是让世界失色,而是让世界更精彩,没有乔布斯创造出来这些产品 的启发,很多人都还在瞎模索呢,所以你何必装 ‘果粉’(编辑注:即苹果粉丝)呢,你内心觉得既生乔何生雷,全是对乔布斯的怨恨,其实成功商人的你和理想主义者乔布斯真的不是一类人。

6、既然一不小心表白了内心真话,就别再删改粉饰了,下面这些话都是原话吧,我没法理解一个山寨乔布斯的人拿老乔的健康生死去调侃,不管有没有乔布斯我都觉得山寨货永远也成不了真的乔布斯,因为基因不同,如果是苹果的粉丝和用户就应该转发,别让山寨货糊弄年轻人。

7、创业者不要急于求成,不要期望快,要有耐心。百度、腾讯做到今天是十年以上,我们很多创业者要给自己设定5-8年的时间,要有耐心,创业就像酿酒一样,是需要花时间的。

8、作为一个产品经理,先要做到放弃自我。自大和自我是做产品最大的忌讳。当你真正的去做一个大众化的产品的时候,你就不能再把自己当成典型用户,但是你要把自己扮演成典型用户去思考,把自己想象成不懂计算机和技术的“小白”,如此才能真正的挖掘到用户的需求。

9、这么多年我唯一的收获是我被用户骂多了,被骂多了,久病成医了。到现在我就养成一个习惯,我去看别人产品的时候,比如谁的产品让我看,我不是代 表周鸿祎在看,我也不是为了写一篇评论在看,我是用中国最典型的小白用户的观点去看产品。你什么时候能够用这种观点去挑毛病,你有机会做大产品。

10、我每天花很多时间在微博上做客服,我每天给别人修电脑,我要听到用户的声音,我要从用户声音中仔细的思考这个声音真正代表了什么?再把它提炼 成产品改进的意见,这是从用户中来的,最后再到用户中去验证,而不是简单的实现用户的想法。一位真正代表主流用户思维的方式去思考产品所挑剔的产品经理, 不代表自己,不代表用户,但是你要学会让自己代表你所在市场中的主流消费用户。

11、《毛泽东选集》第一卷开篇第一句话:“谁是我们的朋友,谁是我们的敌人,这个问题是革命的首要问题。”我想换一种说法,对于做互联网产品的人来说,“谁是我们的用户,谁是我们的竞争对手,这个问题是从事互联网的首要问题。”

12、从用户中来,放下架子,真正从用户角度去看产品,把一切花哨的玩意儿去掉,把复杂的技术做到后台,让用户看到的是简单,简洁,让用户用起来是顺手,顺心。这样做出来的东西,才会受到用户的欢迎,才会让产品到用户中去,从而汇聚起大规模的用户基础。

13、我觉得技术这东西,不管是不是自己原创的,只要你有能力给用户带来比别人好的、一流的体验,那么你就是在创新,这种创新与做出核心技术相比,同样重要。

14、对于中国是否能出现苹果这样伟大的企业,我看法比较悲观,近期内不会。因为我们的文化不太容忍乔布斯这样个性张扬的人,我们社会的价值观太单 一,完全是物质化取向。我希望我们能够通过共同努力营造一个鼓励创新、宽容错误、激励年轻创业者的环境,允许Think differnet(编者注:不同想法)。(以上据公开资料整理)

PHP下eAccelerator使用记录

eAccelerator效果
直接引用HiAdmin的结论
eAccelerator 0.9.5.3
25.2266 fetches/sec

APC 3.0.19
24.3433 fetches/sec

XCache v1.2.2
15.13 fetches/sec

No OP-Cache
5.99332 fetches/sec

eA的效果最好,APC紧随其后,两者的性能表现基本相同,xcache最差。

eAccelerator经验
在我们的项目实际使用中,在开启eAccelerator之后,文件更新会有一些问题,比如更新了PHP文件之后,但是实际访问到的PHP文件却没有更新,解决方法:删除该PHP文件,重新上传。

不可否认的是,在启用了eAccelerator之后,系统负载能力会提高大概10%-50%左右。在访问压力较大的情况下,启用eAccelerator,会明显的看到系统load average的降低。

安装eAccelerator
1.Linux下先按照下面进行:
# tar jxvf eaccelerator-0.9.5.3.tar.bz2
# cd eaccelerator-0.9.5.3
# ./configure –enable-eaccelerator=shared –with-php-config=/usr/local/php-fcgi/bin/php-config
# make
# make install
# mkdir /tmp/eaccelerator && chmod 777 /tmp/eaccelerator && touch /var/log/eaccelerator_log && mkdir /usr/local/php-fcgi/ext
# mv /usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so /usr/local/php-fcgi/ext/

2.编辑php.ini
# vi /usr/local/php-fcgi/etc/php.ini
首先找到: extension_dir = “./”
修改成: extension_dir = “/usr/local/php-fcgi/ext/”
在最底部加上:
extension=eaccelerator.so
eaccelerator.shm_size=”16″
eaccelerator.cache_dir=”/tmp/eaccelerator”
eaccelerator.enable=”1″
eaccelerator.optimizer=”1″
eaccelerator.check_mtime=”1″
eaccelerator.debug=”0″
eaccelerator.log_file = “/var/log/eaccelerator_log”
eaccelerator.filter=””
eaccelerator.shm_max=”0″
eaccelerator.shm_ttl=”0″
eaccelerator.shm_prune_period=”0″
eaccelerator.shm_only=”0″
eaccelerator.compress=”1″
eaccelerator.compress_level=”9″

更详细的安装过程可以查看这几个地址。

http://www.ccvita.com/353.html

针对中小型网站的服务器架构(一)

http://www.chedong.com/blog/archives/001154.html

Linux下的/dev/shm/

/dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。
/dev /shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有 100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的,否则谁还敢往里头存文件呢?
默 认的最大一半内存大小在某些场合可能不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。 mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm

在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件。

 

为当/dev/shm空间不够时可以占用swap的空间,所以不用担心存储空间不够用。想想看,从磁盘IO操作到内存操作,php读写SESSION的速度会快多少?只是需要注意,存储在/dev/shm的数据,在服务器重启后会全部丢失。

 

默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
  tmpfs有以下优势:
  1,动态文件系统的大小。
  2,tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
  3,tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。
  好了讲了一些大道理,还是讲讲应用吧:
  首先在/dev/stm建个tmp文件夹,然后与实际/tmp绑定
  mkdir /dev/shm/tmp
  chmod 1777 /dev/shm/tmp
  mount –bind /dev/shm/tmp /tmp(–bind )
  在使用mount –bind olderdir newerdir命令来挂载一个目录到另一个目录后,newerdir的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性,除了名称。
巧用tmpfs加速你的linux服务器,就是使用虚拟磁盘来存放squid的缓存文件和php的seesion。速度快不少哦!
默 认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
tmpfs有以下优势:
1。动态文件系统的大小,
2。tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
3。tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。
好了讲了一些大道理,大家看的烦了吧,还是讲讲我的应用吧:)
首先在/dev/shm建个tmp文件夹,然后与实际/tmp绑定
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount –bind /dev/shm/tmp /tmp

1. squid的缓存目录设置
vi /etc/squid/squid.conf
修改成
cache_dir ufs /tmp 256 16 256
这 里的第一个256表示使用256M内存,我觉得http://www.linuxaid.com.cn/articles/4/4 /441672019.shtml里使用ramdisk的方法还不如直接使用tmpfs,至少每次启动不用mkfs,还可以动态改变大小。这时的/tmp 实际就是/dev/shm/tmp
然后重启一下服务,ok,现在所有的squid缓存文件都保存倒tmpfs文件系统里了,很快哦。

2. 对php性能的优化
对于一个访问量大的以apache+php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。
保存seesion的方法很简单了只要修改php.ini就行了,由于我已经把/dev/stm/tmp与/tmp绑定,所以不改写也行,至于php程序产生的缓存文件那只能改自己的php程序了:)
至于tmpfs的其他应用,我想大家可能通过这篇文章会有所启发。 

用于Lucene的各中文分词比较

对几种中文分析器,从分词准确性和效率两方面进行比较。分析器依次为:StandardAnalyzer、ChineseAnalyzer、 CJKAnalyzer、IK_CAnalyzer、MIK_CAnalyzer、MMAnalyzer(JE分词)、PaodingAnalyzer。
单纯的中文分词的实现一般为按字索引或者按词索引。按字索引顾名思义,就是按单个字建立索引。按词索引就是按词喽,根据词库中的词,将文字进行切分。车东的交叉双字分割或者叫二元分词我觉得应该算是按字索引的改进,应该还是属于字索引的范畴吧。

Continue reading “用于Lucene的各中文分词比较”