ajax php 源码,Sajax源码研究(PHP版)

它有很多脚本语言实现,包括php,python,ruby,lua等,本文只说Sajax.php的实现。

以一个典型的更新部分web元素为例说明一下sajax是如何实现的。

1,Ajax Request

browser首先发起ajax request,在sajax里是调用已注册的x_FUNC函数,它实际上是转调的sajax_do_call("FUNC", ...),里面是通过XMLHttpRequest对象发起的GET或者POST请求,从代码里可以看出,这两种请求的区别,只在于GET方法的参数是和uri一起的,以?隔开,而POST方法的参数是放在POST数据里的。

这个XMLHttpRequest对象是放在一个数组里的,它有一个回调函数onreadystatechange很重要,在定义它的时候,生成了一个闭包函数(javascript没学过,在其它脚本语言里是这个概念),它里面有关于这次请求的相关upvalue,target_id,args等,其中args里有之前写在x_FUNC中的用户回调函数。最后调用send完成browser请求。

2,PHP Respond

PHP代码和接受到一般的GET方法或POST方法请求是一样的,关键的地方在于,如果发现是一个ajax request,那么不要生成‘太多内容’即可。怎么区别是否是ajax request呢?通过GET方法或者POST方法的参数格式,从前面的代码可以看出,格式是这样的 rs=函数名,rst=target_id,rsargs[]=参数列表,还有一个rsrnd=时间值,Sajax.php的代码在sajax_handle_client_request()里,只要看$GET["rs"]或$POST["rs"]是否存在即可。

发现是一个ajax request,然后就取出函数名,参数,不在话下,然后调用call_user_func_array($func_name, $args),它能以一个字符串的形式调用一个用户函数,然后把结果$result翻译成javascript中的eval()函数能求值的表达式,当然完整的样子是这样的:

-:错误信息 或者+:正确的javascript表达式,如果一切正常的话,从第3个字节开始是一个javascript表达式。从php的结果翻译成javascript表达式,归功于sajax_get_js_repr()函数,从代码看出,它处理了的类型有boolean,integer,double,array和object,噢,全了,对array的处理进行了递归调用,完美的处理。

值得一提的是,当这些完成的时候,php调用了一个exit;,它终止了后面代码的输出,至此一次ajax respond完成,Web2.0技术为什么能提高Web服务器的性能,就在这里啊,刷新页面部分元素,服务端也仅仅产生了这部分的输出。

3,sajax的不足之处

Sajax实现得非常漂亮,它用一份代码完成了javascript和php的异步通信,最终使用形式非常简洁。我本人用的时候,只有一点不爽,做ajax request的时候,不能指定uri,uri是在php上写死的$_SERVER["REQUEST_URI"],当然如果可以指定其它的uri,那就不能融合在一份代码里,因为很多javascript代码是通过php的函数sajax_show_javascript()生成的,如果要拆开的话,只怕php和js代码也要拆开,作者设计时还是有考虑的。我更喜欢拆开成Sajax.php和Sajax.js,这样能从一个html文件发起ajax request。些外,上面有提过target_id怎么用呢,如果php被调函数的返回是一个html串,而且你想把这个串更新到一个html元素中去,像这样:

document.getElementById(target_id).innerHTML = result;

那么,可以不写回调处理函数,而直接指定js变量sajax_target_id,即:

sajax_target_id = "some id";

x_FUNC(...);

这样调用。

当然这样做不太好,代码本身没有问题,发起多次调用也没有问题,sajax_target_id会记在多个闭包回调函数中去,只是这样做不好,目标php函数是能返回任何值的,不一定是html,它可以是一个table,从php到js,没有问题,这样数据在传输时没有作任何表现,它只是数据原本的样子,比如那个函数的结果是一个数据库的查询结果,如果数据结构比较大,你就会在php代码中写如何组成一个html表格,用什么样式,而这些只是这个数据的表现,它不应该存在于服务端代码中,所以尽量使用table数据加js回调函数中解开成html处理吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值