이 문서에서는 ThinkPHP의 SAE 개발과 관련된 고려 사항을 자세히 설명합니다. 참고를 위해 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
ThinkPHP의 SAE 개발은 기본적으로 ThinkPHP의 표준 버전과 동일합니다. SAE 인터페이스를 사용하는 방법을 알 필요가 없습니다. 엔진은 SAE 인터페이스를 자동으로 통합했습니다. ThinkPHP 개발을 마스터하면 ThinkPHP 기반 SAE 개발도 쉽게 마스터할 수 있습니다.
다음은 SAE 엔진 개발 프로세스를 사용할 때 SAE 개발 및 배포를 더 잘 완료하는 데 도움이 될 수 있는 몇 가지 예방 조치입니다.
구성
SAE 엔진은 실행 시 SAE 고유의 기존 구성과 전용 구성을 가지므로 구성 파일 로드 순서는
기존 구성->프로젝트 구성-> ; SAE 기존 구성->SAE 독점 구성
SAE 기존 구성 및 SAE 독점 구성의 구성 항목은 프로젝트 구성을 재정의합니다.
SAE 규칙 구성: 프로그램이 SAE에서 실행될 때 고정된 데이터베이스 연결 구성 항목을 정의하는 엔진 디렉토리/Sae/Conf/convention_sae.php에 위치합니다.
SAE 독점 구성: 프로젝트의 Conf 디렉토리에 있습니다. 파일 이름은 config_sae.php입니다.
참고: SAE 기존 구성 및 SAE 독점 구성은 SAE 환경에 대한 고유한 구성이며 로컬로 실행될 때 로드되지 않습니다.
데이터베이스
개발자는 프로젝트 구성 파일(config.php)에서 SAE 관련 데이터베이스 구성 항목을 정의할 필요가 없습니다. 로컬 디버깅 중에 연결할 데이터베이스만 정의하면 됩니다. 코드가 SAE에 제출되면 SAE 규칙 구성이 프로젝트 구성 파일의 데이터베이스 구성을 자동으로 재정의하므로 구성 항목을 수정하지 않고도 실행할 수 있습니다.
SAE에서 코드가 실행되면 분산 데이터베이스 연결이 이루어지고 읽기와 쓰기가 분리됩니다.
캐싱
SAE 개발 프로세스 중에도 ThinkPHP에 내장된 캐싱 방법을 사용하여 처리할 수 있습니다. 다음은 로컬과 SAE 플랫폼에서 서로 다른 캐싱 방법을 사용하는 SAE 엔진 간의 차이점입니다(SAE 엔진은 이 차이를 자동으로 확인하고 처리합니다).
새로운 버전의 ThinkPHP는 SQL 캐싱을 지원합니다. 큐 기능의 경우 DB_SQL_BUILD_CACHE를 구성하여 SQL 문 구문 분석 캐시를 활성화할 수 있습니다. SAE 플랫폼에서는 KVDB를 사용하여 SQL 캐시를 저장하므로 DB_SQL_BUILD_QUEUE 구성 항목이 작동하지 않습니다. 그리고 SAE에서 실행될 때 카운터 서비스는 카운터 관리 백그라운드
http://sae.sina.com.cn/?m=counter
think_queue_out_times라는 계산기에 큰 값이 표시되면 설정한 대기열 수가 너무 적다는 의미이므로 DB_SQL_BUILD_LENGTH 구성 항목을 조정해야 합니다. 파일 업로드파일 업로드는 여전히 UploadFile 확장 클래스 라이브러리를 사용하여 파일을 업로드하며 사용 방법은 변경되지 않습니다. 로컬로 실행할 때 동일한 코드가 지정된 디렉터리에 업로드됩니다. SAE에서 실행할 때 Storage 서비스는 지정된 Storage에 파일을 업로드하는 데 자동으로 사용됩니다. 먼저 업로드된 파일을 저장하려면 SAE 플랫폼에서 스토리지 도메인을 생성해야 합니다. http://sae.sina.com.cn/?m=storage 생성할 수 있습니다. 여기 여러 도메인이 있습니다. 파일이 업로드될 도메인은 업로드 경로의 첫 번째 디렉터리 이름에 따라 결정됩니다. 예를 들어$upload->savePath = './Public/Uploads/';은 Public이라는 도메인에 업로드됩니다. 이 도메인에 업로드 폴더를 만들 필요가 없습니다. 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의 다른 위치에 저장되기 때문에 연결 해제를 사용하여 파일을 직접 삭제할 수 없습니다. ThinkPHP의 SAE 버전에는 호환성을 위해 sae_unlink 함수가 추가되었습니다. 예:
sae_unlink('./Public/Uploads/xxx.jpg');로컬로 실행하면 Public/Uploads 폴더의 이미지가 삭제됩니다. SAE에서 실행하면 도메인이 Public인 스토리지의 이미지가 삭제됩니다. 이 함수가 삭제할 도미안 파일은 경로의 첫 번째 디렉터리 이름에 따라 결정됩니다. 이미지 처리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 중국어 홈페이지를 참고해주세요!