如何在 SAE 下操作本地IO

飘逸的风13年前 (2012-12-01)程序8605
因为SAE平台安全性的考虑,限制了用户对于本地IO的使用,但这样对于一些传统的PHP项目,也许带来了很多不便,因为它们都或多或少的有对本地IO的操作,像Smarty的编译模板和文件上传程序。为了解决这个问题,SAE提供了TmpFS功能。TmpFS允许开发者通过标准的IO函数临时读写本地IO,这样方便了很多非SAE项目的移植。

特别注意:

临时文件的生存周期等同于PHP请求,也就是当该PHP请求完成执行时,所有写入TmpFS的临时文件都会被销毁
TmpFS是本地临时文件,不是共享存储,而SAE是全分布式环境,所以不同请求之间无法通过TmpFS共享操作文件
TmpFS操作的文件限于SAE_TMP_PATH目录内,而不同App的SAE_TMP_PATH是不同的
TmpFS的文件为纯内存存储

应用场景

用户的可持久化存储,请使用Storage或者MySQL存储,而缓存存储请使用Memcache服务存储,TmpFS是满足用户的一个请求的临时文件的读写需求。比如抓取一个URL的图片,判断一下大小,再决定是否写入Storage。需要在本地生成文件的情况大致分以下几种:

缓存
配置文件
静态文件
临时文件

例子:
appname: saetest
appversion: 1
在一个php文件中:

file_put_contents( SAE_TMP_PATH . '/mycode.txt' , 'dummy test' );
echo file_get_contents( SAE_TMP_PATH . '/mycode.txt' ); // will echo dummy test;
如果是两个独立的php文件:

a.php
file_put_contents( SAE_TMP_PATH . '/mycode.txt' , 'dummy test' );
b.php
echo file_get_contents( SAE_TMP_PATH . '/mycode.txt' ); // 出错啦,文件已经不存在了...
说到这里,大家应该明白,用它做缓存不但不会带来性能提升,反而会带来额外的开销。

如果使用PHP输入流 php://input 来保存文件(比如xheditor编辑器则使用输入流来保存临时文件),则有以下使用方法:
if(isset($_SERVER['HTTP_CONTENT_DISPOSITION'])&&preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i',$_SERVER['HTTP_CONTENT_DISPOSITION'],$info)) {
    $filename = date("YmdHis");
    $localname=urldecode($info[2]);
    $fileInfo=pathinfo($localname);
    $extension=$fileInfo['extension']; // 获取扩展名
    $tempfilename=SAE_TMP_PATH.'/'.$filename.'.tmp'; // 存放在TmpFS中临时文件
    // 把读取的数据写入到临时文件中
    file_put_contents($tempfilename,file_get_contents("php://input"));
    
    $bytes=filesize($tempfilename); // 获取临时文件大小,可以进行大小检测
    
    // 写入到Storage中
    file_put_contents('saestor://upload/'.$filename.'.'.$extension,file_get_contents($tempfilename));
    $targetpath="/upload/".$filename.'.'.$extension;
    echo $targetpath;
}


相关文章

二十一个实用便利的PHP代码摘录

1. PHP可阅读随机字符串 此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。 /************** *@length - length of rand...

MemCache安装使用

Windows下的Memcache安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也即cmd命令界面)下输入 ‘c:\me...

ecshop搜索热门关键字的调用

码关键字的设定在:后台-商店设置-显示设置--首页搜索的关键词 {if $searchkeywords} {$lang.hot_search} :  {foreach from...

PHP5+引进$GLOBALS延迟初始化概念

今天在使用$GLOBALS['_SERVER']来替代$_SERVER来访问相关的环境变量,总是会报“_SERVER undefined”错误。如下用例:    用例1: &n...

龙圆 php 判断是否为搜索引擎蜘蛛函数 转载

/**  *    判断是否为搜索引擎蜘蛛  *  *    @author&nbs...

PHP无限级分类的简单实现方法

PHP无限级分类的简单实现方法

PHP无限级分类的简单实现方法,请看截图:   代码是:  <?php  header("Content-type: text/html;&n...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。