面试题:相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
答案:
swfupload
PclZip:压缩解压
gd/imagemagic:图片剪裁
ffmpeg:命令行的图形化视频转换工具
测试php和mysql性能的工具
A、php工具
1)hprof —— facebook 开发的一个测试php性能的扩展。特性如下:
1、 Flat Profile. 提供函数级的汇总信息,比如调用次数、执行时间、内存使用、CPU占用等。
2、 Hierarchical Profile。 对每个程序,进行了父级调用和子级调用的分解。
3、 Diff Reports(差异报告)。有很多种情况,我们希望能够对比,比如新版本比旧版本提升了多少速度,两个版本的差距究竟在哪里
4、 Callgraph View(调用视图)。性能监测的数据可以绘制成调用视图,方便我们查看
5、 Memory Profile(内存监控)。这个特性帮助我们了解PHP如何分配和释放内存
6、 如何处理外部文件。XHProf将 include,require,include_once,require_once进来的文件视作是一个 function。
2)XDEBUG 和WinCacheGrind:前者生成文件,后者负责解析。
B、mysql工具
用sysbench(或者super-smack)测试mysql性能。使测试获得好得数据,这其实非常简单:1 最大化CPU利用率 2 减少由于IO造成的延迟
如何提取一个网页的所有链接?
正则1:<a[\s\S]*?href=( "(? <href> [^ "]*) "| '(? <href> [^ ']*) '|(? <href> [^> \s]*))[^> ]*?> (? <title> [\s\S]*?) </a>
上面可以提取新浪的全部链接还有标题,比较牛!,下面有个其他网友做的简单的,可能有错:
正则2:/<a\s+href=["|\']?([^>"\' ]+)["|\']?\s*[^>]*>([^>]+)<\/a>/i
例如:
<?PHP
$file = file_get_contents(“http://www.rocsky.net”);
preg_match_all('/<a\s+href=["|\']?([^>"\' ]+)["|\']?\s*[^>]*>([^>]+)<\/a>/i', $file, $links);
print_r($links);
exit; ?>
如何防止同一个用户同时登陆?如果我用aa登陆,别人就不能用了
要防止同一用户同时登陆,首页应该记录在线用户的信息(这里与用户名为例),然后判断正在登陆的用户里面是否已存在。在这里使用一个cache存放已经登陆的用户名,但是还有一个问题就是要知道用户是什么时候离开系统的呢?这就要定期清除cache中的内容了,也就是设置一个cache的时间。这个时间可以跟用户的session值联系起来,刚好当用户session值失效的时候该用户在cache里面的信息也会被清空.这样就达到了防止同时登陆的效果,具体代码如下:
放在登陆成功的地方:
string key = TextBox1.Text; //用户名文本框设为cache关键字
string uer = Convert.ToString(Cache[key]); //读取cache中用户相应的值
//判断cache中是否有用户的信息,如果没有相关的值,说明用户未登陆
if (uer == null || uer == String.Empty)
{
//定义cache过期时间
TimeSpan SessTimeout = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//第一次登陆的时候插入一个用户相关的cache值,
HttpContext.Current.Cache.Insert(key, key, null, DateTime.MaxValue, SessTimeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
Session["ADMINID"] = TextBox1.Text;
Response.Redirect("main.aspx");
}
else
{ //重复登陆
Response.Write("<script>alert('您的账号已经登陆!');window.location='login.aspx';</script>");
}
单点登陆SSO
很详细,慢慢看http://www.iteye.com/topic/1039052
垃圾什么时候回收?
php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器+1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。
“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;
上面是有问题,js也没有这么做!js用的是?(忘了,哭)
php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露
1)垃圾回收的时机
Php中,引用计数为0,则内存立刻释放;也就是说,不存在环状引用的变量,离开变量的作用域,内存被立刻释放。
环状引用检测则是在满足一定条件下触发,所以在上面的例子中,会看到使用的内存有大幅度的波动;也可以通过 gc_collect_cycles 函数来主动进行环状引用检测。
2) &符号的影响
显式引用一个变量,会增加该内存的引用计数:
$a = "something";
$b = &$a;
此时unset($a), 但是仍有$b指向该内存区域的引用,内存不会释放。
3)unset函数的影响
unset只是断开一个变量到一块内存区域的连接,同时将该内存区域的引用计数-1;在上面的例子中,循环体内部,$a=new A(); unset($a);并不会将$a的引用计数减到零;
4)= null 操作的影响;
$a = null 影响与unset($a)类似;
5)脚本执行结束的影响
脚本执行结束,该脚本中使用的所有内存都会被释放,不论是否有引用环。
问:列出你知道的php中得函数那些是直接作用于变量本身?
str_replace() 函数将返回修改过的字符串,
而 usort() 却直接作用于传递的参数变量本身
其实因为数组传递的是引用,我自己的感觉
这些是函数吗?echo(),print(),unset(),isset(),empty(),include(),require()
上面都是语言结构!
If else都是语言结构,这些是在词法,语法解析中解释,详细看编译原理。
类和非面向对象中,如何定义常量?
class MyClass
{
const constant = 'constant value';
}
define(“constant”, “constant value”)
面向对象的魔术方法
__construct, __destruct, __call, __get, __set, __isset, __unset (see Overloading), __sleep, __wakeup, __toString, __set_state and __clone