【问题标题】:Execute server-side execution of PHP script via webpage通过网页执行 PHP 脚本的服务器端执行
【发布时间】:2015-01-09 01:41:45
【问题描述】:

首先很抱歉发布一个问题,该问题似乎已在 SO 上被鞭笞致死。但是,我查看的所有问题都没有帮助我解决我的具体问题。

我已经构建了一个 Web 应用程序,该应用程序在 PHP 中运行广泛的数据处理例程(即 MySQL 查询、计算等)。

根据提供给应用程序的数据量,此处理可能需要相当长的时间,因此脚本需要在服务器端运行并且独立于 Web 前端。

但是有一个问题。只要通过cgi调用脚本,我似乎无法控制脚本执行时间限制。

当我通过 SSH 和命令行运行脚本时,无论处理数据需要多长时间,它都能正常工作。

但是,如果我在通过网络服务器调用的 php 脚本中使用 exec() 命令,我总是会在大约 45 秒后出现错误 End of script output before headers。

我不想摆弄服务器设置(就可移植性而言是一场噩梦),我想找到一个独立于 cgi 启动脚本的解决方案。

有什么建议吗?

【问题讨论】:

  • " 独立于 cgi。"所以 mod_php ?
  • 是的,但不是。这是一个托管解决方案,对服务器配置的访问受限。所以我必须找到一个在mod_fastcgi 为默认值时有效的解决方案
  • 你能给我们看看php代码吗?并且您是否检查了任何其他不需要太多执行时间的命令 exec() 是否有效?只有时间限制是障碍?
  • 好吧,代码量很大,我不确定它是否有帮助。正如我所说,只要我通过 SSH 执行脚本,它就可以正常工作。仅当通过 HTTP 调用时,我才会遇到脚本结束问题
  • 长时间运行的作业应该与 Web 服务器无关。应该有一个独立于 Web 服务器的基础设施,可以运行长时间运行的作业;例如队列工作者系统,例如 Gearman、ØMQ、cron 作业等。如果您的服务器受到限制以至于不允许此类基础架构,那么在该系统上可能根本不可能。

标签: php apache shell


【解决方案1】:

不要直接从网站(AKA,直接从 Apache)执行长脚本,因为正如您所提到的,它会一直阻塞,直到完成并可能超时。相反,请使用网站来安排要立即运行的作业(执行长脚本)。

以下是您可能如何做到这一点的基本概述:

  1. 创建一个新的小型数据库来存储作业请求,包括字段job_id、processing_status、run_start_time 和更多相关字段
  2. 创建一些 Ajax 访问您的服务器并将“作业请求”写入此作业数据库,设置为立即执行。
  3. 添加定期监视新作业的 crontab 脚本或机器人。如果它找到尚未处理但已通过run_start_time 的作业,请使用exec() 或其他命令执行器运行它。这样命令就不会超时,因为它不是由 Apache 运行,而是由 cron 守护进程运行。
  4. 命令完成后,更新作业数据库,说明处理已完成。
  5. 从您的网站编写一个前端,允许用户查看请求的作业是否已完成。完成后,它会显示某种“完成”指示器或类似的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2011-09-08
    • 2017-03-21
    • 2021-11-30
    • 2014-11-28
    • 1970-01-01
    • 2021-06-18
    • 2019-01-24
    相关资源
    最近更新 更多