PHP之道

目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正。PHP之道网站的目标就是搜集PHP最佳实践、编码规范和网络上的权威学习指南,给PHP学习者提供一个易于阅读,快速查找的入口。

PHP之道已经翻译成多种语言:

PHP没有规范化的使用方式,本网站只是展示业界的最佳实践、可用的选项和有用的信息,目的是帮助PHP新手,并对以往的经验进行反思。

PHP之道有多个banner宣传图片可以放在你的站点上显示,让更多开发者知道这个网站,找到权威的学习资料!

有了它,你可以不用安装和配置功能齐全的Web服务器,就可以开始学习PHP(要求PHP5.4+版本)。要启动内置Web服务器,需要从你的命令行终端进入项目的Web根目录,执行下面的命令:

>php-Slocalhost:8000Mac安装OSX系统会预装PHP,只是版本比最新稳定版低一点。目前Lion下是PHP5.3.6,MountainLion下是5.3.10,Mavericks下是5.4.17.

如果你想获取一些Vagrant的使用帮助的话,可以参考下面的三个服务:

PHP社区百花齐放,拥有大量的函数库、框架和组件。PHP开发者通常会在自己的项目中使用若干个外部库,因而PHP代码遵循或尽量接近同一个代码风格就非常重要,可以让开发者方便地把多个代码库集成在自己的项目中。

通常情况下,你的PHP代码应该遵循其中一项或多项标准,从而其他开发者可以方便地阅读和使用你的代码。这些标准都是在前一个标准上附加新的规则,所以使用PSR-1就同时要求遵循PSR-0,但可以不遵循PSR-2。

变量名和代码结构建议使用英文符号编写,注释则可以使用各种语言,没有限制。

PHP是一个灵活的动态语言,支持多种编程范式。这些年来一直在不断的进化,重要的里程碑包括PHP5.0(2004)增加完善的面向对象模型、PHP5.3(2009)增加匿名函数和命名空间和PHP5.4(2012)增加traits.

PHP具有完整的面向对象编程特性,如类、抽象类、接口、继承、构造函数、克隆和异常等。

PHP支持第一类函数(first-classfunction),即函数可以赋值给变量,包括用户自定义的函数和内置函数,然后动态调用它。函数可以作为参数传递给其他函数(即高阶函数),也可以作为函数返回值返回。

PHP支持函数递归调用,即函数自己调用自己,不过在实际的PHP代码中,我们更喜欢用迭代来代替递归。

2009年发布的PHP5.3开始引入支持闭包的匿名函数。

PHP5.4支持把闭包绑定到对象作用域,并改善其可调用性,从而可以在大部分场景中使用匿名函数替代普通函数。

PHP通过反射API和魔术方法机制,支持多种方式的元编程。开发者通过魔术方法,如__get(),__set(),__clone(),__toString(),__invoke()等,可以改变类的行为。Ruby开发者经常说PHP没有method_missing方法,实际上通过__call()和__callStatic()就可以完成同样的功能。

如前所述,PHP社区的众多开发者已经开发了大量的代码。这意味着一个函数库中的PHP代码可能使用了另外一个库中相同的类名,如果它们共享一个命名空间,则会产生冲突导致异常。

命名空间解决了这个问题。如PHP手册里描述的那样,命名空间类似于操作系统中的目录,两个同名文件可以共存于不同的目录。同理,同名的PHP类可以在不同的PHP命名空间下共存,就这么简单。

因而把代码放在自己的命名空间下就显得非常必要,这样其他人就可以放心的使用这些代码,而无需担心与其他函数库的命名冲突。

标准PHP库(SPL)和PHP一起发布,提供了一组类和接口,包括了常用的数据结构如栈,队列和堆等,以及遍历这些数据结构的迭代器,或者你还可以自己实现SPL接口。

PHP的主要目的是开发Web应用,不过它的命令行脚本接口(CLI)也非常有用。PHP命令行编程可以帮你完成自动化的任务,如测试,部署和应用管理。

CLIPHP编程非常强大,可以直接调用你自己的app代码而无需创建Web图像界面,需要注意的是不要把CLIPHP脚本放在公开的web目录下!

在命令行下运行PHP:

接下来写一个简单的”Hello,$name”CLI程序,先创建名为hello.php的脚本:

运行上面的脚本,在命令行输入:

>phphello.phpUsage:phphello.php[name]>phphello.phpworldHello,worldXDebug调试器是软件开发过程中非常重要的一个工具,通过它,可以跟踪代码的执行过程,查看堆栈信息。XDebug是一个PHP调试器,可以集成在常见的IDE中,提供设置断点、查看堆栈信息等功能,还可以和PHPUnit、KCacheGrind等工具配合,执行代码覆盖率测试和性能调优。

如果你现在还没有使用调试器,仅仅依靠var_dump/print_r调试的话,XDebug就是你的最佳选择。

通常,你需要修改Apache虚拟主机或者.htaccess配置文件,增加:

php_valuexdebug.remote_host=192.168..php_valuexdebug.remote_port=9000“remotehost”和”remoteport”对应本机IDE的监听地址和端口,然后设置IDE为”等待连接”模式,打开URL:

