【问题标题】:Don't make Laravel / PHP wait for python script to finish不要让 Laravel / PHP 等待 python 脚本完成
【发布时间】:2018-04-04 18:55:20
【问题描述】:

当前设置

我目前有一个名为HomeController.php 的控制器类为用户在表单中输入的详细信息以及保存其他详细信息创建一个request(这不是此问题的一部分)。

这个request 然后被发送到另一个控制器类Jobcontroller.php 运行API,careerjet 并返回urls

问题

我必须手动访问另一个页面来运行 API 并获取结果,然后必须执行 python 脚本。即:

website.co.uk/output -> URL 1 , URL 2 , URL 3
exec(script1.py)
exec(script2.py)
exec(script3.py)

我想要达到的目标

我当然不想这样做,我需要一切都自动化。意思是,如果用户点击submit,api代码将立即运行,然后python脚本应该不会影响前端的可用性速度。 (他们不必停留在同一页面上,等待最后一个作业完成)。

我查看了队列的实现——它似乎只在没有其他请求时运行。

【问题讨论】:

    标签: php laravel hierarchy


    【解决方案1】:

    这更像是一个架构类型的问题,但您可以尝试以下选项:

    1.创建一个单独的 Python 应用程序并通过 API 进行通信

    如果同步操作是强制性的,您可能希望您的 python 脚本可以通过 API 执行。只需通过 Flask 之类的工具托管您的脚本。

    当 Laravel 向 Flask 应用发送 API 请求时,它会启动脚本,并通过 HTTP API 返回结果。

    2。在队列中执行作业

    所以基本上与上面的流程相同,但实际上创建了一个 Laravel Job 在后台与这个 Flask 应用程序通信。用户可以在 Laravel 应用程序中继续他们的业务,当Job 完成后,您可以更新您的数据库,发送通知,等等。

    3.通过 PHP shell 命令执行 Python 脚本

    我不推荐这种方法作为长期解决方案,但您可以让 PHP 执行一个 shell 命令来启动您的 python 脚本。

    让脚本与 PHP 应用程序进行通信可能会让人头疼。但这是可能的。

    【讨论】:

    • 谢谢你告诉我这个:)。我没有时间重构我的代码库,所以我只实现了一个 job 并通过它运行 python 脚本。我可以通过这个实现careerjetAPI 吗? EG:通过调用控制器类,或者我是否也需要重构和实现它
    • 对不起,我不明白你在说什么。你可以做的是将你的逻辑与 CareerJet API 通信放在 Laravel Job 中。尝试遵循 Laravel 作业/队列教程,看看它是如何工作的。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多