PHP常见问题

更新时间:2015/09/18 访问次数:15018

app.yaml 配置不生效 

1、app.yaml 放在根路径下, 不是放在 webroot 下 
2、配置书写严格按照 YAML标准 , 比如 wordpress 应用: (复制代码后注意格式对齐, 否则会启动失败) 

tryuri:
    - path: /  # "-" 前面请用空格, 不要用 "Tab" 键(制表符), "-" 后面有一个空格, 切记不可省略 ,下同
        script: /index.php  # 与 "path" 对齐

3、修改 app.yaml 后若要生效, 请在 "应用列表" 的相应应用中选择"重启"

4、文件格式: app.yaml 一定要设置为 utf-8 , 其它格式不生效, 注意 包括 utf-8 + BOM 的格式亦不支持, 附在线检测:

http://yaml-online-parser.appspot.com/

上传的文件图片无法访问 

TAE 上传或生成的文件/图片要同步的 storage 上才会永久有效, 请在 "扩展服务" 的 storage 服务中任意创建一个用于存储, 并在 app.yaml 中配置你要同步的路径, 比如: (复制代码后注意格式对齐, 否则会启动失败) 

# 注意, 如果你确实没有上传/生成文件等应用, 就不要在 app.yaml 中配置, 这会有一定的性能开销
ossprefix:
    - /ace/app/webroot  # 表示 webroot 下的上传或生成的文件都会同步到 storage 上

如何写 rewrite/转发/伪静态规则 

1、TAE 使用的是 Nginx 配置语法, 假设一个规则为:

rewrite ^(.+)$ /index.php?q=$1 last;

 那么转化为 TAE 的配置则为: (复制代码后注意格式对齐, 否则会启动失败)

rewrite:
    - url: ^(.+)$[/size]
       script: /index.php?q=$1 last # 注意没有 ";"

2、 排除一些路径和文件类型的写法 (复制代码后注意格式对齐, 否则会启动失败)

感谢 picer 网友提供
# 非index.php开头的网址,排除三种情况后转到index.php
# 1.index.php 开头的网址
# 2.css/,img/,js/,lib/,sjxq/ 目录开始的网址
# 3.xxxx.php 形式的网址,以支持根目录下的php文件访问
# 3.xxx.html 形式的网址,以支持根目录下的html文件访问
rewrite:
    - url: ^(\/(?!(index\.php|(?:css|js|img|lib|flash|help|html|font)\/|[^\/]*?\..*)).*)$
	script: /index.php?/$1

3、常用的 apache 的转发规则,如:  

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

改写为 TAE 时可以直接用 tryuri: 

tryuri:
    - path: /
	script: /index.php

4、外部跳转 (复制代码后注意格式对齐, 否则会启动失败)

rewrite:
    - url: ^/1.gif$
	script: http://xxx.com perment

5、 ThinkPHP 常用规则, 实现 /index.php/aa/bb  优化成 /aa/bb  , 记得要重启(不仅是重新发布)应用 (复制代码后注意格式对齐以及去掉多余空格, 否则会启动失败)

rewrite:
    - url: ^(/(?!(\.)).*)$      
	script: /index.php/$1 last

这个规则完全和 nginx 一致 

如何关闭 Transfer-Encoding,微信开发等场景 

<?php
//$a = '123';  
$a = $_GET["echostr"];
header('Content-Type: application/octet-stream'); // 不要用默认的 text/html, 如果你不知道你输出的类型请用 application/octet-stream
header('Content-Length: '. strlen($a));
echo $a;

在定时任务里执行 URL, 但是又怕被其它用户访问到怎么办? 

比如 定时请求的 url 是 http://xx.aliapp.com/a.php

那么可以在 a.php 里写这么一行:

if ($_GET['token'] != '123456') exit; # 这里密码当然可能不是 123456,

那你定时触发的 URL 写成  http://xx.aliapp.com/a.php?token=123456 
这样就安全了, 很简单的两行代码, 就能防止被外部用户访问到.

 如何设置防盗链 

对于非当前域名 xxx.aliapp.com 的 referer 进行拒绝

antihotlinking:
- except: ['/xxxxx/111.gif', '/xxxx/xxx/222.js'] # 例外的 url, 防盗链不生效的路径文件/目录

Fatal error: Out of memory /  Allowed memory size of  

这个要配置 memory_limit, TAE 默认 32(M), 需要自己根据情况(不是越大越好, 设置越小, 你网站的负载能力越强)调整: 

memory_limit: 48

写入 storage 的文件可以直接通过 TAE 的域名来访问 

$Storage = Alibaba::Storage(); // 想通过域名访问, 只能写在默认的 storage 里面
$Storage->saveText('xxxx.jaeapp.com/1/webroot/123.jpg', '123', -11);  // xxxx 是你的域名前缀, 不要加 http, 1是版本号, 可查看版本管理里面的版本号

写入后, 浏览器就能直接访问了, xxxx 是你的域名前缀, 不要加 http, 1是版本号, 可查看版本管理里面的版本号, 在配置外部 oss 也可以遵循这个路径使得可以直接访问到静态资源. 

TAE上使用文件缓存 

千万不要在 TAE 上使用文件缓存这类功能或插件, TAE 是个真正的分布式系统, 程序运行在未知数量的主机上, 在本地用文件缓存完全不能提升性能, 反而会降低性能, 典型的例子如: smarty 等, 建议关闭缓存. 
对于真正需要缓存的功能, 建议使用TAE 的 cache服务开发.

SVN删除文件,重新发布后删除的文件还在 

1) 文件会被动态修改过, 修改过的文件 svn 暂时不负责删除 
2) 此文件被动态同步中, 详情见, 本地读写同步 oss

 解决办法, 动态 unlink('文件')

无法 include 某个文件,或某个文件无法读取 

 TAE 是 linux 环境,对于文件大小写敏感,请注意文件名是否有大小写情况,请和程序中的大小字字母保持一致。

 

FAQ

关于此文档暂时还没有FAQ
返回
顶部