1)CURL实现探测:能够找到Content-Range则表明服务器支持断点续传,有些服务器还会返回Accept-Ranges:



2)用wget实现分片下载的探测:

————————————————————————————————————————————————————————————————
curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif
HTTP/1.1 206 Partial Content
Date: Thu, 13 Mar 2014 00:20:10 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=AC9512E1E6932D67A05F4F090DE836FC:FG=1; expires=Fri, 13-Mar-15 00:20:10 GMT;

max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
ETag: "627-4d648041f6b80"
Accept-Ranges: bytes
Content-Length: 10
Cache-Control: max-age=315360000
Expires: Sun, 10 Mar 2024 00:20:10 GMT
Content-Range: bytes 0-9/1575
Connection: Keep-Alive
Content-Type: image/gif
上面是curl获取到的响应头信息,其中如果能够找到Content-Range则表明服务器支持断点续传,有些服务器还会返回Accept-Ranges。

Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求

Content-Range:在整个返回体中本部分的字节位置,因为我们请求的是图片的前10个字节,所以Content-Range的值是bytes 0-9/1575,后面的1575是图片总的字节数。

另一种方法
wget -S http://www.baidu.com/img/bdlogo.gif 2>&1 | grep 'Accept-Ranges'
如果能看到输出Accept-Ranges,则表明服务器支持断点续传,否则不支持。

Nginx服务器默认支持断点续传的,无线做任何额外配置。

来自:http://www.letuknowit.com/post/45.html
Hash贯穿了PHP的数组、对象,总之,这个hash是个很基础重要的东西:
http://blog.csdn.net/heiyeshuwu/article/details/44259865
在执行一个shell脚本时,遇到了“-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy”错误提示,如下所示:

[oracle@DB-Server bin]$ ./killSession.sh  
    -bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy

此时只需要在#!/bin/bash,加一空格#! /bin/bash即可解决问题。

点击在新窗口中浏览此图片

另外一种情况: 当有其它进程访问这个文件,可以通过lsof | grep  killSession.sh来查看是否有其它进程正在访问该文件。

此时可以用kill命令杀掉其它进程。解决上面这个问题。

转自:http://www.cnblogs.com/kerrycode/p/4038934.html
背景:有时有做一些H5的websocket做模仿linux下的tail -f,形成一个实时日志查看工具时,会对写入事件前的文件大小和写入事件后的文件大小作一个计算,而在实际调试时发现这个PHP的filessize函数是有缓存的,这个链接的兄弟在问怎么破?(http://segmentfault.com/q/1010000003843245),如下文所示 。

定义和用法
clearstatcache()函数的作用是:清除文件状态缓存。
PHP的缓存数据对更快更好的运行函数是非常有利的。如果一个文件在脚本中测试了多次,你也许会禁止对正确的结果进行缓存。为了实现这点,你可以使用clearstatcache()函数。
语法
clearstatcache()
提示和注意
提示:执行缓存的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms()

案例

上述代码将输出下面的结果:
事件前文件大小:59635
事件后文件大小:59639

来自:http://www.chinaz.com/program/2010/0302/107501.shtml
背景:听说要写rocksdb的PHP扩展,推荐到PHP官方去,一看发现这个db很牛,支持key-value的查找,Facebook开源闪存数据库RocksDB。

关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/

RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。

RocksDB:


#include "rocksdb/db.h"

rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;

rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);

assert(status.ok());

status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);

delete db;
#include "rocksdb/db.h"

rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;

rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);

assert(status.ok());

status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);

delete db;

LevelDB:


#include "leveldb/db.h"

leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;

leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);

assert(status.ok());

status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);

delete db;

#include "leveldb/db.h"

leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;

leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);

assert(status.ok());

status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);

delete db;


RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。

RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key

RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。

RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。

RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。

RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。

压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。

在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。

RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。

RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。

看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。

个人觉得RocksDB尚未解决的地方:

依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。
关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。

来自:http://tech.uc.cn/?p=2592
背景:说WordPress提升了229%,我怎么没有察觉到呢?不管怎么样,GA了。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎

GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的

其他的还有:

RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从

Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。

Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
背景:说WordPress提升了229%,我怎么没有察觉到呢?不管怎么样,GA了。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎

GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的

其他的还有:

RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从

Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。

Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
背景:swoole的出现,其背景是带有腾讯mongo和rango,mongo曾经在腾达30楼(想不起了)传PHP道时,见过半面,问过一个问题,rango兄弟出来后带着其思想重新写了swoole,于是,swoole主要思想和之前的pws有一部分相同,但其更主要用在嵌入式的长连接这块,其省掉了rinit这块在高并发的性能上更高一些,但变量上不能运行完销毁导致不能定相同变量,这块追求性能是要有代价的。

众所周知,传统的 PHP 应用程序有 Request Startup 和 Request Shutdown 的生命周期,所有的对象在请求后都将销毁,而 Blink 于此不同, Blink 许多对象都能留存与多个请求之间,减少对象反复创建销毁的性能损失。
摘自:http://www.oschina.net/p/blink-framework

作为swoole的顾问(故得上就细问,顾不上就问一下),我想swoole的开源思想比技术可能更重要,未来swoole的方面可能会向linux裁剪下的内存小于8M的上面作一定程度的倾斜,用在非常小的cpu和路由上,以php为界面操作路由,联网控制长连为基础,把体积变更小,更省硬件成本。
http://mp.weixin.qq.com/s?__biz=MzI2OTA5NTM2Mg==&mid=400981627&idx=1&sn=1367db94644ff7f28e29971abde433d1
背景:提高了性能,任何事情都可以辩证的看,稳定性于鲁棒性,光的波粒二象性,凡事都有两面性,如戴眼镜虽然可以装丝文,但是雨中漫步的时候容易撞电线杆;抽烟可以让身上有女生喜欢的淡淡烟草味,但是会危害周围人的健康;醉酒虽然可以让人精神愉悦,但是会说出真话,这些都是我的亲身体验.......写不下去了。

wintiongXX - sng<wintiXX@gmail.com>  14:39:09
php里哪个函数,是可以在php执行过程中直接响应nginx,但是让php继续执行?
cody(2501385XX)  14:40:44
        fastcgi_finish_request();
wintiongXX - sng<wintiXX@gmail.com>  14:41:22
我就记得有这个函数,一时想不起来了
@cody
X哥chen(X哥)<blXXX.c@163.com>  14:45:09
用fastcgi_finish_request要注意一下,
如果fastcgi_finish_request"之后", 到整个程序完成的时间还很久或有其他的阻塞调用,
当前进程是无法处理请求的, 可能导致各种问题
wintiongXX - sng<wintiXX@gmail.com>  14:46:23
这个知道的,其实总体而言进程耗时没变化,只是有些东西没必要让用户等你
erikYXXX-TEG(744366XXX)  14:48:32
使用这个函数不能使用file存储session(使用其他存储也需要关掉session 锁)。不然用户A第一次持有session访问,如果后续操作有耗时操作,用户的session会被锁住,导致后续访问卡住。
问苍天个猫(13427XXX)  15:01:35
可以提前session_write_close啊
erikYXXX-TEG(744366XXX)  15:01:59
也是可以的。
——————扯淡开始———————
JackX-回忆未来有甚用(372647XXX)  16:19:27
请问各位弟兄们,这两个函数放在一块有啥区别:
1.PHP ignore_user_abort() 函数, ignore_user_abort(true); php关闭浏览器还能运行函数。
2.        fastcgi_finish_request();
都解决了啥么子问题???
JackX-回忆未来有甚用(372647XXX)  16:24:06
我问的问题就没一个人接一个?还是认为我不是搞PHPer的啊
问题太肤浅?
allendai<snowheart.dai@gmail.com>  16:24:56
没用过。。
JackX-回忆未来有甚用(372647XXX)  16:27:31
我只是好奇,哈哈~
你说这些鸡肋功能开发出来有毛用啊,还好天峰说没有之一,哈哈。
Ran-韩最好语言(128112XX)  16:29:13
因为PHP设计之初只有 请求开始到请求结束 这段生命周期,后面的它控制不了。各种函数的出现就是为了弥补这个缺陷。
JackX-回忆未来有甚用(372647XXX)  16:29:16
PHP ignore_user_abort() 函数,我用来做一些导表由PHP从A到B做下逻辑导入数据库,浏览器上访问下容易超时,于是用到。
至于这个: fastcgi_finish_request(); 我也是听x哥在说,于是问下,都用来干嘛子?上传视频后-》转码->入库->推前台,第二三四都可以连接起来???
Ran-韩最好语言(128112XX)  16:29:28
使用消息队列异步处理才是正途。
erikYXXX-TEG(744366XXX)  16:29:54
php session lock主要是各个session促出模块实现自己实现的锁。默认的session 存储是文件,实现是在打开之前flock session文件。如果选择memcached存储session,锁是在memcache扩展里面实现的。
如果自己实现SessionHandler接口存储,可以选择不实现锁。
fastcgi_finish_request 可以提前把结果返回给nginx,之后脚本还可以保留上下文执行一些任务,可以算是伪异步。最好还是使用MQ来异步处理任务。
allendai<snowheart.dai@gmail.com>  16:30:06
……用浏览器调用导入程序
这就是你的不专业了
JackX-回忆未来有甚用(372647XXX)  16:31:05
我觉得也是,所以我觉得兄弟们都是专业的,
可为何发明这个鸡肋功能,有点玩的感觉哟。