图形化调试器使得单步调试、查看变量和现场运行代码变得异常简单,很多IDE都自带或者通过第三方插件支持xdebug的调试,如Mac平台下的开源软件MacGDBp。

如今有大量的PHP函数库、框架和组件可供选择,一个项目中可能会使用其中的若干——这就是项目的依赖。到目前为止,PHP还没有有效的项目依赖管理方案。即使你手工的管理它们,你还不得不处理它们的自动加载问题。

目前主要有两个PHP包管理系统:Composer和PEAR,哪个适合你呢?答案是两个都需要。

通常情况下,Composer包只在你项目中明确指定时才可用,而PEAR包在所有的PHP项目中可用。尽管PEAR听起来似乎更简单,但是根据每个项目制定方案可能更合适。

Composer是一个出色的PHP依赖管理器,把项目的依赖列在composer.json文件中,然后通过一些简单的命令,Composer就会自动的帮你下载这些依赖,并配置好自动加载路径。

Composer可以安装在本地(在当前工作目录,不推荐这种方式),也可以安装在系统中(如/usr/local/bin)。假设你要在本地安装,在项目的根目录执行:

手动安装composer有点麻烦,不过很多开发者可能更喜欢这种安装方式。使用交互式安装程序,它会检查你安装的PHP:

而手动安装则需要你自己做这些事情,你必须自己权衡利弊,以决定是否手动安装。下面是手动获取Composer的方法:

这样文档中描述的运行Composer的命令phpcomposer.pharinstall,就可以用如下命令替代:

composerinstall下面默认你已经在PATH路径下安装Composer。

composerrequiretwig/twig:~1.8或者通过composerinit命令也可以一步步地引导你创建项目所需的composer.json文件。无论使用哪种方式创建了composer.json文件后,就可以通过Composer下载和安装项目依赖到目录vendors/:

composerinstall最后在应用的PHP入口文件添加下面代码,告诉PHP使用Composer自动加载器加载项目的依赖库:

Composercreatesafilecalledcomposer.lockwhichstorestheexactversionofeachpackageitdownloadedwhenyoufirstranphpcomposer.pharinstall.Ifyoushareyourprojectwithothercodersandthecomposer.lockfileispartofyourdistribution,whentheyrunphpcomposer.pharinstallthey’llgetthesameversionsasyou.Toupdateyourdependencies,runphpcomposer.pharupdate.

Thisismostusefulwhenyoudefineyourversionrequirementsflexibly.Forinstanceaversionrequirementof~1.8means“anythingnewerthan1.8.0,butlessthan2.0.x-dev”.Youcanalsousethe*wildcardasin1.8.*.NowComposer’sphpcomposer.pharupdatecommandwillupgradeallyourdependenciestothenewestversionthatfitstherestrictionsyoudefine.

PEARrequireseachpackagetohaveaspecificstructure,whichmeansthattheauthorofthepackagemustprepareitforusagewithPEAR.UsingaprojectwhichwasnotpreparedtoworkwithPEARisnotpossible.

PEARinstallspackagesglobally,whichmeansafterinstallingthemoncetheyareavailabletoallprojectsonthatserver.Thiscanbegoodifmanyprojectsrelyonthesamepackagewiththesameversionbutmightleadtoproblemsifversionconflictsbetweentwoprojectsarise.

IfyouareusingLinux,youcanalsohavealookatyourdistributionpackagemanager.DebianandUbuntu,forexample,haveanaptphp-pearpackage.

pear-channel/Package

The“pear”prefixishardcodedtoavoidanyconflicts,asapearchannelcouldbethesameasanotherpackagesvendornameforexample,thenthechannelshortname(orfullURL)canbeusedtoreferencewhichchannelthepackageisin.

WhenthiscodeisinstalleditwillbeavailableinyourvendordirectoryandautomaticallyavailablethroughtheComposerautoloader:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php

TousethisPEARpackagesimplyreferenceitlikeso:

PHP是一个伟大的语言,可以让各个层次的程序员都能够快速高效地完成编码任务。虽然如此,我们还是经常会因为临时救急或者坏习惯而忽视了PHP的基础。为了解决这个问题,这部分专门给开发者回顾一下PHP的基础编码实践。

如果你的项目使用了框架,那么在代码和项目结构上,都会遵循框架的约束,自然也就继承了框架中的各种模式,这时你所需要考虑的是让上层代码也能够遵循最合适的模式。反之,如果没有使用框架,那么就需要你自己选择适用于当前项目类型和规模的最佳模式了。

Dependencyinjectionisasoftwaredesignpatternthatallowstheremovalofhard-codeddependenciesandmakesitpossibletochangethem,whetheratrun-timeorcompile-time.

Thisquotemakestheconceptsoundmuchmorecomplicatedthanitactuallyis.DependencyInjectionisprovidingacomponentwithit’sdependencieseitherthroughconstructorinjection,methodcallsorthesettingofproperties.Itisthatsimple.

