[原]子站点不可控的情况下iframe跨域自动适应高度

    关于iframe如何自动适应内部网站的高度,这个 在网上搜出来的千篇一律,都是用js获取内部内容的高度然后重新设置iframe的高度。但是这个方式在非跨域的情况下完全没有问题。只是跨域的时候,js是不能获得内部内容的高度的,什么都获取不到。

    很多的跨域解决方案都需要内部子站点做出动作,主动发起通知父站点的iframe。但是还有一种很棘手的情况,就是你对于子站点完全没有权限,或者,也不想为了这个事情,再去做一个通知这样的功能。

    所以,就只能自己动手满足自己的需求了。

    这里的方案的主要思路是:把跨域的转换成非跨域的

    我再本地项目中做一个页面专门用来对url对应网站的内容进行转发。

    a.php?url=www.baidu.com

<?php
echo file_get_contents('http://'.$_GET['url']);
?>

     这样的话,只需要将当前站点的 a.php?url=www.baidu.com 放在iframe当中就可以了,内部的css,js,图片等资源还是用的原来的远程地址,但是加载这些东西不会存在跨域问题,最重要的是这样我们就可以随意的用js去获取内部内容的高度了,然后再设置外部iframe的高度。

    唯一的弊端是:如果这个网站中又大量ajax加载的内容的话,就不适用这个方案,当然,jsonp的话是没关系的。

    因为如果页面中得内容是ajax加载进来的话,因为把页面转发到了本地网站,所以ajax会存在跨域请求不成功的问题,内容自然也就加载不出来了。

    所以,都是有缺点的,所以根据具体情况具体确定方案吧。

    

PS:我找过CSS的解决方案,但是没找到,不好使。有没有前端大神。知道可行的CSS解决方案???

Code | wwpeng | | (0) |