结论:
X哥chen(X哥)<blXXX.c@163.com>  16:38:59
+1
异步化才是正途
背景:在外面上面放一个phpmyadmin的发现阿里的云盾发现有人居然来试着访问,网上不安全。
攻击IP                攻击时间                      攻击URL                                                                                                                攻击类型  处理结果
199.191.57.182  2015-10-16 05:29:33  101.20*.1*.**/phpmyadmin/scripts/setup.php Match1:/phpmyadmin/scripts/setup.php  其他  已拦截
——————————————————————————————————————————————————————————————————————
修改:config.inc.php
在第一行加入
$ip_prefix = '192.168.121.';
if (substr($_SERVER['REMOTE_ADDR'], 0, strlen($ip_prefix)) != $ip_prefix ) die('illegal access error');
ip可以设置成你自己电脑的ip。如果是内网建议直接设置成自己的ip地址取代ip地址段。这样的话可以防止其它用户在内网中访问。如果是公网ip限制,直接使用即可。
只是简单的限定,没有太大要求只是暂时限定,可以使用这种方式。临时性的限制用户去访问。



当然,也可以用foreach写成一个数组来处理..........

摘自:http://www.jb51.net/article/34509.htm



phpMyAdmin 因PHP的session目录及自身目录权限引发错误解决:
问题一:phpMyAdmin -Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.



问题:打开phpmyadmin出现如下错误:Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.
解决办法如下:
vim /etc/php5/apache2/php.ini
查找session.save_path ,将session.save_path=/var/lib/php5这一句的注释符号去掉。
如还不能正常工作,将session.auto_start的值改为1(启动),默认是0(禁用)
这个错误一般是由于session文件的存储路径不可写造成的,在linux下一般是路径的权限问题。在windows下面session.save_path一定要设置到一个可以读写的路径,如 D:/tmp 等。
摘自:http://blog.sina.com.cn/s/blog_62cd41130100uhpv.html
=====================================================================================
问题二:phpmyadmin错误Wrong permissions on configuration file, should not be world writable!


登录phpmyadmin,发现提示Wrong permissions on configuration file, should not be world writable!,提示配置文件必须不可写,这里改成755就OK了.
用以下命令 chmod -R 755 /home/wwwroot/phpmyadmin
摘自:http://www.111cn.net/phper/31/59722.htm
对于phpmyadmin“无法载入 mcrypt 扩展,<br />请检查 PHP 配置”的问题,我记得前段时间还有午饭提问过。
自己很长一段时间之前就遇过这个问题,但是也不知道怎么解决的,记得是安装过两个RPM包就搞定。
对于这个问题,可以发现网上发问的可是N多呀,普遍都经受这个折腾。
现在在自己的LNMP下重新进行了安装,也出现这个问题。当我再次尝试安装
libmcrypt-2.5.7-3.el5.remi.i386.rpm
php-mcrypt-5.1.6-1.el5.i386.rpm
不过得不到解决,于是我选择通过源码包编译安装libmcrypt-2.5.7.tar.gz ,并且重新编译到PHP中去,最终解决了
该问题。
#tar zxvf  libmcrypt-2.5.7.tar.gz
#cd libmcrypt-2.5.7
#./configure --prefix=/usr/local/libmcrypt
#make && make install
重新编译php:
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fastcgi --enable-fpm --enable-mbstring --with-mcrypt=/usr/local/libmcrypt/
这里顺便编译php的配置文件php.ini
extension=php_mbstring.dll  把这行前面的;去掉
然后重启mysql、php-fpm、nginx
重新登录phpmyadmin就不显示了。

