在开发PHP应用程序的过程中,您可能会遇到需要与远程资源或服务交互的情况。为了扩展应用程序的功能,您可以使用各种API服务来获取远程数据、连接其他网站的用户帐户或转换应用程序共享的资源。ProgrammableWeb网站指出,目前网络上已有超过一万个API可用,因此您可以找到许多服务来扩展PHP应用程序的功能。但是,不正确地使用API可能会迅速导致性能问题并延长脚本的执行时间。如果您希望避免这种情况,请考虑实施本文中介绍的一些解决方案。
典型的PHP脚本按顺序执行代码中的命令。这看起来很合乎逻辑,因为您可能希望获得先前操作的结果(例如数据库查询或变量操作)才能继续执行脚本的下一步。当您进行API调用时,相同的规则也适用。您必须发送请求,等待来自远程主机的响应,然后才能对接收到的数据执行任何操作。但是,如果您的应用程序进行多个API调用,并且您需要来自每个来源的数据才能继续执行,则不必分别执行每个请求。请记住,负责处理API调用的服务器已准备好一次处理多个查询。您需要做的只是创建一个脚本,该脚本并行执行API调用,而不是一个接一个地执行。幸运的是,PHP提供了一组curl_multi
函数,这些函数旨在执行此操作。
使用curl_multi
函数类似于使用cURL库在PHP中进行典型的请求。唯一的区别是,您需要准备一组要执行的请求(不仅仅是一个),使用curl_init
函数并将其传递给curl_multi_add_handle
函数。然后,调用curl_multi_exec
函数将同时执行请求,而curl_multi_getcontent
将允许您获取每个API调用的结果。请阅读此处以查看实现所述逻辑的代码示例。
如果您想在PHP应用程序中使用curl_multi
函数,有一些重要的注意事项。首先,curl_multi_exec
函数的执行时间将与传递给curl_multi_add_handle
函数的请求集中最慢的API调用的时间一样长。因此,当每个API调用花费的时间大致相同时,使用curl_multi
才有意义。如果curl_multi
集中有一个请求明显慢于其他请求,则您的脚本将无法继续执行,直到该最慢的请求完成。
同样重要的是,您需要确定一次可以执行的并行请求数。请记住,如果您的网站处理大量流量,并且每个用户都触发对一个远程服务器的并发API调用,则一次执行的请求总数可能会很快变得很高。请务必检查API文档中说明的限制,并了解当您达到这些限制时服务将如何响应。当您达到限制时,远程服务器可能会发送特定的HTTP响应代码或错误消息。您的应用程序应正确处理此类情况,或将其放入日志中,以便您可以诊断问题并减少请求数量。
如果您希望保持Web应用程序的响应能力并避免提供加载缓慢的页面,则大量对远程服务器进行的API调用可能会使这项任务变得更加困难。如果所有请求都在应用程序主流程中进行,则在PHP脚本接收API响应并处理数据之前,最终用户将看不到呈现的页面。当然,有很多API服务托管在快速的服务器上,并且可以快速处理请求。但是,您的应用程序仍然可能会偶尔因连接延迟或影响连接过程或远程服务器本身的一些随机因素而减慢速度。
如果您想保护最终用户免受此类问题的影响,则需要将负责处理请求的应用程序部分与主流程分离到一个独立的脚本中。这意味着API调用将在一个单独的线程中执行,该线程不会干扰负责显示站点的代码部分。
要实现此类解决方案,您可以编写一个单独的PHP脚本并使用exec()
函数执行它,就像执行任何命令行应用程序一样。不同的PHP框架通常提供简化编写命令行脚本并允许您将其轻松集成到现有应用程序模型或组件中的模块。只需检查Symfony2或CakePHP控制台组件即可查看一些示例。各种PHP平台(不仅仅是框架)也可能提供使编写命令行脚本更容易的工具,例如WP CLI(WordPress的命令行界面)。
如果您正在寻找一种更强大的方法来在单独的进程中处理API调用,请考虑设置一个作业服务器,例如Gearman。作业服务器是一个完整的解决方案,它执行将特定任务(作业)分离到独立进程所需的所有操作。阅读Alireza Rahmani Khalili的《Gearman入门》文章,了解其工作原理以及如何在PHP中实现它。如果您在Zend Server平台上工作,则可以使用Zend Job Queue组件,该组件提供类似的功能。Alex Stetsenko撰写的《使用Zend Job Queue进行调度》文章中描述了其功能和用法示例。
无论您选择哪种分离API调用的解决方案,您都必须考虑应用程序的不同部分如何相互通信。首先,您应该将从API调用接收到的数据放在应用程序的整个部分都可以访问的地方(例如数据库表或文件)。您还必须共享单独脚本执行的状态。主应用程序必须知道外部执行的API调用是否正在进行中,是否很久以前已完成或是否失败。如果您考虑使用作业服务器解决方案,它可能会提供监视作业状态的功能。但是,如果您只想坚持编写简单的PHP命令行脚本,则必须自己实现此类逻辑。
多个HTTP请求还是多个线程?
那么,哪种解决方案更好——使用curl_multi
函数一次执行多个HTTP请求,还是将API调用与应用程序主流程分离?这取决于查询远程服务器的上下文。您可能会发现,整个API调用处理脚本花费的时间很长,这不仅是因为进行了请求。还可能存在大量负责处理接收到的数据的代码,尤其是在处理转换文件或进行大量数据库写入时。在这种情况下,使用curl_multi
函数可能不足以加快应用程序的速度。运行负责整个操作的单独线程以及处理从远程主机接收到的数据,可能会在应用程序性能方面获得更好的结果。另一方面,如果您需要执行许多简单的API调用,而这些调用不涉及您这边的繁重数据处理,则坚持使用curl_multi
函数可能足以使您的应用程序更快。
当然,还有一种第三种解决方案——混合上述两种方法。因此,您可以运行一个负责处理API调用的单独线程,然后尝试通过一次发出多个请求来使其运行得更快。这可能比为每个请求执行单独的脚本更有效。但是,它也可能需要更深入地分析如何设计脚本的流程,以便不同的脚本执行和一次执行的不同API调用不会相互干扰,也不会重复彼此的工作。
加快严重依赖API使用的应用程序的另一个解决方案是构建智能缓存引擎。它可以防止您的脚本进行不必要的调用,因为位于不同服务器上的内容没有更改。正确的缓存还可以减少单个API调用中服务器之间传输的数据量。
要编写一个正常工作的缓存引擎并返回有效数据,您需要确定远程服务器的响应不变,因此无需每次都获取它。这可能因特定的API服务而异,但总体思路是找到一组参数(这些参数正在请求中传递),这些参数在给定的时间段内会给出相同的响应。例如,如果您从远程服务获取每日货币汇率,您可以确定给定货币(这是参数)的汇率在一天内保持不变。因此,用于存储从此特定API接收的数据的缓存密钥必须同时包含货币和日期。如果您的应用程序下次必须获取此特定汇率,您可以参考缓存中保存的数据(例如数据库或文件),并避免进行HTTP请求。
上述场景假设您的应用程序承担检查远程服务接收的数据可以缓存的情况的所有责任,因此您需要自己实现正确的缓存逻辑。但是,也有一些情况是API服务跟踪其共享数据的更改并返回包含与特定资源链接的元数据的附加字段。元数据可能由诸如上次修改日期、修订号或基于资源内容计算的哈希值之类的值组成。使用此类数据可以成为提高PHP应用程序性能的好方法,尤其是在处理大量数据时。您不必每次连接API时都获取整个资源,而只需将时间戳或哈希值与上次收到的值进行比较即可。如果它们相等,则仅表示您可以使用之前获取的数据,因为远程内容没有更改。此类解决方案假设您确实在应用程序中使用了缓存引擎,但您无需担心缓存中存储的数据是否有效。由于您依赖API服务返回的元数据,您只需要比较远程服务器提供的元数据值即可。
使用远程资源元数据在使用文件托管服务API时尤其有利。处理远程文件夹和文件通常意味着传输大量数据,这可能会导致性能问题。为了举例说明如何避免这种情况,让我描述在Dropbox API中使用的解决方案。Dropbox API服务返回应用于检查远程文件是否已更改的特定数据。首先,元数据方法(返回文件夹和文件信息,例如其名称、大小或路径)包含表示返回资源的哈希值的哈希字段。如果您在新的请求中提供来自先前请求的哈希值作为参数,并且远程数据在请求之间没有更改,则API将只返回HTTP 304(未修改)响应。Drobox API还提供delta方法,该方法专门用于告知特定文件夹或文件的更改。API文档中建议使用哈希值和delta方法,因为它可以显着提高应用程序的性能。
这听起来可能很明显,但在某些情况下,仔细阅读API文档可能会为您提供一些关于如何更有效地进行API调用的具体解决方案。上面描述的Dropbox API用法就是一个非常清晰的例子。但是,可能还有其他方法可以减少响应中传输的数据量(例如,选择API返回的少数几个特定字段,而不是接收整个数据集)。您还可以检查您在单独请求中执行的操作是否可以一次执行。例如,Google Translate API的翻译方法(用于获取不同语言的文本翻译)可以在一个请求中返回多个翻译。通过在一个API调用中传递一些要处理的文本字符串,您可以避免进行多个请求,这可能会节省一些应用程序执行时间。
如您所见,有很多方法可以提高严重依赖使用远程API的PHP应用程序的性能。您可以一次执行多个请求——或者使用curl_multi
函数,或者运行单独的应用程序线程。另一个解决方案是实现一个缓存引擎,它可以防止您进行不必要的API调用或减少服务器之间传输的数据量。最后,API服务提供的方法可以为您提供一些开箱即用的解决方案来提高性能,例如在一个请求中执行多个操作。
我希望这篇文章能为您提供一些关于如何有效处理API请求的见解。如果您对文章中提出的要点或其他关于如何加快使用API速度的技巧有任何意见,请随时在下方发布。您也可以通过Google Plus直接联系我。
API性能受多种因素影响。首先是服务器的处理速度,它决定了服务器处理请求和返回响应的速度。网络延迟(即数据从客户端到服务器再返回所需的时间)也起着重要的作用。其他因素包括API代码的效率、服务器上的负载以及API使用的数 据格式。优化这些因素可以显著提高API性能。
有几种策略可以优化您的API以获得更好的性能。首先,您可以使用高效的编码实践来减少服务器上的处理时间。其次,您可以使用内容分发网络 (CDN) 来减少网络延迟。第三,您可以使用缓存来存储频繁访问的数据并减少服务器上的负载。最后,您可以使用数据压缩来减小传输的数据大小,从而减少发送和接收数据所需的时间。
使用API意味着在您的应用程序中使用第三方提供的API。这包括向API发送请求和处理响应。API提供了一组函数,您的应用程序可以使用这些函数与API表示的系统或服务进行交互。
有几种方法可以加快应用程序的API使用速度。首先,您可以使用异步调用来防止阻塞主线程。其次,您可以使用分页来限制API返回的数据量。第三,您可以使用缓存来存储频繁访问的数据并减少对API的请求次数。最后,您可以使用数据压缩来减小传输的数据大小,从而减少发送和接收数据所需的时间。
内容分发网络 (CDN) 在提高API性能方面起着至关重要的作用。它通过将内容分发到位于不同地理位置的多个服务器来减少网络延迟。当客户端发送请求时,CDN 会将其定向到最近的服务器,从而减少数据从客户端到服务器再返回所需的时间。
缓存通过将频繁访问的数据存储在缓存中来提高API性能。当客户端发送数据请求时,服务器首先检查缓存。如果数据在缓存中,服务器会立即返回它,从而减少处理时间和服务器上的负载。如果数据不在缓存中,服务器会从数据库中检索它,对其进行处理,并将其存储在缓存中以供将来的请求使用。
数据压缩通过减小传输的数据大小来提高API性能。这减少了发送和接收数据所需的时间,从而提高了API的速度。在处理大量数据时,数据压缩尤其有利。
使用API的最佳实践包括使用异步调用来防止阻塞主线程,使用分页来限制API返回的数据量,使用缓存来存储频繁访问的数据,以及使用数据压缩来减小传输的数据大小。
您可以使用各种指标来衡量API的性能,例如响应时间、错误率和吞吐量。响应时间是API返回响应所需的时间。错误率是导致错误的请求的百分比。吞吐量是API每单位时间可以处理的请求数量。可以使用API监控工具来衡量这些指标。
API性能对用户体验有重大影响。如果API速度慢,则会导致加载时间慢,这可能会让用户感到沮丧并导致他们放弃应用程序。另一方面,快速且响应迅速的API可以提供流畅且令人愉悦的用户体验。因此,优化API性能对于改善用户体验至关重要。
以上是如何加快应用程序的API消耗量的详细内容。更多信息请关注PHP中文网其他相关文章!