放牧代码和思想
专注自然语言处理、机器学习算法
    Why join the Navy if you can be a pirate?

BAE的Bug——sys_get_temp_dir()实现错误

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的Bug——sys_get_temp_dir()实现错误

分享到:更多 ()

评论 4

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    bae好用吗?能拿来备案?费用如何?

    hua3年前 (2014-09-17)回复
    • 还行,我那时不提供备案服务,一天0.7¥

      hankcs3年前 (2014-09-17)回复
      • Sae好多局限,而且现在我还没有东西可以申请中级开发者 [委屈] 学不则时

        hua3年前 (2014-09-17)回复

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机