————————————————————————————————————————————————————————
来自:http://bbs.51cto.com/thread-821175-1.html
背景:正则是一门厚书啊,想写好也不容易,但日常中也就那些像电话、邮箱、手机,网上一堆,但真好验证好了,还得了解一点正则知识,再就是多测试了:-)
下面邮箱正则:
中划线:中划线域名就是米农口中说的扁担域名了,扁担域名由于输入比较麻烦,看起来也比较不正规,是没有多大的价值,目前投资的人是比较少的。按照DNS的标准,域名是不允许有下划线的。
下划线:一些人在注册用户名的喜欢使用下划线_,这种用户名在登录邮箱时很麻烦,给你发邮件的人也很不方便。
二级域名邮箱基本被消灭,这个哥们的正则可以写下划线,扩大了范围但问题不大,主要是起到提示用户就可以了。
com.cn域名支持:((\.[a-zA-Z0-9-]{2,3}){1,2}  com.cn  
——————————————————————————————————————————————————————————————
//emailpreg = /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/; //这个对QQ号的邮箱验证不了。
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/; //dfdfd1212@dfdfd.abc.cn 都成二级邮箱。abc@12df1.com.cn
emailpreg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9-])+((\.[a-zA-Z0-9-]{2,3}){1,2})$/;    //域名是不允许有下划线的 ,去掉下划线,这个就是最后的正则,发现其像afeng@staff.jackxiang.com 这样的匹配不了。至于还有啥首字母不能是下划线,要这样,这正则就还得加长...用户也不是sb,只是起到一定提示作用,别搞复杂了,还是做一下简单的验证,对后面的com,tv,com.cn啥的别验证太细了:
^[A-Za-z0-9]+((-|_|\.)[A-Za-z0-9]+)*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$
到此为止吧。
用正则猫可以分析一下:
^[A-Za-z0-9]+   :以大小写字母和数字开头, 并重复一次或多次。
(-|_|\.)             :中间可夹杂- _ . ,注意是分组,这个分组里是或,也就是可没有这些也成。
[A-Za-z0-9]+        :分装后紧跟大小写字母及数字,这个可以重复一次或多次。(如果- _ .没有可以理解为全是匹配一次或多次的大小写字母和数字符)
((-|_|\.)[A-Za-z0-9]+)+      :小组里并成大组匹配一次或多次。
后面也是类似和前面的分组,最后加一个点再匹配一次或多次(点后的com,org,并没有作长度限定)!
============================================================================
<dd><input id="2" rel="邮箱"  res='2' type="text" class="item-edit-txt"  name="2" value="<{$user.email}>" ></dd>

}else if($(this).attr('res') == '2' && !emailpreg.test($(this).val())){//从QQ登录过来的用户大网接口获取不到邮箱,放开让其填写。
    $(this).css("border","1px solid #f00");
    $("#"+$(this).attr('res')+'span').remove();

    $("#"+$(this).attr('res')).after("<span id="+$(this).attr('res')+'span'+"><br />"+$(this).attr("rel")+"格式不正确</span>");
    $(this).focus();
    res = false;
    return false;



——————————————————————————————————————————————————————————————

JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
       var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
       return reg.test(str);
}

摘自:http://www.ijavascript.cn/yanzheng/validate-email-186.html
背景:有一兄弟用sftp往线下的那个服务器传更改的文件,发现传上去不好使呢,于是重新传,到后来又好了,我当时一看浏览器头,发现也没有啥问题呀,今天我自己搞了一把,发现还真有这个问题,细查了一下,是opcache引起的,默认是60秒。于是我给关了,之前是ea加速,现在新版本的php好像用这个opcache了:
; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2
————————————————————————
调试先关了,后面没问题再打开:


