BAE2.0不支持本地读写,但是提供了一个PHP的库函数sys_get_temp_dir()来获取一个临时文件夹,这个文件夹可供临时读写。但是我发现在绑定域名之后,这个函数并没有达到“返回一个可读可写的路径”之目的。此时上传文件会触发UPLOAD_ERR_NO_TMP_DIR错误。
下面我将讲解问题的始末,官方文档说
单次请求的临时数据所需的临时目录可正常使用,数据可写到sys_get_temp_dir()返回的目录中,确保单次请求内数据正常。
这是一厢情愿罢了,BAE上面对这个函数的实现很简陋,开发者假如使用abc.duapp.com的初始域名访问app的话,sys_get_temp_dir()会返回一个 /tmp/abc.duapp.com路径,此时 /tmp/abc.duapp.com是可读可写的,完全没问题。但是如果开发者使用www.hankcs.com这样的绑定域名访问的时候,你猜sys_get_temp_dir()会返回什么路径?没错!简单地返回了/tmp/www.hankcs.com,这不是最糟糕的,最糟糕的的是,sys_get_temp_dir()返回的/tmp/www.hankcs.com是既不可读也不可写的一个不存在的路径!后果是你的临时目录处理逻辑异常终止,整个app异常终止!难道这不能称作一个设计失误吗?而且,就算你手动指定一个/tmp/abc.duapp.com,用www.hankcs.com这个自有域名访问app,它依然无法读写/tmp/abc.duapp.com。最终的结果就是,自有域名访问的app根本没有任何可读可写的临时目录!文档里说临时文件夹在单次请求里有效,看来路径的名称与请求的url有关,也许BAE根本就没有为自有域名创建临时文件夹,导致自有域名app无法运行。
下面我给出触发的一段代码:
$temp_dir = sys_get_temp_dir(); echo "the temp dir is ".sys_get_temp_dir() . '<br>'; if(file_put_contents($temp_dir . "/". "test.txt", "hello")) { echo "write " . $temp_dir . "/". "test.txt". " OK<br>"; } else { echo "write " . $temp_dir . "/". "test.txt". " Failed<br>"; }
在绑定自有域名www.hankcs.com 的情况下输出:
the temp dir is /tmp/www.hankcs.com write /tmp/www.hankcs.com/test.txt Failed
bae好用吗?能拿来备案?费用如何?
还行,我那时不提供备案服务,一天0.7¥
Sae好多局限,而且现在我还没有东西可以申请中级开发者 学不则时