【问题标题】:Use PHP to execute system command with a long timeout period?使用 PHP 执行超时时间较长的系统命令?
【发布时间】:2012-03-17 11:22:38
【问题描述】:

我们需要在我们没有 SSH 访问权限的服务器上解压/解压缩一个非常大的存档文件。我们的替代选项之一是通过 PHP 执行系统命令来解压缩文件。

问题在于解压缩/解压缩文件需要相当长的时间。 PHP 在完成之前就超时了。

有没有办法让 untar 命令完全执行,无论 PHP 脚本是否超时?像异步执行一样?

或者如何临时将 PHP 超时时间设置为极高,以便有足够的时间完成解压缩文件?

【问题讨论】:

  • 是linux系统吗?因为 afaik,在 linux 上,花在系统命令上的时间不计入 max_execution_time 限制。也许是 httpd 设置了一些超时。
  • 同上,是Linux系统吗?它是在共享网络托管平台上吗?也许您可以定义和运行 cronjobs(在共享主机中并不罕见),这将允许您异步解压缩文件。您是否需要解压缩文件一次或每当用户上传压缩文件时?如果只有一次,也许您可​​以访问带有压缩/解压缩功能的文件管理器的 Web 控制面板,或者让服务器管理员为您解压缩文件可能更容易。
  • 是的,它是 Linux。 Rackspace 云站点。

标签: php zip system archive tar


【解决方案1】:

来自manual

set_time_limit() 函数和配置指令 max_execution_time 只影响脚本的执行时间 本身。在执行之外发生的活动上花费的任何时间 例如使用 system() 的系统调用、流操作、 确定最大值时不包括数据库查询等 脚本运行的时间。在 Windows 上不是这样 其中测量的时间是真实的。

可能发生的情况是您的客户端(浏览器)超时。这种断开连接可能会导致脚本中止。为了防止这种情况,你可以这样做:

ignore_user_abort(true);

然后,您需要第二个脚本来检查进度。一个想法是将 tar 的输出写入一个文件,您的第二个脚本可以检查它是否已完成。另一种方法是调用一个 shell 脚本,该脚本依次运行 tar。该 shell 脚本可以检查返回码并使用其结果访问文件,也可以在工作时创建一个基本的锁定文件。

【讨论】:

  • 感谢您的回答。是否可以将 linux 命令输出到文件,以便它不断更新,以便另一个脚本可以检查命令的状态?因为据我所知,当您使用 # command > output.txt 时,它不会在命令完成之前写入文件。
  • 根据我的经验,该文件被写入整个文件,可以随时检查。
  • 非常欢迎您回答。但是赞成票会说得更好;)
  • 是的,只是在等待先调查其他答案。谢谢。
【解决方案2】:

如果服务器在 *nix 系统上运行,则 nohup 命令可能可用。即

nohup tar ... >outfile.txt

然后您可以让 PHP 脚本扫描 outfile.txt 直到操作结束

【讨论】:

    【解决方案3】:

    如果您的服务器配置不阻止您修改这些值,则应该这样做:

    set_time_limit( 0);
    ini_set( 'max_execution_time', 0);
    

    请参阅 set_time_limitmax_execution_time

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-27
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2011-05-15
      相关资源
      最近更新 更多