SAE平台的文件I/O处理

      用过SAE平台的朋友应该知道,出于平台安全性的考虑,SAE限制了用户对于本地IO的使用。但这样对于一些传统的PHP项目,也许带来了很多不便,因为它们都或多或少的有对本地IO的操作,像Smarty的编译模板。为了解决这个问题,SAE提供了TmpFS功能。TmpFS允许开发者通过标准的IO函数临时读写本地IO,这样方便了很多非SAE项目的移植。

        但是TmpFS是不够的,从名称来看是临时文件系统,它的生命周期同于PHP请求,也就是当该PHP请求完成执行时,所有写入TmpFS的临时文件都会被销毁。TmpFS是本地临时文件,不是共享存储,而SAE是全分布式环境,所以不同请求之间无法通过TmpFS共享操作文件,具体可参照SAE平台文档说明。

 示例:比如我想用TmpFS做个计数器(当然也可以用SAE提供的counter服务)

代码如下:

 1 <?php
 2 $file=SAE_TMP_PATH."/test.txt";
 3 if(!file_exists($file)){
 4     file_put_contents($file,1);
 5     echo 1;
 6 }else{
 7     $n=file_get_contents($file);
 8     $n++;
 9     echo $n;
10     file_put_contents($file,$n);
11 
12 }
13 
14 
15 ?>

发现根本进不了else里执行,因为临时文件系统随着每一次的执行结束就已经不存在了,所以每次代码开始时判断(又是一个新的php请求了),那个临时文件是不存在了.

就是说零时文件不能共享与两个文件或者一个文件的不同时间请求之间。

    其实细读SAE文档,不难发现SAE提供的Wrappers里

  KVDB -- saekv://

     saekv://用来读写KVDB 主要用来保存持久存储的数据,最常用的场景是保存配置文件

这项可以满足我们对持久保存文件的创建修改要求

在使用这项服务前必须先开启KVDB服务才行。

下面是计数器的测试代码:

 1 <?php
 2 $file="saekv://count.txt";
 3 if(!file_exists($file)){
 4 file_put_contents($file,1);
 5     echo 1;
 6 }else{
 7     
 8 $n=file_get_contents($file);
 9     echo $n;
10     $n++;
11     file_put_contents($file,$n);
12     
13     
14 }

这样就可以了。

同时删除文件也有两种方式

一种就是php的原生删除方式unlink($file)就行

还有一种就是通过SAE提供的kvdb数据库删除方式:

代码:

1 $file="saekv://count.txt";
2 $kv=new SaeKV();
3 $kv->init();
4 if($kv->delete("count.txt")){
5 echo "ok";
6 }else{
7 echo "no";
8 }

详情参见KVDB服务文档 ,count.txt是键值...

参考文档:SAE平台文档

 

 

posted @ 2013-07-10 17:38  H&K  阅读(1799)  评论(0编辑  收藏  举报