—————————————————————————
以下是opcache的配置说明:
复制代码

[opcache]
zend_extension = "G:/PHP/php-5.5.6-Win32-VC11-x64/ext/php_opcache.dll"

; Zend Optimizer + 的开关, 关闭时代码不再优化.
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1


; Zend Optimizer + 共享内存的大小, 总共能够存储多少预编译的 PHP 代码(单位:MB)
; 推荐 128
opcache.memory_consumption=64

; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB)
; 推荐 8
opcache.interned_strings_buffer=4


; 最大缓存的文件数目 200  到 100000 之间
; 推荐 4000
opcache.max_accelerated_files=2000

; 内存“浪费”达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5

; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,
; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,
; 但是会对已存在的应用造成破坏.
opcache.use_cwd=0


; 开启文件时间戳验证
opcache.validate_timestamps=1


; 2s检查一次文件更新 注意:0是一直检查不是关闭
; 推荐 60
opcache.revalidate_freq=2

; 允许或禁止在 include_path 中进行文件搜索的优化
;opcache.revalidate_path=0


; 是否保存文件/函数的注释   如果apigen、Doctrine、 ZF2、 PHPUnit需要文件注释
; 推荐 0
opcache.save_comments=1

; 是否加载文件/函数的注释
;opcache.load_comments=1


; 打开快速关闭, 打开这个在PHP Request Shutdown的时候会收内存的速度会提高
; 推荐 1
opcache.fast_shutdown=1

;允许覆盖文件存在(file_exists等)的优化特性。
;opcache.enable_file_override=0


; 定义启动多少个优化过程
;opcache.optimization_level=0xffffffff


; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.inherited_hack=1

; 启用此Hack可以暂时性的解决”can’t redeclare class”错误.
;opcache.dups_fix=0

; 设置不缓存的黑名单
; 不缓存指定目录下cache_开头的PHP文件. /png/www/example.com/public_html/cache/cache_
;opcache.blacklist_filename=


; 通过文件大小屏除大文件的缓存.默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0

; 每 N 次请求检查一次缓存校验.默认值0表示检查被禁用了.
; 由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0

; 从缓存不被访问后,等待多久后(单位为秒)调度重启
;opcache.force_restart_timeout=180

; 错误日志文件名.留空表示使用标准错误输出(stderr).
;opcache.error_log=


; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1

; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=

; 防止共享内存在脚本执行期间被意外写入, 仅用于内部调试.
;opcache.protect_memory=0

来自:http://www.cnblogs.com/HD/p/4554455.html

opcache.huge_code_pages=1 参数的内在关联:
http://www.laruence.com/2015/10/02/3069.html
昨天和一个前同事聊天,各种吐槽PHP,吐槽Swoole,他认为PHP到处是坑,PHP局限很大。PHP+Swoole不适合做高并发服务器,C+Swoole才是最好的方案。C++有各种数据结构,C++可以开线程,C++可以共享对象。看来有必要好好得说明一下了。

PHP不如C++ 吗?

PHP比C/C++或Java少了什么?多线程,多线程,多线程……

是的。PHP比C/C++、Java少了多了多线程。PHP只有多进程的方案,所以PHP里的全局变量和对象不是共享的、数据结构也不能跨进程操作、Socket文件描述符不能共享等等。所以PHP有局限?

多线程看似比多进程要强大很多,实际上我可以负责任的告诉你,多线程带来的坑更多。

数据同步问题会让你崩溃的。要么就牺牲性能到处加锁,要么就用地狱难度的无锁并发编程,据我所知目前国内能掌握此项技能的人凤毛麟角。

不要以为加锁就万事大吉了,你会在死锁问题上栽个大跟头。当你的程序逻辑复杂后,锁越来越难控制了,一旦死锁你的程序基本上就完了。

某个线程挂了那所有线程都会退出

反而在看多进程,其实就简单的多了。

配合进程间通信,基本上你可以实现任意的数据共享。比如利用一个进程专门存数据结构和对象,其他进程的数据操作全部投递到此进程来

多进程不需要锁

多进程可以使用共享内存的数据结构实现一些多线程的功能。如Swoole提供的Table、Atomic可以实现数据共享,但成本很低。未来还会加入共享内存队列

