1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
专注WEB编程开发技术
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
早在2014年,就已经有很多安全研究专家表示,target=”_blank”属性是非常不安全的一个属性。而且当初有些关于该属性的安全报告为了引起人们的注意,还特地将标题设置得非常醒目。
现在,许多主流的互联网服务提供商都会在网页的链接地址中加入target=”_blank”属性,而这绝对是一种非常不安全的行为。不仅如此,target=”_blank”属性还将会使广大互联网用户暴露在钓鱼攻击的风险之下。
早在2014年,就已经有很多安全研究专家表示,target=”_blank”属性是非常不安全的一个属性。而且当初有些关于该属性的安全报告为了引起人们的注意,还特地将标题设置得非常醒目。
漏洞实现机制
LVS是Linux Virtual Server的简写,即Linux虚拟服务器,是一个虚拟的服务器集群系统。
在下面的案例中,我们用了3台主机,IP地址分别为:
192.168.1.100
192.168.1.101
192.168.1.102
其中,192.168.1.100将安装LVS做为负载均衡器来分发请求,另外2台做为真实提供服务的主机,以DR模式进行部署。
首先,我们应先在192.168.1.101和192.168.1.102上部署好Apache或是Nginx,还有PHP,这里就不详细说明了,可以参考本站的《Nginx + PHP(FastCGI)安装配置笔记》(http://www.sunbloger.com/article/242.html)。
为了便于测试,我们在192.168.1.101上放置一个test.php,代码如下:
<?php echo '101'; ?>
并在192.168.1.102上也放置一个同名文件test.php,代码如下:
<?php echo '102'; ?>
分别通过浏览器访问http://192.168.1.101:80/test.php和http://192.168.1.102:80/test.php,正常的话会分别显示101和102。
接下来,我们分别在192.168.1.101和192.168.1.102上添加用于LVS的脚本,我们可以将脚本添加到/etc/rc.d/init.d下,作为系统服务随Linux一起启动,方法如下:
vi /etc/rc.d/init.d/lvs-rs //创建名为lvs-rs的脚本 chmod +x /etc/rc.d/init.d/lvs-rs //添加执行权限 chkconfig --add lvs-rs //加入到系统服务中
lvs-dr脚本代码如下:
#!/bin/bash # chkconfig: 35 90 10 # description: LVS of RealServer VIP=192.168.1.100 . /etc/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "LVS of RealServer Start." ;; stop) ifconfig lo:0 down route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "LVS of RealServer Stoped." ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
接下来,我们开始为192.168.1.100安装LVS。
yum install ipvsadm
在CentOS下推荐采用yum安装,可以避免内核版本对LVS的影响。
ipvsadm安装完毕后,我们为192.168.1.100添加一个名为lvs-ds的服务启停脚本,代码如下:
#!/bin/bash # chkconfig: 35 90 10 # description: LVS of DirectorServer VIP=192.168.1.100 RIP1=192.168.1.101 RIP2=192.168.1.102 . /etc/init.d/functions case "$1" in start) /sbin/ipvsadm -A -t $VIP:80 -s wlc /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1 touch /var/lock/subsys/ipvsadm >/dev/null 2>&1 echo "LVS of DirectorServer start." ;; stop) /sbin/ipvsadm -C rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1 echo "LVS of DirectorServer stoped." ;; status) if [ ! -e /var/lock/subsys/ipvsadm ];then echo "LVS of DirectorServer stoped." exit 1 else echo "LVS of DirectorServer OK." fi ;; *) echo "Usage: $0 {start|stop|status}" exit 1 esac exit 0
将lvs-ds添加到系统服务中:
vi /etc/rc.d/init.d/lvs-ds //创建名为lvs-rs的脚本 chmod +x /etc/rc.d/init.d/lvs-ds //添加执行权限 chkconfig --add lvs-ds //加入到系统服务中
至此,3台主机部署完毕,开始测试
首先在192.168.1.101和192.168.1.102上分别启动lvs-rs
service lvs-rs start
然后在192.168.1.100上启动lvs-ds
service lvs-ds start
通过http://192.168.1.100:80/test.php来测试LVS工作是否正常,反复刷新页面会看到随机显示101或102就代码部署成功了。
阳光部落原创,更多内容请访问 http://www.sunbloger.com/
经过半年多时间的打磨,采用PHP语言编写的,超轻量级MVC框架MiniFramework的0.8.0版本于2016年8月14日发布。
新版本的变化主要有:
MiniFramework源码请移步至:https://github.com/jasonweicn/MiniFramework
最新的0.8.0版请移步至:https://github.com/jasonweicn/MiniFramework/releases/tag/miniframework-0.8.0
打开WordPress的wp-includes/media.php文件
搜索apply_filters( ‘wp_image_editors’, array( ‘WP_Image_Editor_Imagick’, ‘WP_Image_Editor_GD’ ) );
将 ‘WP_Image_Editor_Imagick’ 和 ‘WP_Image_Editor_GD’ 位置对调即可(实际上是改变优先级)
代码如下:
<?php define('FFMPEG_PATH', '/usr/local/ffmpeg2/bin/ffmpeg -i "%s" 2>&1'); function getVideoInfo($file) { $command = sprintf(FFMPEG_PATH, $file); ob_start(); passthru($command); $info = ob_get_contents(); ob_end_clean(); $data = array(); if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) { $data['duration'] = $match[1]; //播放时间 $arr_duration = explode(':', $match[1]); $data['seconds'] = $arr_duration[0] * 3600 + $arr_duration[1] * 60 + $arr_duration[2]; //转换播放时间为秒数 $data['start'] = $match[2]; //开始时间 $data['bitrate'] = $match[3]; //码率(kb) } if (preg_match("/Video: (.*?), (.*?), (.*?)[,\s]/", $info, $match)) { $data['vcodec'] = $match[1]; //视频编码格式 $data['vformat'] = $match[2]; //视频格式 $data['resolution'] = $match[3]; //视频分辨率 $arr_resolution = explode('x', $match[3]); $data['width'] = $arr_resolution[0]; $data['height'] = $arr_resolution[1]; } if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) { $data['acodec'] = $match[1]; //音频编码 $data['asamplerate'] = $match[2]; //音频采样频率 } if (isset($data['seconds']) && isset($data['start'])) { $data['play_time'] = $data['seconds'] + $data['start']; //实际播放时间 } $data['size'] = filesize($file); //文件大小 return $data; } //用法 $video_info = getVideoInfo('video.mp4'); print_r($video_info); ?>
本例中,会用到passthru,可能部分虚拟主机会将此命令禁用。
短网址(Short URL) ,顾名思义就是在形式上比较短的网址。在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。
下面是用PHP实现短网址转换的算法,代码如下:
<?php //短网址生成算法 class ShortUrl { //字符表 public static $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static function encode($url) { $key = 'abc'; //加盐 $urlhash = md5($key . $url); $len = strlen($urlhash); //将加密后的串分成4段,每段4字节,对每段进行计算,一共可以生成四组短连接 for ($i = 0; $i < 4; $i++) { $urlhash_piece = substr($urlhash, $i * $len / 4, $len / 4); //将分段的位与0x3fffffff做位与,0x3fffffff表示二进制数的30个1,即30位以后的加密串都归零 //此处需要用到hexdec()将16进制字符串转为10进制数值型,否则运算会不正常 $hex = hexdec($urlhash_piece) & 0x3fffffff; //域名根据需求填写 $short_url = "http://t.cn/"; //生成6位短网址 for ($j = 0; $j < 6; $j++) { //将得到的值与0x0000003d,3d为61,即charset的坐标最大值 $short_url .= self::$charset[$hex & 0x0000003d]; //循环完以后将hex右移5位 $hex = $hex >> 5; } $short_url_list[] = $short_url; } return $short_url_list; } } $url = "http://www.sunbloger.com/"; $short = ShortUrl::encode($url); print_r($short); ?>
通常我们用四组网址中的第一组即可。
这里需要注意的是,这个算法是不可逆的,因此,通常的做法是将短网址和对应的原网址存入数据库,当访问时,从数据库中取出匹配的原网址,通过301或header进行跳转。
PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。
下面我们演示一下如何通过反射,来调用执行一个类中的私有方法:
<?php //MyClass这个类中包含了一个名为myFun的私有方法 class MyClass { private $tmp = 'hello'; private function myFun() { echo $this->tmp . ' ' . 'world!'; } } //通过类名MyClass进行反射 $ref_class = new ReflectionClass('MyClass'); //通过反射类进行实例化 $instance = $ref_class->newInstance(); //通过方法名myFun获取指定方法 $method = $ref_class->getmethod('myFun'); //设置可访问性 $method->setAccessible(true); //执行方法 $method->invoke($instance); ?>
阳光部落原创,更多内容请访问 http://www.sunbloger.com/
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。
这里我们分享一个将图片转换为base64编码格式的方法:
<?php $img = 'test.jpg'; $base64_img = base64EncodeImage($img); echo '<img src="' . $base64_img . '" />'; function base64EncodeImage ($image_file) { $base64_image = ''; $image_info = getimagesize($image_file); $image_data = fread(fopen($image_file, 'r'), filesize($image_file)); $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data)); return $base64_image; } ?>
通过上面的方法转换后得到的base64编码字符串,可以存放到数据库中,需要时可以直接从数据库中读取,减少访问图片时的请求数量。
另:这个方法已经包含进MiniFramework的全局函数库中了。
阳光部落原创,更多内容请访问 http://www.sunbloger.com/
Memcached中对于键(key)的限制为最大不超过250个字符。同时,对于存储的value最大可以接受的数据不能超过1MB。
我们可以通过修改源代码的方式来改变对于key的长度限制。
方法为:
修改memcached.h文件,找到 #define KEY_MAX_LENGTH 250,将250修改为其他数值,例如:#define KEY_MAX_LENGTH 512
而关于value的1M的限制,可以在启动命令中增加-I 2m这样的参数,就可以将原本1M的限制提升至2M。