Wecandemonstratetheconceptwithasimple,yetnaiveexample.

HerewehaveaDatabaseclassthatrequiresanadaptertospeaktothedatabase.Weinstantiatetheadapterintheconstructorandcreateaharddependency.ThismakestestingdifficultandmeanstheDatabaseclassisverytightlycoupledtotheadapter.

adapter=newMySqlAdapter;}}classMysqlAdapter{}ThiscodecanberefactoredtouseDependencyInjectionandthereforeloosenthedependency.

adapter=$adapter;}}classMysqlAdapter{}NowwearegivingtheDatabaseclassitsdependencyratherthanitcreatingititself.Wecouldevencreateamethodthatwouldacceptanargumentofthedependencyandsetitthatway,orifthe$adapterpropertywaspublicwecouldsetitdirectly.

IfyouhaveeverreadaboutDependencyInjectionthenyouhaveprobablyseentheterms“InversionofControl”or“DependencyInversionPrinciple”.ThesearethecomplexproblemsthatDependencyInjectionsolves.

InversionofControlisasitsays,“invertingthecontrol”ofasystembykeepingorganisationalcontrolentirelyseparatefromourobjects.IntermsofDependencyInjection,thismeanslooseningourdependenciesbycontrollingandinstantiatingthemelsewhereinthesystem.

Foryears,PHPframeworkshavebeenachievingInversionofControl,however,thequestionbecame,whichpartofcontrolareyouinverting,andwheretoForexample,MVCframeworkswouldgenerallyprovideasuperobjectorbasecontrollerthatothercontrollersmustextendtogainaccesstoitsdependencies.ThisisInversionofControl,however,insteadoflooseningdependencies,thismethodsimplymovedthem.

DependencyInjectionallowsustomoreelegantlysolvethisproblembyonlyinjectingthedependenciesweneed,whenweneedthem,withouttheneedforanyhardcodeddependenciesatall.

DependencyInversionPrincipleisthe“D”intheS.O.L.I.Dsetofobjectorienteddesignprinciplesthatstatesoneshould“DependonAbstractions.Donotdependonconcretions.”.Putsimply,thismeansourdependenciesshouldbeinterfaces/contractsorabstractclassesratherthanconcreteimplementations.Wecaneasilyrefactortheaboveexampletofollowthisprinciple.

adapter=$adapter;}}interfaceAdapterInterface{}classMysqlAdapterimplementsAdapterInterface{}ThereareseveralbenefitstotheDatabaseclassnowdependingonaninterfaceratherthanaconcretion.

Considerthatyouareworkinginateamandtheadapterisbeingworkedonbyacolleague.Inourfirstexample,wewouldhavetowaitforsaidcolleaguetofinishtheadapterbeforewecouldproperlymockitforourunittests.Nowthatthedependencyisaninterface/contractwecanhappilymockthatinterfaceknowingthatourcolleaguewillbuildtheadapterbasedonthatcontract.

Anevenbiggerbenefittothismethodisthatourcodeisnowmuchmorescalable.Ifayeardownthelinewedecidethatwewanttomigratetoadifferenttypeofdatabase,wecanwriteanadapterthatimplementstheoriginalinterfaceandinjectthatinstead,nomorerefactoringwouldberequiredaswecanensurethattheadapterfollowsthecontractsetbytheinterface.

ThefirstthingyoushouldunderstandaboutDependencyInjectionContainersisthattheyarenotthesamethingasDependencyInjection.AcontainerisaconvenienceutilitythathelpsusimplementDependencyInjection,however,theycanbeandoftenaremisusedtoimplementananti-pattern,ServiceLocation.InjectingaDIcontainerasaServiceLocatorintoyourclassesarguablycreatesaharderdependencyonthecontainerthanthedependencyyouarereplacing.Italsomakesyourcodemuchlesstransparentandultimatelyhardertotest.

MostmodernframeworkshavetheirownDependencyInjectionContainerthatallowsyoutowireyourdependenciestogetherthroughconfiguration.Whatthismeansinpracticeisthatyoucanwriteapplicationcodethatisascleanandde-coupledastheframeworkitisbuilton.

如果应用只是使用一个数据库的话,原生驱动就工作的非常好,否则使用MySQL的同时,还需要使用MSSQL或Oracle数据库的话,那么就没有办法只使用一个原生驱动了,只能分别学习各个数据库驱动的API,这非常令人生厌。

PDO是数据库连接抽象库,从PHP5.1.0开始提供,提供多种数据库的统一的操作接口。PDO不会转化你的SQL查询或者模拟缺失特性;它只是提供统一的API去连接不同的数据库而已。

更重要的是,PDO允许你绑定SQL查询语句中的变量,而无需担心SQL注入问题,这主要通过PDOstatements和变量绑定来实现。

假设PHP脚本接收一个数字ID作为查询参数,从数据库取回一条记录。下面是一种错误的做法:

