Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 负载平衡服务器(群集)上的文件处理_Php_Networking_Amazon S3 - Fatal编程技术网

Php 负载平衡服务器(群集)上的文件处理

Php 负载平衡服务器(群集)上的文件处理,php,networking,amazon-s3,Php,Networking,Amazon S3,我在集群服务器上的PHP中有应用程序。它从服务器上的aws bucket复制文件(解压文件。使用itext java将PDF转换为XML,读取XML并将数据保存到数据库),然后将处理后的文件上载回bucket 它可以很好地用于单个实例,但在多个实例的负载平衡中,服务器上进程下的文件将消失。 我不能直接从bucket处理文件,因为我不能在bucket上解压缩它,也不能在bucket上运行jar文件。所以我必须存储文件 临时处理。有没有办法处理这种情况一些可能的解决方案: 使用中心单键值存储(数据

我在集群服务器上的PHP中有应用程序。它从服务器上的aws bucket复制文件(解压文件。使用itext java将PDF转换为XML,读取XML并将数据保存到数据库),然后将处理后的文件上载回bucket

它可以很好地用于单个实例,但在多个实例的负载平衡中,服务器上进程下的文件将消失。 我不能直接从bucket处理文件,因为我不能在bucket上解压缩它,也不能在bucket上运行jar文件。所以我必须存储文件
临时处理。有没有办法处理这种情况

一些可能的解决方案:

  • 使用中心单键值存储(数据库)存储当前正在处理的文件的路径,下载新文件时,请检查此文件是否已被删除。你可以用Redis来做这个
  • 将一个新的、空的文件上传到S3,但是在文件名中有一些东西,这样您就知道如果文件存在,伴随的文件已经被处理了(虽然我不确定S3是否缓存目录列表)用这个解决方案,您也应该考虑将文件写入S3的成本,这也取决于您的刻度
  • 在处理文件时重命名或从S3中删除该文件

    • 一些可能的解决方案:

      • 使用中心单键值存储(数据库)存储当前正在处理的文件的路径,下载新文件时,请检查此文件是否已被删除。你可以用Redis来做这个
      • 将一个新的、空的文件上传到S3,但是在文件名中有一些东西,这样您就知道如果文件存在,伴随的文件已经被处理了(虽然我不确定S3是否缓存目录列表)用这个解决方案,您也应该考虑将文件写入S3的成本,这也取决于您的刻度
      • 在处理文件时重命名或从S3中删除该文件

      可以有多种解决方案:

      一种解决方案是,如果文件在上传时已处理,则检查并应用标记。应用一些标记,如
      processed=true
      ,并在下载文件时检查标记


      更好的解决方案是使用lambda执行此任务。

      此任务可以有多种解决方案:

      一种解决方案是,如果文件在上传时已处理,则检查并应用标记。应用一些标记,如
      processed=true
      ,并在下载文件时检查标记


      更好的解决方案是使用lambda执行此任务。

      您可以使用

    • S3至lambda
    • Lambda在SQS中丢弃一条消息
    • 应用程序监视器SQS
    • 应用程序进程文件
    • 删除消息

      或者让lambda完成S3上传的所有工作。取决于进程运行的时间。执行时间为5分钟。

      例如:

      设置lambda函数以监视s3 on upload new object事件。然后让lambda函数在SQS中删除一条消息(从它接收到的事件数据中,lambda函数知道源bucket名称和对象键名称)。服务器可以监视队列,处理消息,提取文件并将其上载到新的存储桶,从旧的s3存储桶中删除文件,然后从队列中删除消息。如果服务器在处理过程中死亡,消息将返回队列(可见性超时)。确保在旧bucket上处理和删除它的一种方法是启用版本控制和生命周期策略。处理消息时,如果旧存储桶上不存在文件,则发送警报和/或检查以前的版本。您还可以在旧存储桶上设置一个生命周期策略,以便在版本早于X天时永久删除该版本

      用Lambda监测S3

      s3版本控制

      选择“永久删除以前的版本”,然后输入对象成为以前版本后的天数以永久删除该对象(例如,455天)。


      您可以使用

    • S3至lambda
    • Lambda在SQS中丢弃一条消息
    • 应用程序监视器SQS
    • 应用程序进程文件
    • 删除消息

      或者让lambda完成S3上传的所有工作。取决于进程运行的时间。执行时间为5分钟。

      例如:

      设置lambda函数以监视s3 on upload new object事件。然后让lambda函数在SQS中删除一条消息(从它接收到的事件数据中,lambda函数知道源bucket名称和对象键名称)。服务器可以监视队列,处理消息,提取文件并将其上载到新的存储桶,从旧的s3存储桶中删除文件,然后从队列中删除消息。如果服务器在处理过程中死亡,消息将返回队列(可见性超时)。确保在旧bucket上处理和删除它的一种方法是启用版本控制和生命周期策略。处理消息时,如果旧存储桶上不存在文件,则发送警报和/或检查以前的版本。您还可以在旧存储桶上设置一个生命周期策略,以便在版本早于X天时永久删除该版本

      用Lambda监测S3

      s3版本控制

      选择“永久删除以前的版本”,然后输入对象成为以前版本后的天数以永久删除该对象(例如,455天)。


      您需要的是一个能够存储文件而不会丢失的系统。有很多替代方案

      a) 另一台服务器

      b) SQS队列。 @上面的strongiz答案很好地解释了这一点

      c) 甚至还有另一个数据库

      在每种情况下,您都需要一个标志来定义文件是否被处理。当文件处理完成时

      a) 删除文件或

      b) 换旗

      因为,PHP是面向会话的