软件开发公司PHP应用程序长时间使用的操作优化的7种方式_北京软件开发公司
发表日期:2015-08-31 15:36:46 文章编辑:宜天信达 浏览次数:
软件开发公司7种方式的PHP应用程序使用的长时间运行的操作优化
照片史葛比尔
今天我要谈一谈优化长期运行PHP操作基于较近的一个项目,我们已经成功地完成了在这里的可能途径azoft Web开发部门我们的经验将有助于Web开发人员想要顺利工作的PHP应用程序即使任务是不断发展变化的过程中。
本文没有涵盖所有可能的解决方案,它只是旨在概述选项可以使用面对长时间运行的操作 问题,节省你的时间。
项目概述
以下技术进行项目:
MVC框架CakePHP 2.1(PHP5.3)
MySQL
jQuery
jQuery UI
jQuery插件
硒的服务器
CentOS
目标
的目标是开发了一个原型一个系统的未来。事实上,这是一个试点项目,其规格和优先发展过程中经常改变。因为这个原因,它预测在早期阶段,本项目系统将包含冗长的PHP操作相当困难。
问题
事实证明,这样的操作导致在后来的发展阶段的一个主要挑战:
这样长的操作阻塞其他操作在同一个会话。
通过系统链接导航整个过程变得不可能直到长操作完成。
有了这些问题在一个较低的水平,我们发现,直到操作完成和会话数据刷新到会话文件因此消除堵塞,所有其他的要求必须在排队耐心等待。
事实上,在PHP中存储会话的默认方法是在一个文件中存储。当一个会话打开的功能,如fopen()被激活,阻断阅读和其他进程写文件。
的时候,请求和导航通过链接被封锁期间,用户不知道发生了什么的那一刻,当操作就完了,是否有一些错误。
解决这一问题的途径
1。将操作步骤
第一个解决方案,可能会想到是将长到短的操作步骤。当完成每一步并将结果传送到用户的浏览器,浏览器会自动启动下一步,发送相应的请求到服务器。
在上下文中的特定的项目,这种方法并不成功,长期以来几乎可分步骤操作。此外,在我们的项目中我们使用的第三方服务在服务器上运行,工作,需要创建和编写相应的对象的请求处理期间。后处理的要求,通过对操作的第一步,该对象被杀。
2。Ajax轮询
面对冗长的PHP操作的另一种方法是在服务器上启动等操作不断轮询操作状态更新服务器通过发送一系列的Ajax请求在一定的时间间隔。对于客户端,我们可以分析服务器的响应(例如这可能是JSON的“消息”,含有“百分比”,“错误”和“重定向”)并创建一个进度条,显示当前操作的状态。
在我们的项目中,我们尝试使用这种查询方式采用两种不同的方法来存储和操作的结果:
在一个文件中存储结果< > + <运行> session_id txt。
在相应的表格数据库中存储结果lengthy_operations
用户开始运行Ajax请求。然后,客户端脚本定期轮询服务器并接收到更新当前操作:
view plaincopy to clipboardprint?
<trans data-src="/operations/get_status/">/操作/ get_status /</trans><operation_id></operation_id>
然而,在这里我们遇到了另一个问题:当冗长操作开始了会议文件,从而消除了处理并发请求的可能性在同一会话。换句话说,在漫长的手术开始了,应该是被轮询服务器必须在队列中等待的主要要求是完成会话文件的请求。
为了解决这个问题,我们的目标是打开会话文件。为了做到这一点,我们利用了一个PHP函数–session_write_close(),可以结束当前会话和存储会话数据。事实上,它是可能的发射操作,读取会话的数据,将数据更改,并禁用写会话文件权限。
然而,在实践中,我们没能为我们做的这个项目。考虑到现有的架构,有必要在冗长操作的地方太多的会议记录。此外,这样的解决方案不会被认为是“干净”的,因为用户可能想浏览整个网站可能推出另一个耗时的操作在同一时间。因此,我们需要找到一个替代。
另一种是改变会话存储,允许使用会话没有阻止它在打开。在选择一个新的会话存储,有几个选项:
MySQL数据库
MongoDB
memcached
为了在PHP会话存储变化,有设置会话存储–会话的用户函数的特殊功能。save_handler()。这些用户的功能是用于存储和检索数据,与会话相关联的。事实上,功能save_handler()会话。可以用在许多不同的情况。有 甚至类可用于传送会话到数据库或缓存。
而工作对我们的项目,我们尝试用MySQL和MongoDB为会话存储。
注:让我们说你记录的参数到会话,你需要的是立即可用的其他要求。在这种情况下,你应该“冲洗”会话到MySQL或MongoDB,因此让会议记录工作。要做到这一点,你需要禁用编辑权限,然后重新打开它。
会话存储改变。无阻塞会话。
从客户端,Ajax请求开始启动运行。
一系列的轮询请求来更新状态和进度条。
一个单独的组件被创建的管理操作。
3。长轮询
这种方法类似于Ajax轮询,但有一个本质的区别。在Ajax轮询,客户端轮询服务器发现如果发生任何变化,但在长轮询方式的服务器发送一个信号到客户端时出现任何变化。这是说,长轮询方式需要服务器和客户端之间的Cф稳定的网络连接。这种方法的优点是减少客户端和服务器之间的流量。
的工作原理。你可以这样想:客户端脚本调用服务器说,“如果数据出现,我就可以把它从你的马上,之后我再次与你联系”。在一些服务器实现有缓冲当服务器不给数据立即,等待,如果出现别的吧,我会把所有的数据一次”。然而,这样的缓冲是有害的因为它导致的延误,我们想达到的较大速度!
浏览器接收数据应该再次打开新的连接之后。在理论上,这种连接可以持续几个小时。但通常有更少的时间较多5分钟之后,一个新的连接被创建。这样做的原因是,服务器不喜欢持久的会议,和HTTP协议是不适合使用。
对于我们的项目在手,我们认为这种方法但没有结束使用它。
4。永远的iframe
我们试着用这种方法在我们的项目。
的工作原理。首先,我们应该建立HTTP服务器和PHP,这样他们就可以操作执行时发送数据的部分。然后创建一个隐藏的iframe标签页。标签将逐步呈现的信息或执行操作的进展。
客户端将使用iframe标签初始化操作。在服务器端的操作将数据部分和立即发送到iframe执行发送响应客户端的响应。
5。流
这是另一种方法,我们尝试在我们的项目。
这个想法是为了初始化操作通过Ajax请求,而服务器会在部分发送数据,即数据流。这样,接收数据部分后,它可能是一些事件可能在客户端发生。使用这样的事件,我们可以更新相应的数据块和数据加载显示操作进度。
使用这种方法,首先我们需要在特定的方式设置Apache服务器、PHP。我们搜索了关于网络设置的信息和使用前进行一些测试。较后,设置如下:
然后我们写了一个组件,这种方法可能会使。
更详细的分析结果证明这种方法是不适合我们的特定项目后。这是事实,有在客户端可以对Ajax请求信号后接收数据的部分没有事件,发送。这会在事件是在客户端工作只有数据是完全作为一个整体。
6。彗星服务器
维基百科说,彗星是一个Web应用程序模型中,长期持有的HTTP请求允许web服务器推送数据给浏览器,浏览器请求不明确。
这种模型的一个共同的特点,就是他们都不是基于专有插件,但通过浏览器直接支持的技术,比如JavaScript。
在这个项目中我们测试的dklab realplexor Comet服务器。
下面是定义dklab realplexor将根据本项目的官方站点。
dklab realplexor是彗星的服务器可以处理1000000 +并行长期持有的HTTP连接用户的浏览器。在浏览器中运行的JavaScript代码在一个或几个realplexor订阅的渠道,建立一个数据接收处理程序。服务器可以在任何时候在这些渠道之一写入消息。然后消息会立即传递给所有用户–是否一个或在服务器上的较小负荷实时模式千。
7。WebSockets
我们还讨论了使用WebSockets的可能性。
维基百科说,WebSocket是Web技术在一个TCP连接提供全双工通信信道。它是用于浏览器和Web服务器之间的实时信息交换。
但我们拒绝了这个方法,它不是旧浏览器的兼容。
总结
因此,我们解决的问题,采用轮询的方法传递会话MongoDB。
然而,进一步的讨论和在长时间运行的任务以及它们的复杂性导致了更多的标准和可靠的解决方案的使用量的增加:用cron执行操作的队列的实现(命令运行)。
事实上,在执行操作后检查我们可以序列化operationcontext并保存在数据库中的所有权利:图表cron_tasks。服务器将在特定的时间间隔运行的cron的外壳,这将从队列中取下一个任务,改变其状态in_progress递给随之而来的处理程序(taskdispatchercomponent)。该处理程序将序列化的任务上下文并执行它在独立的进程。请注意,处理程序可以访问所有的系统模型和组件。
找出执行任务的进展,你可以使用Ajax轮询和长轮询,以及在一个单独的显示组织任务队列的概述。这种方法已被软件开发公司证明是较可靠的和可以理解的,尽管它需要一些变化的系统架构。