关于动态语言的问题

梦中醒不过来 发布于 2015年07月19日 | 更新于 2015年07月25日
无人欣赏。 1人反对。

起因是这样,我想把网站做成游戏系统,最近刚把引擎换好。这套开源系统功能已经很丰富了,有微博、论坛、积分商城、群组神马的,但是没有最核心的任务系统。

我知道一般C语言会配合lua来实现动态语言的效果,之前写Java版核心时也考虑过用Groovy来处理,可是现在的核心是php,这语言我还不熟,就有点蒙了。是引入第三方脚本语言,还是用php本身可以实现?如果本身可以实现,是否是生成代码文件的形式?

下面还有个加分问题,一般游戏中的任务系统类型还是比较简单,如果让这段动态语言可以判断到例如

1 签到

2 发图片微博

3 获得赞

4 通过程序接口上传第三方数据

那么上面分析的动态语言是否可行。如果很容易满足此目标,那么是否有图形化编程方案,降低难度,让这段内容可以成为用户贡献的一部分。


我错了,不要杀我

共4条回复
tinyfool 回复于 2015年07月19日

删个蛋,找到了,就说出来告诉别人……论坛只是你索取的地方么?

梦中醒不过来 回复于 2015年07月21日

1楼 @tinyfool 既然泰哥发话了,我还是把本贴变成长贴做完它吧,后续的更新将写在评论里,用于区分各个阶段产生的理解差异。

梦中醒不过来 回复于 2015年07月21日

首先回答我找到的内容是什么:

call_user_func

这个函数同call_user_func_array 一样构成了php的动态调用函数。

我在找到这个答案以前以为会像Java执行Groovy这种模式去调用,在得到这个答案并对比了项目中的代码后发现不是这种结构的。而更像是Java中的反射来实现的。先引用一段代码:

WWW\osv2\ThinkPHP\Mode\Api\functions.php:

200 $result[$key] = is_array($val)

201 ? array_map_recursive($filter, $val)

202 : call_user_func($filter, $val);

203 }

204 return $result;

...

471 parse_str($vars,$vars);

472 }

473: return call_user_func_array(array(&$class,$action.C('ACTION_SUFFIX')),$vars);

474 }else{

475 return false;

以上代码来自于Opensns, 感兴趣的童鞋可以在这里下载 http://git.oschina.net/yhtt2020/OpenSNS-V2

找到程序调用的环节后,我又查看了数据库存入的内容:

'a:1:{i:0;a:5:{s:5:"table";s:6:"member";s:5:"field";s:1:"1";s:4:"rule";s:2:"10";s:5:"cycle";s:2:"24";s:3:"max";s:1:"1";}}'

该端内容描述的意思是在后缀为member的表中,每24小时登录可以积累10分,最多积累1次。

我还没来得及看这段伪代码是如何解析为程序能够识别的方法的,因为这段数据能够描述的情况相对比较固定。而我要实现的任务功能,它的灵活性要达到能够判断服务端的任何一种相应。举几个例子:

任务1:微笑的日常(每天上传一张微笑的图片) 程序的要求要至少能够判断,用户在此任务下,上传了一张图片。

任务2:永不停歇的脚步(每天步行10000步,通过第三方运动app获得当天的运动数据)

任务3:闪客(回复中贴一段视频,并获得10个以上的赞)


有关call_user_func的具体用法,暂时还无法分享。找到此方法的时候我就发现这似乎是一个小白问题,接触PHP时间短,迅速跳到应用开发的环节多少有些吃力。不过任务模块会是趣儿岛最核心的模块,相信以后的二次开发中会时常使用这个功能,有任何新的体会,我再回来继续更新。也欢迎php开发者赐我建(yi)议(si)。

趣儿岛网站 www.qurdao.com 公测了,欢迎访问

您的砖头是我成长的动力,在此多谢了

梦中醒不过来 回复于 2015年07月25日

大周末开始升级OS系统,因为之前在windows上测试过,更新的内容都是我没改过的,文件和数据库都可以直升。 本地测试时也未表现出任何问题,因此信心满满的准备升级生产环境了。

结果,悲剧了...

-> 先是自动升级失败了,提示的对比列表,基本上所有的文件都是权限不足。我看涉及的文件夹太多了,全部给777太危险,不如一个一个加吧。加了几个以后,后台无法访问了,我去~~~ 好在都记录了,马上还原权限,又救回来了。

-> 既然这样就手动上传吧,从服务器down下来升级压缩包以后上传到服务器,手动解压。然后就无脑点下一步呗。点完发现版本号没有升级,而程序和数据都升上去了。搞什么飞机?

-> 上google搜什么问题,没答案,上Q群问,都放假了,自己动手吧。试了几种方案:

  1. 清空服务器缓存--没戏
  2. 查看version数据库,发现当前版本标志位没用
  3. 搜代码发现有个version.ini,直接改没用。本机重启apache,奏效了。于是重启服务器apache,没用;重启mysql,没用;重启整个服务器,没用。摔~~~
  4. 看来还得研究代码,于是远程开vi挨个echo测试,搞了半天,发现一个读取version.ini的方法返回的version不正常。先是为空,感觉是权限的问题,退出加权限,回来再看可以读到了。但读到的结果多了一个换行,期间还在服务器上手动重建过version.ini,结果还是木有成功。
  5. 于是加了个trim,又写了个写当前version的方法,终于把版本号升到最新。

总之大半天的升级之旅算是结束了

登录 或者 注册
相关帖子