另外一个要注意的问题是,如果数据库连接没有隐式地关闭,那么数据库连接数可能会超过数据库服务器的限制而连接失败,这种错误在其他编程语言中比较常见。PDO对象在销毁的时候会隐式的关闭数据库连接,只要你把指向它的引用全部删除即可,如设置为NULL。如果没有,PHP也会在脚本结束时关闭所有非持久化的数据库连接。

很多框架都提供了自己的数据库抽象层,有的是基于PDO,有的不是。它们通过PHP方法来包装实际的查询,能够模拟出只存在于某些数据库系统的特性,给你一个真正的数据库抽象层。这么做会带来一些性能的损失,但是在一个需要支持MySQL、PostgreSQL和SQLite的应用中,这个损失相对于由此带来的代码一致性而言是可以接受的。

PHPhasseverallevelsoferrorseverity.Thethreemostcommontypesofmessagesareerrors,noticesandwarnings.Thesehavedifferentlevelsofseverity;E_ERROR,E_NOTICE,andE_WARNING.Errorsarefatalrun-timeerrorsandareusuallycausedbyfaultsinyourcodeandneedtobefixedasthey’llcausePHPtostopexecuting.Warningsarenon-fatalerrors,executionofthescriptwillnotbehalted.Noticesareadvisorymessagescausedbycodethatmayormaynotcauseproblemsduringtheexecutionofthescript,executionisnothalted.

AnothertypeoferrormessagereportedatcompiletimeistheE_STRICTmessage,thesemessagesareusedtosuggestchangestoyourcodetohelpensurebestinteroperabilityandforwardcompatibilityforyourcode.

异常是大部分流行语言的标准特性,但是PHP开发者却不太重视。其他语言如Ruby极度倚赖异常,在任何错误发生的时候,如HTTP请求失败、DB查询错误,甚至图片资源未找到,都会抛出一个异常,以及时提示那里发生了一个错误。

PHP则对此很宽松,如调用file_get_contents()失败,只是返回FALSE并提示一个warning信息而已。很多老的PHP框架,如CodeIgniter会返回false,然后在自己的日志里记录一个消息,开发者需要使用如$this->upload->get_error()的方式来查看发生了什么错误。这么做需要你自己检查是否有错误,并需要根据不同类调用不同的方法来获取错误消息,而不能让错误明显的显示出来。

这种做法的另外一个弊端是当类自动在屏幕打印一个错误,然后退出进程,阻止了其他开发者动态处理该错误的机会。而异常则是让开发者知道发生了错误,并让他们选择如何处理:

如使用__call()魔术方法,对不存在的方法调用抛出一个thrownewBadFunctionCallException;,既避免了抛出含义模糊的Exception异常,也省去了自定义异常类的麻烦。

EventuallyeveryonebuildsaPHPapplicationthatreliesonuserlogin.Usernamesandpasswordsarestoredinadatabaseandlaterusedtoauthenticateusersuponlogin.

Hashingpasswordswithpassword_hash

InPHP5.5password_hashwasintroduced.AtthistimeitisusingBCrypt,thestrongestalgorithmcurrentlysupportedbyPHP.Itwillbeupdatedinthefuturetosupportmorealgorithmsasneededthough.Thepassword_compatlibrarywascreatedtoprovideforwardcompatibilityforPHP>=5.3.7.

Belowwehashastring,andthencheckthehashagainstanewstring.Becauseourtwosourcestringsaredifferent(‘secret-password’vs.‘bad-password’)thisloginwillfail.

当外部数据被存储合并之后,下次读取时,它们仍然算是外部输入,每次在代码中处理的时候,需要问自己是否已经正确过滤,是否可以信任它们。

数据需要根据不同用处,进行不同的_过滤_,如果把未经过滤的数据输出到HTML页面,它可以在你的网站里执行HTML和JavaScript!即通常说的跨站脚本攻击(XSS)。避免XSS的一个策略就是使用strip_tags函数过滤外部输入的所有HTML标签,或者使用htmlentities/htmlspecialchars转义其中的HTML实体。

另外一个例子是传给命令行命令的选项,这可能非常危险(通常不是一个好主意),不过你可以用内置的escapeshellarg函数过滤命令行的参数。

在创建应用的配置文件时,请遵循下面的业界最佳实践:

提示:从PHP5.4.0开始,register_globals配置已经删除,不再生效。保留这个配置,只是提示依赖该配置的应用进行升级。

错误日志可以帮助追查应用的Bug,但是也会暴露应用的结构信息而产生安全问题,为此,需要在开发环境和线上环境设置不同的配置,防止敏感信息的泄漏。

要在开发环境显示错误提示,需要在php.ini中配置以下配置项:

-1表示显示各种错误,包括将来增加的新错误类型,和PHP5.4中的E_ALL行为相同。

E_STRICT错误级别在5.3.0版本引入,不在E_ALL中,不过5.4.0版本开始,E_ALL包含E_STRICT级别的错误。所以在5.3版本中,要显示所有错误,需要把error_reporting设置为-1或者E_ALL|E_STRICT。

各PHP版本显示所有错误的配置

要在线上环境隐藏错误提示,需要在php.ini中配置以下配置项:

