如何在 SAE 下操作本地IO

飘逸的风14年前 (2012-12-01)程序8851
因为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;
}


相关文章

7个非常适合初学者使用的实用PHP方法

你有没有查看过全部PHP的方法,我大概统计了一下,在PHP参考中一共有5025个。如果你初学这种web编程语言,那么我将介绍几个非常实用的PHP方法,希望能够对你有帮助! Function1...

preg_replace 修饰符

  PatternModifiers-规则表达式的修饰符      下面是当前规则表达式里可用的修饰.括号内的名字是那些修饰符的内部PCRE名字.      i(PCRE_CASELESS)...

PHP常用正则表达式汇总

1.    平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2.    &quo...

文章内链的实现方法

在很多的时候,我在浏览其他的网站发现文章中一写关键词都被加上了链接链向对应的页面,我就在想他们是怎么实现这个功能的?为什么这么做,这么做有什么好处?   当然有什么好处一看便知,无论是从...

PHP清理标签属性

// code from https://www.aslibra.com/ // by hqlulu // replace <img (any code) src="(pic url)"&g...

38条PHP编码优化加速技巧[转]

1. 尽量采用大量的PHP内置函数。 2. echo 比 print 快。 3. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码? 4. 在执行for循环之前确...

发表评论

访客

看不清,换一张

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