如何在远程服务器上的php中实现脚本执行管理器

时间:2012-02-14 22:39:05

标签: php curl real-time scheduling

我正在尝试构建一个服务,它将以特定的时间间隔从Web收集一些数据,然后解析这些数据,最后解析结果 - 执行专用程序。服务运行的典型示意图:

  1. 要更新的请求项目列表
  2. 下载所列项目的数据
  3. 查看尚未更新的内容
  4. 更新数据库
  5. 过滤包含更新的数据(仅获得最高优先级更新)
  6. 执行一些程序来解析更新
  7. 过滤包含更新的数据(仅获得中等优先级更新)
  8. 执行一些程序来解析...... ... ...
  9. 如果没有那么多数据需要更新,那么一切都会很简单。 需要更新的数据太多,从1到8(可能除1之外)的每一步都会因为限制60秒的最大执行时间而失败。即使有增加它的选项,这也不是最佳选择,因为项目的主要目标是首先提供最高优先级的数据。不幸的是,定义信息的优先级是基于获取所有数据的大部分并在已存储的数据和传入(更新)数据之间进行大量比较。

    我可以从服务速度中退出,以便至少获得高优先级更新,并等待所有其他更新时间。 我想写一些父脚本(管理员)来控制服务的每一步(1-8),也许是通过执行其他脚本? 经理应该能够恢复未完成的步骤(脚本)以完成它。可以用这种方式编写每一步,它将执行一小部分代码,并在完成后标记这一小部分工作,如SQL DB中所做的那样。在经理恢复之后,步骤(脚本)将继续形成由于超过max exec而被服务器终止的点。时间。

    已知平台限制: 远程服务器,不可更改的最大执行时间,通常限制同时解析一个脚本,缺少对许多apache功能的访问权限,以及远程服务器常见的所有其他限制

    要求: 某种类型的管理器是强制性的,因为除了调用特定脚本之外,这个父进程还必须写一些关于软件激活的脚本的注释。

    管理员可以通过crul调用,一分钟间隔就足够了。不幸的是,在这里不能选择卷曲每个服务步骤的调用列表。

    我还考虑为每个服务步骤获取新的远程主机,并由另一个远程主机控制它们,这些主机可以调用它们并要求使用ie SOAP来完成它们的工作,但是这个场景是我希望的解决方案列表的末尾,因为它不能解决最大执行时间问题,并且通过全局网络进行大量数据交换是最慢的数据处理方式。

    有关如何实施解决方案的任何想法?

1 个答案:

答案 0 :(得分:0)

我不知道自己的步骤2和3如何在60秒内执行。如果您对第2步使用curl_multi_exec,它将在几秒钟内运行。如果你在第3步让你的脚本超过60秒,你会得到“超出内存限制”而不是更早。

所有这些都让我得出结论,该剧本非常未经优化。解决方案是:

  1. 将任务分解为(a)更新内容并将其保存在数据库中(比如标志1表示更新内容,0表示不更新); (b)循环遍历需要更新的行并更新它们,将标志设置为0.在约50秒时关闭(假设脚本每隔几分钟运行一次,这将有效)。

  2. 获取第二台服务器并使用适当的执行时间将其设置为运行脚本数小时。由于它可以访问您的第一个数据库(而不是通过http调用),因此不会增加主要流量。