为PHP代码编写自动化测试被认为是一个最佳实践,可以帮助你构建出高质量的应用。自动化测试可以帮助你确认没有因为重构或添加新功能而破坏原有功能,所以应该重视自动化测试。

PHP有多种类型的测试工具和框架可以使用,具体方法各有区别——但是它们的目标都是避免手工测试,满足大型QA组织的需求,保证最新的更改没有破坏已有功能。

目前对应用有多种类型的测试:

单元测试是从编写开始,贯穿于整个开发周期的一种用于保证函数、类和方法的行为与预期一致的编程方法。通过检查各个函数和方法的输入和输出值,你可以保证它们内部逻辑已经正确执行;通过依赖注入、编写mock类和stubs,你可以验证依赖是否已经正确处理,提高测试覆盖率。

在编写一个类或函数的时候,应该为它的每一个行为创建一个单元测试,至少你要保证它收到错误参数时能够触发错误,而参数正确时能正常工作。这可以帮你在后面修改类或函数的时候,确认已有功能仍然正常工作。PHP中var_dump()的功能与此类似,但是它是无法用于创建应用的。

单元测试的另外一个用武之地是在给开源项目贡献代码时,如果你编写一个测试,证明代码存在bug,然后修复代码,让测试通过,这样该补丁被接受的概率要高很多。如果你的项目接受人家的补丁,你应该把单元测试作为项目的一项要求。

集成测试(也称集成与测试,缩写为I&T)是把各个独立模块集成在一起,作为一个整体进行测试的软件测试阶段,它处于单元测试和验收测试之间。集成测试把已经做过单元测试的模块集成在一块,然后运行集成测试用例,最终输出一个可以进行系统测试的系统。

很多单元测试工具同时也可以用于集成测试,并且原理也是相通的。

有时也称为验收测试,使用工具创建自动化的测试用例,然后在真实的系统上运行,这一点与单元测试验证单个模块的正确性和集成测试验证模块间交互的正确性是有区别的,这些工具通常使用真实的数据集来模拟真实用户的使用行为来验证系统的正确性。

除了测试驱动和行为驱动开发框架,还有大量的通用框架和函数库,可以在各种开发方法下使用。

部署PHP应用到线上Web服务器的方式有很多种。

PaaS提供运行PHPWeb应用所需的系统和网络环境,对PHP应用和框架只需要做少量的配置即可。

如果你愿意或想学习系统管理,那么虚拟或独立主机可以让你完全控制自己的运行环境。

PHP非常流行,很少有服务器没有安装PHP的,因而有很多共享主机,不过需要注意服务器上的PHP是否是最新稳定版本。共享主机允许多个开发者把自己的网站部署在上面,这样的好处是费用非常便宜,坏处是你不知道将和哪些网站共享主机,因此需要仔细考虑机器负载和安全问题。如果项目预算允许的话,避免使用共享主机是上策。

Amongthetasksyoumightwanttoautomateare:

Buildtoolscanbedescribedasacollectionofscriptsthathandlecommontasksofsoftwaredeployment.Thebuildtoolisnotapartofyoursoftware,itactsonyoursoftwarefrom‘outside’.

Therearemanyopensourcetoolsavailabletohelpyouwithbuildautomation,somearewritteninPHPothersaren’t.Thisshouldn’tholdyoubackfromusingthem,ifthey’rebettersuitedforthespecificjob.Hereareafewexamples:

ChefresourcesforPHPdevelopers:

Furtherreading:

ContinuousIntegrationisasoftwaredevelopmentpracticewheremembersofateamintegratetheirworkfrequently,usuallyeachpersonintegratesatleastdaily—leadingtomultipleintegrationsperday.Manyteamsfindthatthisapproachleadstosignificantlyreducedintegrationproblemsandallowsateamtodevelopcohesivesoftwaremorerapidly.

–MartinFowler

PHP自身效率很高,但是执行创建远程连接、加载文件等操作时容易出现瓶颈,幸运的是,我们有很多工具来加速这部分操作,或减少这些耗时操作的执行次数。

在一个PHP文件被执行时,它先被编译为字节码(也称opcode),然后这些字节码被执行。如果文件没有修改,那么字节码也会保持不变,这意味着编译这一步白白浪费了CPU资源。

这就是引入字节码缓存的原因,通过把字节码保存在内存中来消除冗余的编译,重用它们完成后续的调用。配置字节码缓存非常简单,而且可以极大地提高应用的执行效率,没有理由不使用字节码缓存。

很多时候,在代码中缓存对象可以带来很大的收益,例如获取代价很大的数据和查询结果很少变化的数据库调用。我们可以使用对象缓存系统缓存这些数据,大大加快后续的同类访问请求。如果你在取得这些数据之后,把它们缓存在系统中,在后续对这些数据的请求中,就可以直接使用缓存中的对象,这么做可以很大的提示系统性能,减少服务器的负载。

很多流行的字节码缓存方案也允许你缓存自定义数据,因此我们更应该充分利用对象缓存功能。APCu、XCache和WinCache都提供API,让你把数据缓存在他们的内存cache中。