所谓PHP限制了Swoole,这完全是无稽之谈。合理利用Swoole提供的Table、Atomic、SendMessage/PipeMessage、Task完全可以实现异步非阻塞的代码逻辑。

C++写出来的程序性能更好?

这完全是盲目的迷信,密集计算的程序C++确实是有优势的。而并发服务器核心是IO,并非大规模密集运算。C++从语言层面来看并没有什么优势。另外C++中的大部分数据结构在PHP中都有对应的实现,实在不行自己写个专门的扩展也能解决之。

高并发的服务器单机能维持10W连接、每秒可处理3-5W笔消息收发。这种性能水准已经可以应用在BAT的核心系统上了。

开发效率快的意义是什么?

这位同事还说PHP开发Server虽然比C++快了,但是追求性能的极致还是要用C++。我要告诉你效率高了究竟意义何在。开发一套好程序不是一 件容易的事情,需要程序员投入大量时间和精力。开发效率提升的意义并不是简单的我可以更少时间完工,而是剩下的时间你可以增加单元测试、修复BUG、提升 用户体验、完善细节、提供配套工具、优化性能、增加关键日志、增加监控报警、增加容灾方案。

被swoole坑哭的PHP程序员:
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。

被swoole坑哭的PHP程序员

遇到的几点问题:

1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。

因为swoole是多线程编程,global是不能在多个进程间共享的。例

global $i = 0;

function onRequest() {

    echo $i++;

}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。

2:什么是异步、什么是回高

对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。

3:为什么onReceive收到的数据这么大

客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次

4:自制httpserve

写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。

原因

出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。

swoole的特色:网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。

使用swoole必须要掌握的技能

多线程编程

进程间通信

网络协议TCP/UDP的认知

PHP的各项基本技能

个人学习swoole的经历

在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。

总结

swoole并不是一个简单的PHP框架,正如swoole官方首页的第一句话“重新定义PHP”,千万不要用旧有php的思想来写swoole代码!swoole重新激活了PHP,php成就了swoole!
背景:关于rpc,即远程过程调用,这个技术最早是由sun公司发明出来,后来在linux上默认有rpc服务,该功能我最早见在新浪的企业邮箱里有这样一个运用,在用户登录这块用到rpc,其服务端实现了与mysql长连接的技术,进而减少了重次重新连接,提高了高并发时的性能,而后来在鸟哥的一个php框架里实现了类似的php rpc框架,也是用c写的,但究其根源,还是来自于xdr这样一种数据结构,其可以跨平台使用,进而它在做一些高并发这块的的确确有较好的效果,最近rango兄弟的swoole里发布后,也有兄弟基于它做成了Dora Rpc,值得了解,应该性能还成,可能试用并使用,毕竟简单、效率、快才是王道。
Dora RPC
简介(Introduction)

用于复杂项目前后端分离,分离后项目都通过API工作可更好维护管理。

是一款基础于Swoole定长包头通讯协议的最精简的RPC
目前只提供PHP语言代码
后续有什么bug或者问题请提交Issue

功能支持(Function)
支持单API调用,多API并发调用
支持同步调用,异步任务下发
其他相关知识请参考Swoole扩展
客户端长链接,请求完毕后仍旧保留,减少握手消耗
guid收发一致性检测,避免发送和接收数据不一致

dora-rpc/server.php

使用最简单的方式实现的服务端
目前需要继承才能使用,继承后请实现dowork,这个函数是实际处理任务的函数参数为提交参数
做这个只是为了减少大家启用RPC的开发时间
返回结果是一个数组 分两部分,第一层是通讯状态(code),第二层是处理状态(code)


使用方法(Example)

客户端(Client)


服务端(Server)



_____________________________________________________________________________
经过24小时持续压力测试,目前接口仍旧工作正常

使用的vagrant虚拟进行压测的分配了1G内存和1核CPU(Mac 2.2 GHz Intel Core i7)


压测进程:目前只开了10个php进程疯狂发送请求
并发性能:TPS 2100上下(比直接使用curl快很多)
响应时间:0.02~0.04s 偶尔出现0.4s
后端代码为:查询一次数据库后返回结果
CPU使用:10~25%
内存使用:一个PHP task 16M 目前开了30个进程
PHP版本:5.4.41
压测时使用端口个数:10个(长连接)

