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

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

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

代码如下:

 <?php
$file=SAE_TMP_PATH."/test.txt";
if(!file_exists($file)){
file_put_contents($file,1);
echo 1;
}else{
$n=file_get_contents($file);
$n++;
echo $n;
file_put_contents($file,$n); } ?>

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

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

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

  KVDB -- saekv://

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

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

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

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

 <?php
$file="saekv://count.txt";
if(!file_exists($file)){
file_put_contents($file,1);
echo 1;
}else{ $n=file_get_contents($file);
echo $n;
$n++;
file_put_contents($file,$n); }

这样就可以了。

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

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

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

代码:

 $file="saekv://count.txt";
$kv=new SaeKV();
$kv->init();
if($kv->delete("count.txt")){
echo "ok";
}else{
echo "no";
}

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

参考文档:SAE平台文档

SAE平台的文件I/O处理的更多相关文章

  1. kindeditor在sae上传文件修改,适合php

    kindeditor在sae上传文件修改,适合php 当前位置: 首页  > 论坛  > 经验共享 用户登录   新用户注册   主题: kindeditor在sae上传文件修改,适合ph ...

  2. SAE上传文件到storage

    还有什么比代码更清晰的讲解 html代码: 一定需要下面这个: method="post" enctype="multipart/form-data" < ...

  3. Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区

    Kindeditor+web.py+SAE Storage 实现文件上传 - 开源中国社区 Kindeditor+web.py+SAE Storage 实现文件上传

  4. Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET

    Ueditor文本编辑器(新浪SAE平台版本) - 下载频道 - CSDN.NET Ueditor文本编辑器(新浪SAE平台版本)

  5. 如果想要跨平台,在file类下有separtor(),返回锁出平台的文件分隔符

    对于命令:File f2=new file(“d:\\abc\\789\\1.txt”) 这个命令不具备跨平台性,因为不同的OS的文件系统很不相同. 如果想要跨平台,在file类下有separtor( ...

  6. ETL应用:一种一次获取一个平台接口文件的方法

    ETL应用场景中,若对端接口文件未能提供,任务会处于循环等待,直到对端提供为止,该方法极大的消耗了系统资源.为此想到了一种方法,一次获取一个平台的文件,实现思路如下: 1.第一次获取对端平台提供目录下 ...

  7. Cocos2d-x 3.0 打造一个全平台概念文件夹

    Cocos2d-x 3.0 打造一个全平台概念文件夹http:// www.eoeandroid.com/thread-328055-1-1.html

  8. 使用Dreamwaver cc中的SVN功能,用于传输BAE和SAE中的文件

    前沿: 假期使用BAE和SAE开发应用,两个服务器都需要通过SVN提交代码,因为平时大多使用Dreamwaver,所以查了查资料,通过Subversion方便了开发. 因为网上的资料都不全,所以根据自 ...

  9. 基于新浪SAE平台的微信开发

      自己的微信公众平台开发差不多了,欢迎关注试用哦,我会不定期在那里分享技术文章! 主要功能: 输入t+中文或者英文返回对应的英中翻译 输入[m]随机来首音乐听,建议在wifi下听 输入[ly+你的留 ...

随机推荐

  1. Celery 使用简介

    转自:http://liuzxc.github.io/blog/celery/ Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列, 同时也支持任务调度 ...

  2. Mongdb操作嵌套文档

    1.一个文档如下 db.posts.find() { "_id" : ObjectId("5388162dfc164ee1f39be37f"), "t ...

  3. JAVA集合学习

    JAVA中有几种常用的集合类.分别是List,Set,Map等 提示:Eclipse中自动导入包的快捷键  Ctrl+Shift+O 一.List类 父接口:该类是Collection集合接口的子接口 ...

  4. VC 获 取 当前程序运行路径的几种方法

    1.使用APi函数GetModuleFileName char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH);        //获取 ...

  5. Android开发-API指南-AIDL

    Android Interface Definition Language (AIDL) 英文原文:http://developer.android.com/guide/components/aidl ...

  6. Swift一些语法

    1.函数权限 public : 最大权限, 可以在当前framework和其他framework中访问internal : 默认的权限, 可以在当前framework中随意访问private : 私有 ...

  7. MSP430F149学习之路——AD

    代码一:Timer_A触发转换 #include <msp430x14x.h> void main() { WDTCTL = WDTPW + WDTHOLD; P6SEL |= BIT0; ...

  8. 数据结构(一)之HelloWord

    最近由于学习上面的需要,要重新的看看数据结构方面的知识!当然,我觉得数据结构也非常的重要,下面是我的学习的一点小小的记录,以备日后的查看! 我的环境: 1:操作系统:windows7 2:编码环境:M ...

  9. 洛谷P2737 [USACO4.1]麦香牛块Beef McNuggets

    P2737 [USACO4.1]麦香牛块Beef McNuggets 13通过 21提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描 ...

  10. 使用Code First 创建数据库

    这是一个控制台程序,作用是通过Code First创建数据库. 1.添加EntityFrameWork的引用. 2.添加类 CodeFirstTest1.cs using System; using ...