以前搞过一段时间的asp,觉得application这个对象很爽。。可以很容易的写一个聊天室。。。后来逐渐转到php,就一直为这事郁闷。。因为php里面没有对应的东西。数据只能往数据库或者文件里面写才能实现共享。 今天在公司做聊天室的时候,灵机一动,居然让我发现了一神奇的方法~~哈哈:
PHP里面的$_SESSION变量可以实现类似Application的功能,但重点在它不能跨浏览器进程,或者说是跨用户。。只能是单个用户操作不同页面时候的变量传递,是一种cookie的替代方案。
众所周知,php里,调用session_start()之后,客户浏览器会收到一个大概名叫PHPSESSID的cookie,这个叫session_id。不同页面的参数共享就是靠这个变量实现的。
有时,由于客户端浏览器或者其他什么神奇的原因,导致无法正常发送 PHPSESSID的时候,我们可以手动发送,然后在php里面的session_start();之前,调用session_id("sessionid在这里");手工指定session_id ,这样,就可以让session工作正常。(比如浏览器不支持cookie,或用flash上传文件的时候)
好了,关键的东西来了。如果我们让每个用户的session_id都一样会怎么样? 哈哈。ASP的Application功能便呼之欲出~~~
实现方法非常简单: 在每个php页面的前面都写上下面的代码: session_id("xxxx"); session_start(); 然后,你就可以像用Application对象那样来使用$_SESSION了。。~~哈哈哈哈~~~爽吧~~
PS:ASP的Application对象是存储在内存里面的,而PHP的SESSION一般默认是用文件来存的。不过也可以设置php.ini让php用mysql数据库存,甚至用memcached来存~~具体方法就不详述了。。 chy提到session本来的作用是保存用户的登录信息等,是非常有用的。我这样一弄,session就失去了它原有的功能。所以我搞了一个函数,可以实现全局session和局部session共存。互不干扰。
/*
用法:
application('key','value'); //设置 key=value
$value = application('key'); //获取 key的值
*/
function application()
{
$args = func_get_args(); //获取输入参数
if (count($args) >2 || count($args) < 1) return;
$ssid = session_id(); //保存当前session_id
session_write_close(); //结束当前session
ob_start(); //禁止全局session发送header
session_id("xxx"); //注册全局session_id
session_start(); //开启全局session
$key = $args[0];
if (count($args) == 2) //如果有第二个参数,那么表示写入全局session
{
$re = ($_SESSION[$key] = $args[1]);
}
else // 如果只有一个参数,那么返回该参数对应的value
{
$re = $_SESSION[$key];
}
session_write_close(); //结束全局session
session_id($ssid); //重新注册上面被中断的非全局session
session_start(); //重新开启
ob_end_clean(); //抛弃刚刚由于session_start产生的一些header输出
return $re;
}
当然,这样操作的成本有点高。。不过在实际使用中,基本不会遇到使用全局session和局部session的频率都很高的情况。所以可以按需求封装局部session或者是全局session。 上面那个函数封装的是全局session,稍微修改就可以实现局部session。
完。
早就听说Adobe Air可以用HTML+Javascript的方式来开发,但是直到前不就才开始研究学习。做了几个air的小程序,其中遇到了很多困难。Air的资料网上比较少。所以遇到问题有时候真不知道怎么办。 其中一个问题是弹出提示窗口(屏幕右下角或者右上角那种提示性的临时窗口),不知道怎么调整大小和位置。找了好多资料,后来终于明白了。弹出窗口的代码如下:
var options = new air.NativeWindowInitOptions();
options.systemChrome = "none"; //取消系统窗口外框
options.type = "lightweight"; //轻量级窗口
options.transparent = true; //允许透明
var bounds = new air.Rectangle(100,200,100,100);
var newHTMLLoader = air.HTMLLoader.createRootWindow(true, options, true, bounds);
newHTMLLoader.load(new air.URLRequest("notify.html"));
newHTMLLoader.stage.nativeWindow.alwaysInFront = true; //窗口始终置顶
上面这段代码会在屏幕的左上方(x:100,y:200)创建一个宽高都是100px的HTML窗口,内容是notify.html。 其中,newHTMLLoader.window 可以访问到新建的窗口。可以预先定义一些函数,供窗口加载完后调用。比如:
newHTMLLoader.window.on_load = function()
{
alert('loaded!');
}
然后在notify.html页面里面写上 window.onload = on_load; 就可以了。 而控制窗口宽高、位置的对象是newHTMLLoader.stage.nativeWindow 。可以通过设置这个对象的 x,y,width,height(而不是我们通常认为的left,top,width,height)属性来改变窗口的长宽和位置。 在nofity.html里对应的对象是window.nativeWindow。 nativeWindow貌似是ActionScript里面的比较常用的东西。不过对我们这种没有研究过AS的人来说,不容易想到控制位置是用x和y,而不是left和top。。。。。。 下面说下开发AIR程序比开发WEB程序爽的地方:
- 在应用程序沙箱中的代码可以任意跨域访问!而且更爽的是AIR会自动保存和处理Cookie,也就是说我可以用AJAX来模拟登录,之后可以直接用AJAX取登录后才能取得的内容而不用担心Cookie!真是太神奇了!
- AIR采用Webkit引擎,不用担心跨操作系统的兼容性。最多是字体显示稍微不同而已。而且可以使用大部分的JS框架,比如JQuery!
- AIR支持部分CSS3! 其中比较爽的是可以很容易的实现圆角效果,颜色可以使用RGBA(第四个参数是透明度)。好处是我们可以很容易的制作一个背景半透明,但是内容不透明的圆角提示窗口~~(例如:-webkit-border-radius:5px; background-color:rgba(20%,20%,20%,0.8); )
- 支持JS进行文件读取等本地操作,支持本地SQL等。。
完。
最近对Adobe 的Air技术非常感兴趣。 有了这种技术,我们以后就能很轻易的把B/S程序扩展到桌面,成为C/S程序!
下面是我的第一个AIR应用程序:空气域名查询。 “空气”二字源于 Air。 主要功能是快速查询某个域名是否被注册。
输入一串字符串,选中下面的后缀,程序会自动查询对应的域名。 当然你也可以自定义查询任意后缀,如果想这样,只需要输入完整的域名即可(当然,不包含www)。比如:当我输入longbill,并选中com,和net。那么程序会自动查询longbill.com和longbill.net。如果我输入longbill.la,那么程序只会查询longbill.la。
下面是截图:

