【问题标题】:Run PHP script like an application without Browser像没有浏览器的应用程序一样运行 PHP 脚本
【发布时间】:2013-07-18 15:50:55
【问题描述】:

您好,我是 PHP 新手,不知道我要问的问题是否可行,或者是否有意义,但这里是。

我想执行一个 PHP 脚本,就好像我在 WebServer 上执行一个独立的应用程序一样,我想要实现的是当客户在网站上购买东西并且一旦他在网站上看到付款确认通知,他应该被允许关闭浏览器窗口或注销,而不会影响一旦用户被带到显示他支付成功的页面时开始的大订单生成过程。

现在我正在使用 AJAX 调用我的付款后处理 PHP 脚本,并保留该脚本以忽略任何用户中止调用。

这是告诉用户已成功收到付款的页面。

thankyou.php

这是执行付款成功后才需要进行的处理的页面

FinishCheckoutProcess.inc.php

现在 thankyou.php 使用 AJAX 异步执行 FinishCheckoutProcess.inc.php 并且 FinishCheckoutProcess.inc.php 有一个 PHP。 ini 设置如下: 忽略用户中止(真);

现在 AJAX 和 ignore_user_abort(true) 的组合允许即使用户关闭他的浏览器窗口,也可以在没有任何错误的情况下运行后付款过程,但是由于这个脚本与用户或浏览器无关,我只是想知道是否可以像独立于浏览器的独立应用程序一样在后台运行此脚本。

另外,我的 WebServer 是 Apache,操作系统是 Linux(Ubuntu 操作系统)。

我的工作已经完成,但我只是想知道是否有更好/更安全的方法来做。

无论如何,提前感谢大家,这个网站对我的帮助比任何书都多。所以你们所有为像我这样的新手贡献时间的专家们都很棒。请继续努力。

再次非常感谢。


根据收到的建议 如果我使用“exec”方法来执行 FinishCheckoutProcess.inc.php,这是否会执行数据库相关的命令,是否能够运行更多的 PHP 脚本。

FinishCheckoutProcess.inc.php 依次执行一系列其他 PHP 脚本,这些脚本又执行其他 PHP 脚本,因此使用“exec”命令运行 FinishCheckoutProcess.inc.php 会产生任何困难。

FinishCheckoutProcess.inc.php 进程也与 MySQL 数据库交互,所以如果我使用 "exec ”命令。我现在正在将必要的 MySQLi 连接对象传递给这个 PHP 脚本。那么我可以使用“exec

以同样的方式将它传递给它吗

这个过程也很繁重,因为它使用 IMagickImageMagick 生成一组 4 个图像文件。

它为每个订购的产品生成一组 4 个图像文件,因此如果 1 个产品的数量为 10,则生成的总文件将是 1x10x4 = 40

如果有两种产品,一种的数量为 2,另一种的数量为 4,则生成的文件总数为 1x2x4 = 8 + 1x4x4 = 16 = 24

所以这个脚本可能需要运行很长时间并且由于超时原因不能被停止,它需要完成它开始的事情。

基本上FinishCheckoutProcess.inc.php的逻辑和过程相当复杂,所以只想确认“exec”是否可以处理。

我也不确定,但其中一些也使用 $_SESSION 变量,但如果这是一个问题,我可以修改它,$_SESSION 变量只能在一个地方使用,是的,之前在浏览器中设置了 $_SESSION 变量FinishCheckoutProcess.inc.php 脚本被执行。通过一些以前的 PHP 脚本。

我只想执行 FinishCheckoutProcess.inc.php 脚本独立于父/调用脚本,即 thankyou.php,这样如果用户关闭浏览器然后FinishCheckoutProcess.inc.php 不会停止或中止,因为父/调用脚本即 thankyou.php 现在不再运行。

【问题讨论】:

  • 我会使用 CRON 作业来完成付款过程,您现在所做的只有在发出 AJAX 请求时才会运行,如果用户运行 JS 则永远不会触发,如果有的话是网络错误等。
  • +1,cron job 将是最好的解决方案
  • 可以使用 exec 从thankyou.php 执行 FinishCheckoutProcess.inc.php 并传递您需要的任何参数
  • 嗨,克里斯,你能告诉我更多关于你所指的网络错误的信息吗 另外我不希望使用 Cron 作业,因为我只想在特定场合执行脚本而不是安排和任务,因为这不是重复的,销售可以在 24 小时内发生一次,所以不想使用“cron”。我个人喜欢“执行”的建议

标签: php linux apache ubuntu


【解决方案1】:

仅供参考,您可以运行像 php my/script.php 这样的 php 脚本。

一个更安全的方法是拥有一个主/从进程工作流。主进程在服务器上运行并检查工作队列,派生的工作进程在到达时处理队列中的项目。

在您的场景中,您在用户付款时将内容添加到队列中。一旦它被添加到队列中,您可以将thankyou.php发回给用户,他们可以继续或离开或其他任何方式。一旦工作在队列中,你的主进程就会产生一个工作进程来处理这些东西(基本上在 FinishCheckoutProcess.inc.php 中完成所有工作)。

你可以在 php 中实现这个:php master.php
ma​​ster.php

while( true ){
    //check queue
    //if found queue item
       //shell_exec( 'php worker.php' );
}

【讨论】:

  • 嗨,我的脚本不会返回任何输出,它只会执行任务然后“退出”,所以我只想使用一种方法可以帮助我独立执行 PHP 脚本,并且速度更快一些如果可能的话
  • 我不确定您是否理解我的建议。工作进程不输出任何内容。来自用户队列的请求需要完成,然后由请求之外的主进程处理。这样做的好处是主机可以监督正在完成的处理量,从而优化处理时间。如果您使用 exec 方法,您将为来自需要额外处理的用户的每个请求提供一个流程,这是不可扩展或高效的。
【解决方案2】:

据我了解,您正在寻找类似 Laravel 提供的 illuminate/queue 包:

队列允许您将耗时的任务(例如发送电子邮件)的处理推迟到稍后的时间,这大大加快了对您的应用程序的 Web 请求。

这不是只有 Laravel 提供的东西,尽管它确实简化/简化了这种机制的实现。

在后台你有supervisord 执行一个“worker” php 脚本来执行你放在一个公共地方的任务(数据库表,文件系统,任何东西),这些任务通常是对带有一些变量的某个类/方法的引用发送给它。

以下链接可能会让您更好地理解:

有很多方法可以实现队列系统,也可以不使用supervisord。但我最近自己实现了这个方法,因为它保证我的任务正在处理,即使在服务器重新启动后(如果配置正确)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2013-06-17
    • 2018-03-25
    相关资源
    最近更新 更多