[原]关于高并发下限流用户访问

    在高并发大流量下总是有一些意想不到或者考虑不周全的事情发生。而一个网站首先是保证能够提供服务,哪怕分流或者降低速度(不得已情况下)。这就需要有一套限流的方案,在不得已的情况下启用,防止服务器停止服务。就好比小米商城抢小米时候的排队,其实就是类似的。这里我们向讨论一些简单的方案思路。

   方案1:

    直接按照用户访问数量的百分比进行限制。比如要举行大的促销。预计并发访问量是 15W,集群服务器平均打到每台机器上的并发访问量是 500,而单台机器的最大承受并发400,这时候只要限制20%的流量就可以了。(这些数据都是粗糙的举例,不要较真啊。)

    但是这种方案明显有一个弊端就是你判断不出来,当前的访问量是否需要启用限流,以为这样的限流都是针对某次大规模请求,有预估,促销之前,代码启用,促销之后,流量下降,代码就要下线。很是麻烦和不好评估统计。

   方案2:

    首先我们可以确定,一台机器的承受能力一般是固定的,可以测试出来的。如果我们能涉及一种计数机制,当QPS达到机器极限的时候限制,就可可以了。

    另外设计这种计数机制不能同步进行,也就是不能加锁,因为同步计数的话,会导致另外的进程等待。。这明显不符合初衷。比如说,我试过用memcache计数,但是很明显,链接memcache然后计数是一个同步过程,最后计数倒是一个都不差,但是很慢。但是不加锁并发惊醒的话就会导致有误差,也就是说多个进程取到同一个值,这个其实我们可以在测试过程中获得一个这种情况出现的概率。然后只要概率在接收范围之内就可以了。所以宗上,PHP的无锁共享内存就是一个可以考虑的方式。

    这里先说一下结果。

    在我自己的机器上,PHP5.4+nginx 四核 i5 nginx进程数4 模拟并发请求 200 限制用户数 100,超过计数的用户会跳转到一个等待页面。

    在这种情况下,实际数据是 进入的用户回进入 100-110左右。也就是说 会上浮 5%-10% (不过我觉得线上服务器CPU多达20多个核心,进程数也多很多,所以误差可能会更大一些

    下面看说一下实现方式:

    在共享内存当中存两个字段,一个字段用来计数,另一个字段用来计时,每一秒中,计数器从0开始重新计,如果超过预设值,就 跳出,否则进入。

    注意:PHP共享内存有两种方式,一种是 shmop系列,还有一种是 shm_attach 系列,这两种都可以完成共享内存的操作,具体区别。。请自行补脑。。我这里使用的是 shmop。 Continue reading

Code Server | wwpeng | | (0) |

[原]等概率随机函数

    最近面试呀,肯定又接触了不少以前没接触过的东西。这不,又遇上一个,整理了一段时间,就准备发上来啦。

    关于等概率随机函数,以前都是用随机数生成函数 直接给定范围,生成随机数。没有多想。

    这个的主要意思其实就是  用一个已知的等概率随机函数去完成另一个函数。

eg:已知函数 f5() 该函数的作用是生成一个 1-5 的随机数。请用该函数实现另一个函数 f7() 产生 1-7 的随机数。

ps:看上去好像实际过程中这玩意其实没什么用。1-7 rand 一下不就有了么。。其实这里面 比较重要的还是 了解 数学思想在实际中的应用。数学用的熟练了,就能写出比这有用多的东西啦。

    1. 使用一个算数式 扩展 f5() 产生的随机数。

    例如 : ( f5()-1 ) + f5()

    OK,这样一计算我们就发现,这个结果已经被扩展到了  1-9。但是!有的朋友应该注意到了,1-9并不是等概率产生的。我们来看产生的数字表格。

    

1 2 3 4 5
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9

    这样的话 最低概率 是 1 出现的概率是 1/25 最高是 5出现的概率 5/25。

Continue reading

Code | wwpeng | | (14) |

[译] 战前准备,Nginx优化指南

    原文地址:http://blog.zachorr.com/nginx-setup/

    ———————————————————————-

    大多数Nginx的安装指南告诉你基础信息 —— apt-get 一个包,这里那里的修改几行,这样 你就得到了一个web 服务器!并且,在大多数的情况下,这样傻瓜式安装的Nginx 可以很好的为你的站点工作。但是,如果你真的想压榨出Nginx的性能,你将不得不一步一步慢慢来。在这个指南中,我将说明如何对Nginx的参数进行微调能更好的应付较大的访问量。仅仅是一个说明,这不是一个全面的微调综合指南。它是对调整一些设置能提交的性能的一些说明。你的水平可能不同(读者水平参差不齐)。

基础(优化)配置

    你只需要修改你的Nginx配置文件 nginx.conf,这里有全部的nginx的不同模块的设置项。你应该能够你的服务器的 /etc/nginx 目录下找到nginx.conf。首先,我将告诉你一些全局设置,然后在讨论各个模块的设置,谈论哪些设置能为大的访问量提供最佳性能,和为什么他们能有更好的性能,在文章的末尾你可以找到一个完整的配置文件。

顶级配置

    Nginx的nginx.conf配置文件中有少数几个配置选项,在其他模块配置之上。

user www-data;

pid /var/run/nginx.pid;

worker_processes auto;

worker_rlimit_nofile 100000;

    userpid 都应该使用默认设置。我们不用修改,他不会为我们的性能用户做什么。

    worker_processes 定义的是nginx为你的站点提供服务时可以启用的worker进程的数量。这个配置的最优值取决与很多的因素,包括(但不仅限于)CPU的核心数量,数据硬盘的数量以及负载模式。当你不确定的时候,将它设置为CPU的核心数是一个不错的开始(如果这个值是“auto”nginx将尝试自动检测)。

    worker_rlimit_nofile 更改这个限制,可以更改worder进程最大的文件打开数。如果没有设置,将使用操作系统的限制值。设置后你的系统和nginx能处理比 “ulimit -n” 更多的文件。所以我们要将这个值设置的高一些,这样nginx就再也不会出现 “too many open files” 的issue了。确保你的操作系统也更新了这些值。

Continue reading

[原]RecursiveDirectoryIterator 递归目录迭代器

    PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT. 

    对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.

    以上是PHP迭代器的一些描述。这里我们主要来看以下 RecursiveDirectoryIterator 这个迭代器的作用,这个东西其实还是比较有用的只是容易被大家忽略。他的主要作用就是实现递归目录扫描,返回目录中的内容。很多人一想到要扫描目录 然后就google一下,然后国内的文章基本都是粘来粘去,都一样的,用 dir  read scandir 之类的循环,并不是说不行或者不好,只是PHP给我们提供了一个更方便的方式。

    那就是 RecursiveDirectoryIterator 和 RecursiveIteratorIterator 了。他们同属于 SPL 的迭代器范围。

SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。SPL 还提供了其他非常多的迭代器  详见: 文档

    OK,我们继续回到扫描目录的问题。其实非常简单只是大家都不知道而已,没啥高深的东西,做个示例就OK了。

Continue reading

PHP | wwpeng | | (0) |

[原]PHP服务器端上传参数限制

1.首先我们先看最常见的配置选项,php.ini 中的配置

upload_max_filesize “2M” PHP_INI_PERDIR 在 PHP <= 4.2.3 时是 PHP_INI_ALL。 

post_max_size “8M” PHP_INI_PERDIR 在 PHP <= 4.2.3 时是PHP_INI_SYSTEM。从 PHP 4.0.3 起可用。

upload_max_filesize 配置的是 上传的文件的大小限制 默认值2M.

post_max_size 配置的是 post的请求做提交的内容的最大限制,默认值8M

这也就是我们最常见的想要上传更大的文件需要修改的配置参数。post_max_size 理论上应该比 upload_max_filesize 大,因为文件上传包含在post请求当中。

2.关于.htaccess文件中的配置选项

php_value upload_max_filesize 50M  #上传文件大小限制 默认 2M

php_value post_max_size 100M         #POST 提交数据的大小限制 默认8M

.htaccess 文件配置生效的前提条件是 该站点的虚拟主机中 配置了:AllowOverride All

3.关于HTML tag中对上传文件的大小限制:

<input type=”hidden” name=”MAX_FILE_SIZE” value=”100″ />

Continue reading

PHP | wwpeng | | (0) |

[原]PHP GD库静态图片格式转换

近期自己一直做的一个图片分享类别的网站,对于上传之后的图片处理转换的一些东西记录分享一下。

PS:目前有很多三方云服务提供图片云,这就不需要我们自己来处理了,他们的方案更好而且还有各种CDN,个人预算能省则省,自己动手丰衣足食,如果是公司项目访问量过大,还是用云服务吧,自己转换挺费资源的。

1.分析

    静态图片的格式一般的我们允许 png,bmp,jpeg虽然gif也可以是静态的但是我把它统一放到动态里面了,因为一旦gif是动态的转换之后就不会再动了,会只保留第一帧,我们暂不讨论他的处理。我总是觉得服务器上放那么多格式的图片很蛋疼,我们还要自己区分,所以我就想用户上传图片上来之后 统一全部都转换成jpeg格式的图片。

2.实现

    一般的我们上传图片都是要做对应的处理的,不管是要压缩缩略图还是添加水印等等操作,我们都需要将图片文件转为内存资源处理。

    GD库已经给我们提供了函数 imagecreatefrompng,imagecreatefromjpeg,imagecreatefromgif,imagecreatefromwbmp给函数一个绝对路径就可以将读入图片资源, Continue reading

PHP | wwpeng | | (1) |

[译]鲜为人知的PHP OO模型 “功能(Features)”

原文地址:http://www.sitepoint.com/lesser-known-features-of-phps-oo-model/

(刚开始翻译,其中诸多地方翻译的不是很好,不幸被大神看到请使劲拍~~)

如今大多数的PHP应用都使用面向对象模式开发,而且PHP的开发者对OOP概念都有不错的理解。本文将拓展你的认知,并告诉你一些技巧和潜在的误区。

接口的继承以及 Traits

让我们从熟悉的领域“继承”开始。PHP接口允许我们定义一个约束,任何实现这个接口的对象必须在他自身实现这个接口(中的抽象方法)。但是你知道接口可以继承其他接口并且父或子接口都能被类实现吗?

考虑下面这段代码,定义一个接口,另一个接口继承他,并且用一个类实现这个子接口:

<?php
interface Reversible
{
    function reverse($target);
}
 
interface Recursible extends Reversible
{
    function recurse($target);
}
 
class Tricks implements Recursible
{
    public function recurse($target) {
        // something cool happens here
    }
 
    public function reverse($target) {
        // something backward happens here
    }
}

Continue reading

师夷长技 | wwpeng | | (1) |

[原]Ubuntu Linux 系统备份以及恢复

ubuntu-system-backup

a):备份