使用最多的内存对象缓存系统是APCu和memcached,APCu是很好的一个对象缓存方案,它提供了简单的API来让你把对象存储在内存中,而且配置和使用都非常容易,它的一个缺点是只能在本机使用。Memcached则是另外一种方式,它是一个单独的服务,可以通过网络访问,这意味着可以在一个地方写入数据,然后在不同的系统中访问这份数据。

NotethatwhenrunningPHPasa(Fast-)CGIapplicationinsideyourwebserver,everyPHPprocesswillhaveitsowncache,i.e.APCudataisnotsharedbetweenyourworkerprocesses.Inthesecases,youmightwanttoconsiderusingmemcachedinstead,asit’snottiedtothePHPprocesses.

在单机性能上,APCu通常比Memcached更高,如果你不需要多台服务器或者其他Memcached的高级功能,APCu可能是你的最佳选择。

APCu的示例:

学习更多对象缓存系统:

大量的PHP开发者使用框架,而不是重复发明轮子来创建自己的Web应用。框架抽象出底层通用的业务逻辑,给使用者了提供简单易用的接口。

不是所有的项目都需要框架,有时候原生的PHP就能满足需求,但是需要框架的时候,有三种类型的框架可供选择:

微框架仅是一个包装器(Wrapper),尽量快地把HTTP请求路由到回调函数、控制器或方法上,有些框架也会提供一些函数库,如基本的数据库操作。微框架主要用于构建远程HTTP服务。

全能框架则是在微框架的功能之上提供了更多的功能特性,如ORM,验证组件等。

组件框架则是一组独立功能库的集合,多个基于组件的框架集合在一起,甚至可以用作微框架或者全能框架。

如前所述,组件是另外一种创建、实现和发布开源代码的方式,当前社区存在很多组件库,最主要的两个:

ThePHPcommunityalsohostslargerregionalandnationalconferencesinmanycountriesaroundtheworld.Well-knownmembersofthePHPcommunityusuallyspeakattheselargerevents,soit’sagreatopportunitytolearndirectlyfromindustryleaders.