测试代码使用的使用客户端示范程序无限循环,服务端直接返回一个数组。
每次接口会请求一次api接口调用后再下发一个请求内含两个并发任务

其他资源情况如下:

Dora <wbr>RPC <wbr>虚拟机下实测性能

此开源使用Swoole特性制作
客户端使用长链接,处理请求结束后连接也不会断开,再次使用的时候会自动找回
服务端自动管理task及进程通讯
通过task处理业务
如果使用更高速的序列化函数取代serialize会更快一些
支持单api请求,多api并发请求,此功能可取代发展越来越怪的gearman
如果有持久化请求需求,可以考虑在此基础上自行封装下(会降性能的哦)

过几天增加个中间件,可以检测后端服务压力状态自动负载均衡~

github地址
https://github.com/xcl3721/Dora-RPC


有一个哥们测试了一下,地址:http://blog.sina.com.cn/s/blog_54ef39890102vkgh.html
背景:有时需要查一些函数,比如分隔函数,不知道那个分割符号是放第几位了,怎么办? 有时想看php.ini文件在哪儿了,怎么办?有时想看这个扩展如:swoole扩展的相关扩展信息怎么看?有时想看这个扩展的类名怎么看?有时想看这个扩展的函数有哪些怎么了解,这些都是问题,于是有该文。


php -i ,php -i|grep php.ini  php --ri swoole  php --ri memcache

零)php -i|grep php.ini
[root@localhost htdocs]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --ri <name>      Show configuration for extension <name>.


一)php --rf explode
[root@localhost htdocs]# php --rf explode
Function [ <internal:standard> function explode ] {

  - Parameters [3] {
    Parameter #0 [ <required> $separator ]
    Parameter #1 [ <required> $str ]
    Parameter #2 [ <optional> $limit ]
  }
}

二)php --ri memcache
memcache
memcache support => enabled
Version => 3.0.6
Revision => $Revision: 310129 $

Directive => Local Value => Master Value
memcache.allow_failover => 1 => 1
memcache.max_failover_attempts => 20 => 20
memcache.default_port => 11211 => 11211
memcache.chunk_size => 32768 => 32768
memcache.protocol => ascii => ascii
memcache.hash_strategy => consistent => consistent
memcache.hash_function => crc32 => crc32
memcache.redundancy => 1 => 1
memcache.session_redundancy => 2 => 2
memcache.compress_threshold => 20000 => 20000
memcache.lock_timeout => 15 => 15



三)--re <name>      Show information about extension <name>.
php --re memcache
Extension [ <persistent> extension #39 memcache version 3.0.6 ] {

  Method [ <internal:memcache, inherits MemcachePool> public method decrement ] {
        }

        Method [ <internal:memcache, inherits MemcachePool> public method close ] {
        }

        Method [ <internal:memcache, inherits MemcachePool> public method flush ] {
        }
      }



四)--rc <name>      Show information about class <name>.

php --rc memcache
Class [ <internal:memcache> class Memcache extends MemcachePool ] {

  - Constants [0] {
  }
背景:有时PHP像python那样可交互能对小代码片段的验证提高效果,但默认编译好像是不行的。
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",

试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.


./configure
make && make install

[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history

这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————


0 === false???

php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)



php -a
Interactive mode enabled

<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1





————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)

而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)

Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.

目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.

主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.

Interactive mode enabled

$ php -a
Interactive mode enabled

<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1

Interactive shell

$ php -a
Interactive shell

php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1

来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185



在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。

演示:http://segmentfault.com/a/1190000000353069
需要git。


—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base                      100% |=========================| 1.1 kB    00:00    
updates                   100% |=========================| 1.9 kB    00:00    
primary.sqlite.bz2        100% |=========================| 504 kB    00:00    
addons                    100% |=========================| 1.9 kB    00:00    
extras                    100% |=========================| 2.1 kB    00:00    
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git        
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile

yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5.  20% |=====                    | 1.5 MB    00:12 ETA

安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069  

你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:

git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。

[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.


[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris

分页: 5/24 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]