该shell脚本 基于bash环境,会将 / /home /boot /usr /var 等目录 打包成压缩包

使用之前 之需要配置好 shell脚本当中的 备份文件的存放目录路径 以及 sudo 命令的用户密码 之后脚本可以全自动执行操作,备份位置最好是media目录中挂在的其他硬盘分区,或者其他存储介质

脚本已经排除了很多不需要备份以及不能备份的目录,这些都不影响,只要打包以上目录,就可以将你的系统整个备份了。

虽然linux系统一般不会产生多少垃圾文件 ,但是ubuntu内核,以及其他自动更新后留下的更新包不会被删除,so…打包备份后会减少不小的文件尺寸。关于ubuntu 的系统清理。大家自行google,很多朋友都在博客中记录了各种清理命令,我就不再复制了~~~

PS:特别注意

该脚本需要 ctrl+alt+F1 切换到命令行模式下执行,因为执行过程中会停止lightdm桌面服务,执行完成后,因为桌面服务已经停止所以不能切换回原桌面

只能 sudo service lightdm start 打开新的服务

Continue reading

Linux/Shell | wwpeng | | (0) |

[译]修复PHP HashTable碰撞DOS 引入新的远程访问漏洞

原文:http://thexploit.com/sec/critical-php-remote-vulnerability-introduced-in-fix-for-php-hashtable-collision-dos/

(初步练习翻译,各种不当求大神指出~)

Stefan Esser (@i0n1c)

一个安全修复引入另外的漏洞

今天, Stefan Esser (@i0n1c) 提交了一个 PHP 5.3.9 (updateassigned CVE-2012-0830) 版本下重要的远程利用漏洞。有趣的是,这个漏洞是为了修复十二月提交的哈希碰撞导致拒绝服务 DOS (CVE-2011-4885) 的漏洞而引入的。

关于漏洞的修复

为了防止哈希碰撞这个修复在 php.ini 配置文件中引入了一个新的参数:
max_input_vars

这个配置参数限制了请求提交的变量的数量(e.g. http://request.com/foo.php?a=1&b=2&c=3)。默认值是1000。

这个修改在文件 php_variables.c 的方法 php_register_variable_ex 中。

通过这个方法,PHP会“注册”所有提交过来的变量。

if (sapi_module.input_filter(PARSE_POST, var, &val, val_len, &new_val_len TSRMLS_CC)) {
    php_register_variable_safe(var, val, new_val_len, array_ptr TSRMLS_CC);
}

Continue reading

师夷长技 | wwpeng | | (0) |