我怎么在页面输出错误日志?

可以使用ini_set控制错误的输出。

ini_set(‘display_errors’,1);错误输出到屏幕。

ini_set(‘display_errors’,0);关闭错误输出到屏幕。

日志是否可以存储在Storage中?如果不行,如何保存日志?

首先,日志绝对不能存储在StorageStorage不支持追加写。

第一种解决方案是sae_debug。需要注意的是sae_debug对每个记录有长度限制,不能超过1024字节。sae_debug打出 的日 志可以提供下载。

另一种解决方案是使用scribe。可以购买一台虚拟机,在上面搭建scribe服务,然后将日志推到scribe。这种方案比较适合需要对 日志 进行分析的场景。

SAE如何在本地写入文件?

由于数据安全性等原因,SAE不支持本地写入文件。但是SAE提供了 TmpFS 临时文件和         Wrappers 两种方式来解决这个问题。

1. 对于不需要保存的临时文件可以使用TmpFS服务进行临时存储,请注意临时文件在当前PHP脚本执行结束后立即销毁,不能跨脚本使用。

2. 对于需要保存的文件,可以通过保存到Memcache中或Storage中(需要初始化)代替本地文件读写.通过使用SAE预置的PHP Wapper类可以非常方便地对本地读写进行修改。

例如:

本地读写file_put_contents( PATH.’/mycode.txt’,’dummy test’);

可以通过在PATH前加‘saemc://’即可把文件写到Memcache中,即file_put_contents( ‘saemc://’.PATH.’/mycode.txt’,’dummy test’); 这种方式对于本地读写其他函数如file_get_contents,fopen,fwrite等也同样适用,例如要想读去上面的文件只需要file_get_contents( ‘saemc://’.PATH.’/mycode.txt’,’dummy test’);即可

同样也可以通过在PATH前加‘saestor://’.$DOMAIN.’/’的方式把文件保存到Storage中。但是请注意Storage的存与取其实都是网络读写的过程,比本地读写要慢很多,所以建议对于模板这种读取比较频繁又可以快速生成的文件保存到Memcache里,不然会严重影响性能。

很多微博应用会有生成图片然后发布到微博的功能,其中生成的图片必须保存到Storage里.如果简单的使用’saestor://’修改原来的本地读 写逻辑同样会遇到Storage读写效率低的问题,建议把流程修改为先把图片保存为临时文件然后分别上传到Storage和微博中,这样可以减少一次 Storage的读取过程节省大量时间。

查看Storage服务介绍 查看TmpFS服务介绍

SAE上能使smarty吗?

可以。

SAE不支持本地文件写入,Smarty不能直接使用,但可以通过wrapper使用。

以smarty3为例:

include_once(“Smarty3.0.6/Smarty.class.php”); //包含smarty类文件
$path=”saemc://templates_c”;//使用MC Wrapper
mkdir($path);
$smarty = new Smarty();
$smarty->template_dir = “./templates”;
$smarty->compile_dir = $path; //设置编译目录
$smarty->assign(“str1”, “Hello,Smarty.”);
//编译并显示位于./templates下的index.tpl模板
@$smarty->display(“sample.tpl”);
//直接使用smarty会报chmod错误,这个错误不会影响到smarty的使用 请加@忽略

为什么设置Storage防盗链后微博SDK发送图片微博失败?

发带图片微博时,向微博API提交了Storage中图片的URL,微博API通过URL抓取图片,因为API的referrer不在防盗链白名单,所以发送失败。

解决方法:Storage防盗链开启后,SaeTClient::upload()发图片时图片地址用 saestor://domain/filename ,即可不受防盗链影响。

例如:

$c = new SaeTClient( WB_AKEY , WB_SKEY , $_SESSION[‘last_key’][‘oauth_token’] , $_SESSION[‘last_key’][‘oauth_token_secret’]  );

