【问题标题】:Heroku scheduler execute a PHP fileHeroku 调度程序执行一个 PHP 文件
【发布时间】:2024-05-21 01:40:02
【问题描述】:

我正在尝试使用 heroku 调度程序运行一个 php 脚本。我应该在 heroku 中的 $ 之后输入什么命令。我一直找不到文件。我已将要运行的文件传输到 heroku,但使用调度程序运行它时运气不佳。

【问题讨论】:

  • 嗨 papritiger,感谢您的回答,我已经尝试过了,但仍然找不到文件:/ 我不确定 Heroku 设置在哪个目录上。我假设我的应用程序的目录。
  • 是的,我有“/app”有什么想法吗?
  • 你应该可以用ls and cd 到处逛逛。我只有一个免费的 heroku 帐户,所以我无法对其进行测试,但这应该是您存储库的根目录。如果您的文件仍未显示,您可能忽略了将文件提交或推送到 heroku。
  • 您好,我也在使用免费的 heroku 帐户,并免费安装了 heroku 调度程序插件。尽管日志说“找不到文件”。我 100% 确定文件已提交并传输,因为当我将目录克隆回我的电脑时,我收到了它..
  • 您可以使用heroku run php /app/path/to/script.php 进行试验,看看是否有效。或者heroku run bash 应该会在 heroku 终端内为您提供提示,以便您可以四处走动并以更生动的方式进行测试

标签: php file heroku scheduler


【解决方案1】:

Heroku 上的默认 PHP buildpack 目前没有 PHP CLI support,因此您只能使用它来通过 Apache 处理 Web 请求,而不能用于 worker dynos 中的脚本。但是,如果您使用的是支持 CLI 的 PHP buildpack,这是可能的。

为了测试它,我forked the PHP buildpack,用 CLI 支持编译的 PHP 二进制文件换掉了一个,并把小的 demo of running a scheduled PHP job on Heroku 放在一起。有关分步说明,请参阅项目的 readme。要在现有应用程序上使用此 fork,请将 buildpack 设置为:

$ heroku config:add BUILDPACK_URL=https://github.com/ryanbrainard/heroku-buildpack-php.git

请注意,我的 fork 中的 release 脚本设置了 PATH 以仅使用 /app/bin/php 解析 /app/bin/php 中的 php 可执行文件,这与需要使用绝对路径的默认 buildpack 不同。

【讨论】:

  • 我意识到默认 PHP buildpack 不支持 CLI 是错误的,但它确实需要一些调整才能使其正常工作。请参阅@friism 对相关问题的回答,了解如何调整它:*.com/a/14390508/129492
【解决方案2】:

如何使用 Heroku Scheduler 运行 PHP 脚本?

测试和设置作业

目录结构和Procfile 看起来像这样:

├─ Procfile
├─ web/
├── (your webfiles)
├─ worker/
└── myscript.php

Procfile

web: vendor/bin/heroku-php-apache2 web/
worker: php worker/myscript.php

然后您可以像这样从命令行测试您的工作人员:

heroku run worker

要安排作业,请进入 Heroku Scheduler 并以类似的方式添加作业,但没有 heroku run 段(否则您将收到 bash: heroku: command not found 错误),只需:

worker

或者,或者,直接:

php worker/myscript.php

检查工作

您可以在应用程序的日志中看到该作业。例如:

2017-09-01T14:19:37.397210+00:00 heroku[scheduler.9540]: Starting process with command `php worker/myscript.php` 

注意事项

  • Procfile 中的worker 名称可以设置为其他名称。例如:myworkermysuperduperscript 等。
  • 我包含了一个 web 部分,但如果您只需要一个工作器/后台服务并且不需要在网络上提供文件,则它是可选的。

替代方案:如果出于某种原因,您希望对 URL 执行 GET/POST 请求,则可以使用 Temporize Scheduler 插件。

【讨论】:

  • 法比安的回答很好!如果我想每 10 分钟一次运行多个 cron 脚本(工作文件)怎么办? (一两个需要 20 分钟才能跑完)
最近更新 更多