此外,我还在尝试做一些附加功能,比如whois查询和域名收藏(方便以后从收藏的域名中找出最好的)。现在只实现了在新窗口种查询whois,实现方式也很机械:调用http://who.is/longbill.cn的网页内容。
如果你对此程序感兴趣,可以点击这里下载。 不过,前提是你的电脑上有Adobe Air 运行环境。如果没有,你可以去这里安装。
完。
过年的时候买的魅族M8 。玩了2个月,觉得不稳定,信号不好,经常漏电话。然后一次偶然机会入手Nokia E71。这可是我第一次买诺基亚的手机哦。。水货,带wifi ,gps, wcdma。
那时候联通3G正在商用,本来打算申请一个号试试的。结果哪知道联通把价格定那么高。最次的套餐都是93元/月。。。。就算了。。只有等了!
不过E71真的挺不错的。主要是稳定,操作流畅,软件多。
暑假完了,开学,电信的天翼进校园。那资费,看着就爽啊,大概是:19元月租(包40分市话,30M流量,300条短信),然后在学校里面打市话是0.08元每分。 如果寝室是包月上网,每月还要返一半的网费成话费。。。。天哪。跟联通比,简直太划算了。。于是,果断卖掉E71,在淘宝入手一台HKC mythos(神话)。刚好2K。 配置超高,wifi gps evdo一应俱全。。
于是,哥们终于在经过了数年的漫长等待后用上了日思夜想的速度超快资费便宜信号超好的3G网络。
晕,怎么觉得自己在给电信打广告。。不过我觉得电信天翼真的不错,覆盖很广。 不过可能是因为3G网络才建好,客服方面经常出问题。 有时查不到话费。。。。
完。
Taylor Swift 和 Coldplay 都是我非常崇拜的歌手和乐队。都是可以堪称天才的人物。Taylor的Love Story我尤其喜欢,那种Country + pop的风格感觉很爽,外加Taylor的美丽的声音和外表~ 。。。Coldplay 就不说了,如果你不知道他们,那我也无话可说。。 昨天在校内上看到有人分享钢琴家Jon Schmidt与大提琴家Steven Sharp Nelson改编的一首曲子,融合了Taylor Swift 的Love Story 和 Coldplay 的 Viva la vida,听了之后非常有感觉,于是贴出来分享一下。
再贴出出处1:Taylor Swift Love Story
$filename = "下载文件名";
$filesize = filesize('文件地址'); //获得文件大小
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: pre-check=0, post-check=0, max-age=0');
header('Content-Transfer-Encoding: binary');
header('Content-Encoding: none');
header('Content-type: application/force-download');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-length: '.$filesize);
然后再用readfile把文件内容输出给浏览器。但是会遇到一个很烦的问题:弹出文件下载框时,显示的文件名在不同的浏览器下面是不一样的。有的是乱码,有的是空白。 为了解决这个问题,我找了查了很多资料。最终找到一个好的解决办法:
文件名统一使用utf-8编码,然后针对ie浏览器进行一次rawurlencode编码。
比如:
if (preg_match('/MSIE/',$_SERVER['HTTP_USER_AGENT'])) $filename = rawurlencode($filename);
这样在不同操作系统,不同浏览器里面,下载文件的时候,中文文件名都能正确显示了。
测试通过:Safari4(MAC) ,Firefox3.5(MAC), Firefox3(Win), IE7/8(Win), Chrome(Win)完。