$c->upload (‘abc’ ,’saestor://abc/def.jpg’);

什么是RDC?

RDC是Relational DB Cluster(关系型数据库集群)的简称,是一种分布式的关系型数据库集群,主要用在支撑公有云计算平台的数据库集群,可以支持百万级的数据库后端。

RDC 对终端用户完全透明,用户在使用RDC时,不会感觉到和使用传统的MySQL数据库有任何差异.用户可以使用所有MySQL标准客户端(MySQL5以 上)操作RDC,如mysql_query、mysql_connect等,错误处理也和标准MySQL客户端处理模式一样。

RDC为用户提供了更加稳定可靠的服务:

1. 通过其强隔绝性为用户提供了更高的安全性,保障用户的数据安全。
2. 当后端DB发生故障和延迟时,RDC能够自动切换,保证服务更加稳定可靠。
3. 能通过对SQL的智能预处理降低用户触发分钟配额的可能。
4. 由于RDC自身性能消耗更低,整体数据库集群性能也有所提升。

查看RDC详细介绍

SAE如何操作MySQL?

SAE的PHP Runtime环境提供了标准的MySQL,MySQLI和PDO模块,三个模块都由MYSQLND驱动,支持所有MYSQL的特性,您可以使用您习惯的方式来操作数据库.

为了同学们使用方便,SAE提供了预定义常量,简化数据库的链接:

define( ‘SAE_MYSQL_HOST_M’, ‘w.rdc.sae.sina.com.cn’ );//主库地址
define( ‘SAE_MYSQL_HOST_S’, ‘r.rdc.sae.sina.com.cn’ );//从库地址
define( ‘SAE_MYSQL_PORT’, 3307 );//数据库端口
define( ‘SAE_MYSQL_USER’, SAE_ACCESSKEY );//数据库用户名
define( ‘SAE_MYSQL_PASS’, SAE_SECRETKEY );//数据库密码
define( ‘SAE_MYSQL_DB’, ‘app_’ . $_SERVER[‘HTTP_APPNAME’] );//数据库名

mysql模块为例:

/* 连主库 */

$link=mysql_connect(SAE_MYSQL_HOST_M.’:’.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

/* 连从库 */

/*
$link=mysql_connect(SAE_MYSQL_HOST_S.’:’.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

*/
if($link)
{
mysql_select_db(SAE_MYSQL_DB,$link);
//your code goes here
}
同时SAE也提供了SaeMysql类,已经内置了主从分离,我们推荐您使用这个类来操作MySQL资源。

如何控制mysql返回的数据编码?

如需要gbk编码:
$mysql = new SaeMysql();
$mysql->setCharset(‘gbk’);
$data = $mysql->getData(‘SELECT * FROM `yourtable`’);

SAE支持MySQLI吗?

支持,但是推荐用户使用我们提供的SaeMysql来操作mysql,这样不用自己做读写分离。

Storage和Sina S3的区别?

Storage是SAE的标准分布式存储服务,Sina S3是SAE外接的分布式存储服务,两者使用相同的接口,但实现不同。

SAE的Storage支持append吗?我的程序需要日志输出怎么做?

Storage目前不支持追加写,所以目前不适合作为程序的日志输出。另外由于SAE禁用了本地持久化的IO操作,所以对于日志输出功能,我们推荐您采用以下的做法:

1. 用php的sae_debug(“message”)函数输出日志,这样您可以在应用日志的debug日志里看到相应的日志输出,将来我们会提高日志打包下载功能。

2. 将日志输出到MySQL中。

FetchURL服务支持重定向吗?

支持。目前支持5次以内(含5次)的服务端重定向跳转。

FetchURL支持user-agent和refer自定义吗?

支持。为了防止FetchURL被恶意抓站等滥用,我们规定FetchURL的user-agent默认包含SAE/fetchurl- accesskey,其中accesskey是用户的accesskey,用户可以自行添加user-agent;refer用户也可以自行定义。

FetchURL服务支持指定端口访问吗?

支持。
$f = new SaeFetchurl();
$content = $f->fetch(‘http://yoururl.com:81’)

SAE支持https吗?

支持。https主要用于你的app的一些敏感数据的传输,比如用户登陆等。但我们并不推荐所有请求都用https,因为https的资源价格比http访问贵很多,而且分钟配额也小得多。

https的使用由你的代码决定。你在程序里嵌入https链接自然就是https请求。

如何判断客户端是以http方式还是https方式连接的?

可以使用预设的全局函数is_https()进行判断。

为什么我无法访问App?

如果您看到的是404错误,”The requested URL / was not found on this server.”,请您在代码根目录放置index.php或者index.html文件,如果您看到的是其他错误,我们会给出相应的错误页面和错误提 示,如果你看到的SAE Internal Error,说明这是由于我们的系统问题导致的,请您速与我们联系,我们将以最快的速度解决。

XHProf怎么使用?

SAE集成了XHProfXHProf是Facebook放出的轻量级调试工具.和Xdebug相比,XHProf更加易用和可控.尤其是生成流程图和调试数据对比的功能请参考。具体参考 XHProf介绍

我为什么不能使用新浪微博OAuth框架?

可能存在的问题
1. 填入的App Key错误。 这里需要填写微博开放平台的App Key、App Secret 。


2. token为空时,请用print_r打印出错误信息,里边有提示
3. 有时微博接口会出问题,先到 微博 帐号设置 应用授权里边收回授权再试试

如何解决”Cannot send session cache limiter – headers already sent “错误?

如果使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会出现”Cannot send session cache limiter – headers already sent”错误,所以首先要确保Session_start()在开始输出之前执行,一般直接放到php文件的最上方.

如果Session_start()已经在文件的最上方,且php文件为utf8编码,那这个错误很可能就是由这个php文件的utf-8的BOM问题引 起的,您需要设置您的编辑器在编辑utf-8文件时不添加BOM 以Edit plus为例:您需要将工具->参数->文件->UTF_8签名一项中,”总是添加签名”选项改为”总是移除签名”.这样重新编辑保存 相应文件后就能解决这个问题。

SAE支持htaccess吗?SAE能做url rewrite吗?

可以,SAE提供的AppConfig功能,能够替代htaccess。AppConfig用类似自然语言的方式来提供以下功能:

– 目录默认页面

– 自定义错误页面

– 压缩

– 页面重定向

– 页面过期

– 设置响应Header的Content-Type

– 访问权限

AppConf详细使用说明

为什么我的多条rewrite配置,单独每一条都好用,但是放到一起就不能执行了?

rewrite配置是由上而下循序执行的

如果有两条rewrite:A和B.

匹配A执行条件的url 是B的子集

例如 :

A是if(path ~ “ba.*”)

B是if(path ~ “b.*” )

那么 A就必须比B先执行,放到B的上方,不然A就没有机会执行了

特别是做多次rewrite的时候一定要注意顺序的问题 。

查看AppConfig介绍

怎么书写正确的Cron格式?

使用SAE的定时服务Cron,您只需要在config.yaml设置后,部署即可生效。

Cron示例:
1. 每隔某个时间执行,如,每隔10小时,”every 10 hours”
2. 在某个特定时间执行,如每月2号的19点03分,”$2 day of month 19:03″

偏移语法:
1. “every 1 hour”,执行时间可能为9:53:19=>10:53:19=>11:53:19=>12:53:19=>13:53:19…
2. “every 1 hour, offset 0″,执行时间为9:00=>10:00=>11:00=>12:00=>13:00…

特别说明:
1. Cron服务只支持sinaapp域内的web执行,也就是只能运行您app的代码,不能对外抓取,如需要执行外域页面,请在代码里使用FetchURL服务。
2. Cron服务存在10秒内的误差偏移 。

查看Cron详细介绍 查看AppConfig详细介绍

为什么使用Cron/TaskQueue 服务,异步调用新浪微博API接口, 会返回604, REST ERROR错误?

如果使用Cron/TaskQueue 服务,异步调用新浪微博API接口,需要自行设置Remote IP地址。否则会返回604, REST ERROR错误。

可以使用: SaeTClient::set_remote_ip 方法设置Remote IP地址。

注: Remote IP即用户IP地址。

使用示例:

require_once(“saet.ex.class.php”);

$weibo = new SaeTClient( ‘key’, ‘secret’ , ‘token’, ‘token_secret’);

$weibo-> set_remote_ip(‘202.110.0.2″); //这里填写Remote IP地址

$weibo->update(“你好,SAE !”);

Cron/TaskQueue 执行是以HTTP(POST)方式执行,所有请求由SAE服务器端发起,如不设置Remote IP, 微博接口无法区分请求的准确来源。如果发现违规微博应用,微博开放平台只能封禁SAE服务器IP,导致所有应用都无法使用Cron/TaskQueue 服务调用微博API接口。所以如果需要使用Cron/TaskQueue 异步调用微博API接口,必须自行设置Remote  IP地址,否则会返回604, REST ERROR错误。