この記事では、ThinkPHP の SAE 開発に関連する考慮事項について詳しく説明します。参考のために皆さんと共有してください:
ThinkPHP の SAE 開発は基本的に ThinkPHP の標準バージョンと同じで、SAE インターフェースの使用法を知る必要はありません。 ThinkPHP 開発をマスターすれば、ThinkPHP に基づいた SAE 開発を簡単にマスターできます。
SAE エンジン開発プロセスを使用する際のいくつかの注意事項を以下に示します。これは、SAE の開発と展開をより適切に完了するのに役立ちます。
構成
SAE エンジンには、実行時に SAE 独自の従来構成と独自構成があるため、構成ファイルのロード順序は次のとおりです:
共通構成 -> プロジェクト構成 -> SAE 従来構成 -> SAE 独自構成
構成SAE の従来の構成および SAE 独自の構成内の項目は、プロジェクト構成をオーバーライドします。
SAE 規約設定: エンジン ディレクトリ/Sae/Conf/convention_sae.php にあり、プログラムが SAE 上で実行されるときの固定データベース接続設定項目を定義します。
SAE 独自の構成: プロジェクトの Conf ディレクトリにあり、ファイル名は config_sae.php に SAE 構成を書き込むことができます。
注: SAE 従来構成と SAE 独自構成は SAE 環境固有の構成であり、ローカルで実行する場合にはロードされません。
データベース
開発者は、プロジェクト構成ファイル (config.php) で SAE 関連のデータベース構成項目を定義する必要はありません。ローカル デバッグ中に接続するデータベースを定義するだけで済みます。コードが SAE に送信されると、SAE 規約の設定がプロジェクト設定ファイル内のデータベース設定を自動的にオーバーライドするため、設定項目を変更せずにコードを実行できます。
コードが SAE 上で実行されると、分散データベース接続が作成され、読み取りと書き込みが分離されます。
キャッシュ
SAE 開発プロセス中も、処理に ThinkPHP の組み込みキャッシュ メソッドを使用できます。以下は、ローカルと SAE プラットフォームで異なるキャッシュ方法を使用する SAE エンジンの違いです (SAE エンジンはこの違いを自動的に判断して処理することに注意してください):
ThinkPHP の新しいバージョンは、SQL キャッシュ キュー機能をサポートします。 DB_SQL_BUILD_CACHE を構成して、SQL ステートメントの解析キャッシュを有効にすることができます。 SAE プラットフォームでは、SQL キャッシュの保存に KVDB が使用されるため、DB_SQL_BUILD_QUEUE 構成項目は機能しません。また、SAE で実行している場合、カウンター管理バックグラウンドで SQL キャッシュ キューのデキュー数を記録するためにカウンター サービスが使用されます
http://sae.sina.com.cn/?m=counter
。計算機名 think_queue_out_times の値が非常に大きい場合は、設定したキューの数が少なすぎるため、DB_SQL_BUILD_LENGTH 構成項目を調整する必要があることを意味します。
ファイルのアップロード
ファイルのアップロードでは、ファイルのアップロードに引き続き UploadFile 拡張クラス ライブラリが使用され、使用方法は変わりません。 SAE 上で実行する場合、同じコードが指定されたディレクトリにアップロードされ、指定されたストレージにファイルをアップロードするためにストレージ サービスが自動的に使用されます。まず、アップロードされたファイルを保存するために SAE プラットフォーム上にストレージ ドメインを作成する必要があります:
http://sae.sina.com.cn/?m=storage
ここで複数のドメインを作成できます。ファイルがアップロードされるドメインは、アップロード パスの最初のディレクトリの名前によって決まります。例:
$upload->savePath = './Public/Uploads/';
は、Public という名前のドメインにアップロードされます。このドメインに Uploads フォルダーを作成する必要はありません。SAE のストレージ サービスが自動的に作成します。
画像アドレスの問題:
画像をアップロードするために UploadFile クラスを使用します。画像の参照アドレスはローカルと SAE で異なります。たとえば、「/Public/upload/1.jpg」というアドレスを持つ画像があり、/Public はテンプレート置換変数であり、Public フォルダーが配置されているディレクトリのアドレスに置き換えられます。ブラウザのソースコード機能を介して置き換えると、どのような効果が得られますか? ご覧のとおり、「/Public/upload/1.jpg」に置き換えられています。 ただし、SAE では、写真は Public/upload ディレクトリではなくストレージにあります。 SAE で正常に表示できるように、/Public/ をストレージのドメイン名に置き換える必要があります。
SAE 独自の構成 Conf/config_sae.php ファイルで次のコードを定義します:
<?php return array( 'TMPL_PARSE_STRING'=>array( '/Public/upload'=>sae_storage_root('Public').'/upload' ) );
このようにして、/Public/upload は SAE 上のストレージ アドレスに置き換えられ、画像は正常に動作します。 SAEの番組で。
ファイル削除の問題:
アップロードされたファイルはローカルおよび SAE に保存されているため、リンク解除を使用してファイルを直接削除することはできません。 ThinkPHP の SAE バージョンには、互換性を実現するために sae_unlink 関数が追加されました。例:
sae_unlink('./Public/Uploads/xxx.jpg');
ローカルで実行すると、Public/Uploads フォルダー内の画像が削除されます。 SAE 上で実行すると、ドメインが Public であるストレージ内のイメージが削除されます。この関数がどの domian ファイルを削除するかは、パスの最初のディレクトリ名によっても決まります。
画像処理
SAE エンジンは自動画像処理も実行します。ローカル プラットフォームと SAE プラットフォームの違いは次のとおりです。
你完全不用去学习怎么用SaeImage生成缩略图,也不用学习SaeVcode服务怎么用,你还是按照以前的方式使用ThinkPHP进行验证码和缩略图功能就可以了。
使用验证码的时候需要注意,在本地运行时验证码默认为数字形式,而在SAE上运行时验证码为数字+字母形式,而且存在字母大小写问题。如果你希望验证码区分大小写的话,需要将验证码统一转化为大写后进行匹配。
如:
if(md5(strtoupper($_POST['verify']))!=$_SESSION['verify']){ //验证错误处理代码 }
日志记录
SAE版ThinkPHP同样实现了生成系统日志功能,在本地运行会将日志记录到项目的项目的Runtime/Logs文件夹下,而在SAE上运行会将日志记录到SAE平台的日志中心:
http://sae.sina.com.cn/?m=applog
请在搜索框选择中的下拉菜单处选择“debug”进行查看。
Trace信息
建议在开发程序时配置SHOW_PAGE_TRACE=>true 开启页面Trace信息。开启后,代码在SAE环境下运行时会显示一些SAE独有的Trace信息,有助于我们开发。你可能会到以下trace信息。
模板缓存:Trace信息名称为“[SAE]模板缓存”
在SAE下不会将模板编译缓存生成在Runtime目录下,而是存放在Memcache中。如果你想查看模板编译后的缓存,这里显示的就是模板缓存在Memcache中的缓存名称。你可以在SAE的memcache服务管理平台输入缓存名称得到缓存内容:
http://sae.sina.com.cn/?m=mcmng
注:你看得的缓存内容,都是以一串数字开始,这数字和缓存内容无关,是记录的缓存生成时间。
核心缓存:Trace信息名称为“[SAE]核心缓存”
它记录的是核心编译缓存在Memcache中的缓存名称。如果你要获得核心编译缓存,比如我们要用核心编译缓存代替入口文件的时候。你可以在SAE的Memcache服务管理平台 输入这里记录的缓存名称获得。
注:
在开启调试时不会生成核心编译缓存,如果你获得核心编译缓存,请先关闭调试。
缓存内容开头的数字是记录的缓存生成时间,请将数字去掉后再作为入口文件。
静态缓存:Trace信息名称为“[SAE]静态缓存”
它记录了生成的静态缓存在KVDB中的名称。 目前SAE管理平台没有能直接输入KVDB名称获得内容的地方,大家需要自己写程序获取内容。
注:此Trace信息是在生成静态缓存的时候才会出现。如果你访问到的页面没有执行生成静态缓存的操作时,将不会有此条Trace信息。
隐藏index.php
SAE不支持.htaccess文件,但我们可以使用SAE提供的AppConfig服务实现伪静态。
在你项目的根目录建立config.yaml文件,代码为:
handle: - rewrite: if(!is_dir() && !is_file() && path~"^(.*)$") goto "index.php/$1"
这样就可以隐藏入口了。
比如这样的地址 http://serverName/index.php/Blog/read/id/1也能通过
http://serverName/Blog/read/id/1访问。
代码横跨性建议
SAE版ThinkPHP,是具有横跨性的,请不要破坏它的横跨性。比如,不要在项目配置文件中写和SAE数据库相关配置项。 自己写代码时,也要尽量做到横跨性,这样就可以让同样的代码既能在SAE下运行,也能在普通环境下运行, 使你在本地调试完后上传到SAE也不用修改任何代码就能运行。
下面是一些保持代码横跨性的建议:
(1)尽量少使用原生的SAE服务
能使用ThinkPHP自带函数替代的,尽量使用ThinkPHP自带函数。比如要使用SAE的KVDB服务,在ThinkPHP中完全可以用F函数代替。如果要使用SAE的Memcache服务,都使用S函数实现。 这样就不会导致你的代码从SAE转移到普通环境后性能很低。
个别SAE服务无法使用ThinkPHP自带函数代替的,才考虑使用原生的SAE服务。
(2)利用IS_SAE常量
ThinkPHP的SAE引擎增加了IS_SAE常量,能判断代码运行环境是普通环境还是SAE环境。如果你有段代码在普通环境和在SAE环境下实现方式不同,你可以使用IS_SAE进行判断后做不同处理或者加载不同的文件。
(3)利用SAE专有文件
在SAE惯例配置中,我们可以看见除了配置了固定的数据库配置项,还有一个SAE_SPECIALIZED_FILES配置项,它定义了系统专有文件。目前已经定义了UploadFile类和Image类的SAE专有文件,所以当我们的代码 import(“@.ORG.UploadFile”) 在本地运行时会按普通方式导入项目下Lib/ORG/UploadFile.class.php文件, 而在SAE上运行是系统检查到UploadFile.class.php有SAE专有文件,它导入的是SAE_SPECIALIZED_FILES配置项中定义的文件地址。这样实现了普通环境和SAE环境下同样的代码导入了不同类库,而类的调用方法都是一样的,只是现实方法不同,这样就能保证了代码的横跨性。
SAE 独自のファイルを自分で作成することもできます。独自のファイルを通常のファイルと同じディレクトリに配置すると、SAE_SPECIALIZED_FILE 構成項目を定義せずにシステムが独自のファイルを認識できるようになります。たとえば、Image.class.php ファイルと同じディレクトリに Image_sae.class.php という名前のファイルを定義すると、システム SAE で実行するときに、Image.class.php ファイルをインポートするときに、Image_sae.class がインポートされます。代わりに .php ファイルを使用します。
クラス ライブラリが同じディレクトリ内の両方の独自ファイルを定義し、SAE_SPECIALIZED_FILE 構成項目でも定義されている場合、同じディレクトリ内の独自ファイルが最初にインポートされます。独自のファイルを作成する必要がある場合は、通常のファイルと同じディレクトリに作成することをお勧めします。
インポートされたクラスライブラリに SAE 独自のファイルがない場合、SAE で実行するときに通常のファイルもインポートされます。
SAE 独自のファイルを使用して、通常の環境と SAE 環境で異なるクラス ライブラリをカプセル化できますが、クラス ライブラリの使用方法は同じであるため、クラス ライブラリのクライアント コードはクロスファンクショナルになります。
(4) SAE 独自の構成を使用する
SAE と通常の環境の構成ニーズが異なる場合、通常の環境の構成をプロジェクト構成ファイル Conf/config.php に書き込み、SAE が必要とする構成を変更できます。設定は SAE 独自の設定 Conf/config_sae.php に書き込まれます。
この記事が、ThinkPHP フレームワークに基づいた PHP プログラムの設計に役立つことを願っています。
ThinkPHP の SAE 開発に関する考慮事項の詳細な説明と関連記事については、PHP 中国語 Web サイトに注目してください。