THE END
1.工作安排提醒的app工作安排提醒软件工作安排提醒app排行现代人的生活每天总是忙忙碌碌的,工作中总是有各种各样的事情需要我们去完成,有时忙得晕头转向时都会忘记一些重要事情,今天小编给大家介绍几款好用的工作安排提醒app,大家可以提前一天将自己的工作合理的安排好,到时间,软件就会即使的提醒大家完成工作,帮助大家合理的安排时间,提高工作效率,养成一个良好的生活工作http://m.downcc.com/k/gzaptx
2.职小灶App官方版下载安装职小灶手机版下载v3.5.7安卓版职小灶app是一款十分实用的学习软件。职小灶app为用户提供大量学习资源平台,职业技能学习,所涉及行业范围之广,丰富真题模拟试卷,珍贵学习视频,用户根据自己的工作职称检索相关资料,综合测试查看自己刷题时间和情况。 职小灶软件介绍 该app专注于核心通用能力、职场关键技能,学习一些关于职场上面的技能小信息还是很不错,毕竟http://www.onlinedown.net/soft/10064527.htm
3.办公软件APP下载办公软件手机版办公软件大全用手机办公,不仅能够节约时间,最主要是便捷,本站整理了一些好用的办公软件APP下载,专为出行时的工作而打造,欢迎挑选使用.https://www.qqtn.com/key/bgrj/
4.程序员必备的16款神器软件,从零基础到精通,收藏这篇就够了!在数字化时代,程序员扮演着举足轻重的关键角色。他们的工作绝非仅仅局限于编写代码,而是在创造充满无限可能的全新世界。 为了让这一创造过程变得更为高效和令人愉悦,精心挑选适合自身的开发工具及软件显得尤为重要。 今天,我要为大家倾心介绍一系列令程序员视若珍宝、爱不释手的开发必备软件。这些软件的强大之处不仅在于https://blog.csdn.net/leah126/article/details/144411650
5.教育团队协作办公软件大赏!J人备考的得力助手在哪方?板栗看板以其简洁高效等特性成为 J 人在教育教培团队协作与个人备考的得力助手。国外的 Trello、Asana、Monday.com、Wrike 和 ClickUp 也凭借各自独特功能,在不同方面满足教育团队与个人学习者的多样化需求。J 人可根据自身团队规模、教育项目复杂度以及个人学习习惯等因素综合考量,选择最适配的办公软件,从而在教育工作https://www.imooc.com/article/373959
6.如何选择十大最实用的免费软件从办公效率工具到多媒体处理,再到隐私保护工具,每一款软件都有它独特的优势。选择合适的免费软件,不仅能帮助我们节省资金,还能提升我们的工作和生活品质。希望这篇文章能为你提供一些有价值的参考,帮助你在日常生活中更加高效、便捷地使用各种软件工具。http://www.sunworld-tech.com/zixun/9ed09d89d2.html
7.不收费的十大免费好用的软件:这些软件让你的工作和生活更加高效生活中的实用助手 除了工作上的应用,这些免费的软件同样可以改善我们的日常生活,让生活变得更加便捷。 Canva Canva是一款在线设计工具,即使没有专业设计背景的人也能轻松制作出精美的图文内容。从社交媒体海报到简历模板,各种设计需求都能得到满足。许多小企业主表示,他们依靠Canva完成市场推广材料,而无需雇佣专业设计师。https://www.houseware.vip/gljh/77351.html
8.基础工作小助手手机app基础工作小助手手机app下载v5.6基础工作小助手手机app是一款专为基层工作人员设计的办公助手软件,旨在帮助用户高效管理人口信息、流动人口、出租房屋等数据。该软件支持在手机上录入详细的人员信息,方便社区工作者、公安民警等人员随时随地记录和整理社会信息,提高工作效率。其操作简便快捷,数据留存完整,全面助力城县流动人口等信息化采集及服务管理工作走向https://m.crsky.com/soft/734387.html
9.基础的办公软件有哪些APP推荐基础的办公软件有哪些下载WPS Office是一站式AI智能办公助手,支持移动和电脑多端协作,全端无广告,帮你高效完成文档智能创作和润色、PPT高效制作、PDF文档阅读和编辑、文件拍照扫描,稻壳模版库支持海量模版,覆盖丰富办公场景。安卓端办公软件,个人版免费使用用户多:全球用户600,000,000排名高:全球APP总榜同类产品榜首体积小:只安装一个应用即可打https://www.wandoujia.com/bangdan/1248197/
10.APP性能分析工作台——你的最佳桌面端性能分析助手App 性能分析工作台是由火山引擎 MARS-APMPlus 团队打造,是一款 App 性能和稳定性的测试与归因分析的桌面端助手,为开发者提供本地开发调试工具。通过丰富的可视化插件,分析手机中的 App 异常崩溃和性能数据。 目前MARS-App 性能分析工作台版本为开发者提供 Fastbot 桌面版的服务。并基于 Fastbot 原生功能的基础上,https://xie.infoq.cn/article/2ade91695db9e2dacd054663b
11.莆田学院附属医院智慧服务应用建设(一)期项目附件10.1、招标公告的公告期限:自财政部和福建省财政厅指定的政府采购信息发布媒体最先发布公告之日起5个工作日。 10.2、招标文件公告期限:招标文件随同招标公告一并发布,其公告期限与招标公告的公告期限保持一致。 11、采购人:莆田学院附属医院 地址:莆田市荔城区东圳东路999号 http://www.ptzfcg.gov.cn/upload/document/20220419/42cbf932c05048548c1b2893e6dd2fc3.html
12.智慧消防系统消防物联网系统智慧消防物联网监管平台APP中具有设置维保检测操作功能,设置维保检测时可选择维保检测的消防系统、维保结束时间,具有维保自动解除功能以及可选择维保人员,维保结束后平台自动生成维保报告,维保报告中需展示维保检测的详情(操作人员、时间、维保地址、维保用时、维保人员、维保描述、服务概况等),联动的消防系统与联动的点位信息,以及对维保工作的http://119.gdliontech.cn/news/268.html
13.最全详解!红外热成像仪的工作原理使用缺陷模式区别救援应用因此,消防员在日常操练时,都配备红外热成像仪,多加观察不同情况时的显像机影像,有助加强的画面、事物、距离、空间大小和间隔等的判断,在实际使用时便更有信心和得心应手。 -- END -- 投稿、交流、加群、寻求资料请添加 战训营小助手 ↓↓↓https://www.rcxy.com.cn/news/show-11935.html
14.语音识别技术基础理解语音识别是怎么工作的呢?实际上一点都不神秘,无非是: 第一步,把帧识别成状态(难点)。 第二步,把状态组合成音素。 第三步,把音素组合成单词。 如下图所示: image.png 图中,每个小竖条代表一帧,若干帧语音对应一个状态,每三个状态组合成一个音素,若干个音素组合成一个单词。也就是说,只要知道每帧语音对应https://www.jianshu.com/p/9888d593f1b1
15.今年备考注册测绘师?!2023注册测绘师零基础三科全程课如果符合条件那小助手推荐您学习麦街网的2023年注册测绘师零基础全程班。 斑点牛(金牌讲师,致力于注册测绘师专业知识培训服务) 夏春林(博士,教授,硕士生导师)授课 针对零基础一步步学习,腾讯课堂在线直播和视频回放,随时看随时学还不耽误工作。 2023零基础全科班 https://www.shangyexinzhi.com/article/6583227.html
16.任务1Web前端工程师职业前景与开发流程HTML5CSS3Web前端设计基础教程(吴丰 第3版)教案全套-教学设计 任务1 Web前端工程师职业前景与开发流程---任务22 Web App页面的设计与实现.docx 关闭预览 HTML5CSS3Web前端设计基础教程(吴丰 第3版)教案全套-教学设计 任务1 Web前端工程师职业前景与开发流程---任务22 Web App页面的设计与实现.docx 原文免费https://max.book118.com/html/2024/0607/8067012107006076.shtm
17.头条文章(二)、基础设施投资领域业务机遇分析 1、继续做好专项债发行及配套融资工作 (1)、2023年专项债发行情况分析 (2)、专项债发行流程和项目包装重点分析 3人成团,每位优惠300元。更多优惠信息, 详询小助手:18221078897 添加小助手了解更多 手机号:18221078897 微信同上?https://m.weibo.cn/ttarticle/p/show?id=2309404927071708381245
18.AI潮流势不可挡,手机格局或将迎来洗牌?(1)潜伏期,早期智能语音助手背后的语音识别和自然语义理解、知识图谱等AI技术开始为手机赋能; (2)预热期,智能相册分类、APP预加载、智慧美颜、AR视频指纹解锁等AI应用广泛地落地在手机场景; (3)萌芽期,人工智能手机的元年以移动端AI芯片为核心的底层算力成熟落地; https://maimai.cn/article/detail?fid=1838116937&efid=zEuL4wtdXU2g-DaYSx-4Ew
19.智能客服平台,全链路在线沟通实时掌握客户意向多个公众号或网站、APP等,不能统一提供服务? 火烈云在线客服系统可以接入多个公众号多个网站多个APP,统一服务只需要登录一个客服工作台。 聊天记录无法同步,换设备登录工作交接困难? 火烈云在线客服系统聊天记录都在云端储存,更换任何设备登录都能够实时同步所有聊天记录,电脑手机同时登录都能够实时保持聊天记录一致。 https://www.xshangyun.com/help/detail/2881
20.头条文章(扫码添加小助手微信,根据引导获取完整版资料) 2022年12月末,银保监会下发《关于做好2023年银行业非现场监管报表填报工作的通知》(银保监发〔2022〕34号),对1104报表进行更新。1104报表作为监管机构对金融机构持续有效监管的核心工具,贯彻落实了“管法人、管风险、管内控、提高透明度”的审慎监管理念及“风险为本”的https://card.weibo.com/article/m/show/id/2309404864277663318035
21.基础教育机构信息公开今年年检,新增了办学方向和办学理念、国际课程整合能力情况、以素养为导向的育人实践、教育数字化转型探索、教学模式创新的实践、面向高质量发展的教育治理等六大板块内容,时间紧,任务重,但是得到了相关老师的支持,陶思媛老师担任我和沈燕芸老师的小助手,帮助我们将各部门上传的资料进行审查,文档整理,完成速度快,质量高https://xxgk.mhedu.sh.cn/fwxxgk/detail.jsp?id=71441
22.喜德盛RS380颜值在线入门公路,这个配置多少可以入手@DOU+小助手突突突摩托工作室25万次播放 01:14 确定了 明年汽车补贴力度加码 扩大人群 持续有效 鬼斗车19万次播放 05:10 德味儿新能源一汽-大众ID.4 CROZZ 还得是欧系的底子 音速大梦11125万次播放 08:24 世界极寒之地雅库茨克过冬,今天把庇护所大门做好,瞬间暖和多了 868黑娃黑妹31万次播放 05:31 看似平平无奇的零跑C1https://www.dongchedi.com/video/7213378315313381948
23.美友圈管理团队管理手册(3)虚构、捏造、恶意诽谤、抹黑美篇官方/官方工作人员、美友; (4)以任何形式向美友索取现金或具有现金价值的礼品等。 美篇有权撤销其主持人/管理员身份。 4、除规则、通知、公告类内容外,主持人/管理员不得抄袭、盗用他人作品(文字、图片、音/视频),不得在此基础上滥用原创标记,不得将他人创作占为己有。以上https://www.meipian.cn/39p8yu0o
24.初级口语教程(MP3附字幕)Part93:谈论工作初级英语口语时间:2009-12-22 13:54:45 来源:可可英语 编辑:echo ? 可可英语APP下载 | 可可官方微信:ikekenet 字号:大 | 中 | 小 评论 打印 收藏本文 下载MP3到电脑 批量下载MP3和LRC到手机 null93 Talking About Work 谈论工作 What kind of job have you had? 你做过什么工作? A:What kind of job have youhttps://www.kekenet.com/kouyu/200912/92757.shtml
25.党建工作总结范文十五篇加强对青年干部的培养、教育和管理工作。利用干部培训班、挂职煅炼等不同的形式多层次、全方位地对青年干部进行培训。通过培养和教育,青年干部的素质明显提高,他们逐步成长为;懂全局、议大事、精业务;的优秀年轻干部。 三、坚持了以党建带团建,当好机关党委的小助手https://gxxing.cn/shiyongwen/188662/
26.图书馆工作总结必备15篇所以,这个学期,我们实行了分书到班的制度,每个班级一个图书管理员,四名图书小助手。在每个星期的星期一,图书管理员带领图书小助手来图书馆借书,根据班上人数借多少本书。图书到班后,由图书管理员负责图书的管理,破损班上自我修补,如有丢失,由丢失的那个学生照价赔偿。退书时间为第二个星期的星期四。https://www.qunzou.com/gongzuo/1622725.html