0

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

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

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

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

谢谢你.php

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

FinishCheckoutProcess.inc.php

现在thankyou.php利用AJAX异步执行FinishCheckoutProcess.inc.php , FinishCheckoutProcess.inc.php中有一个PHP.ini设置,如下所示:ignore_user_abort(true);

现在 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现在不再运行。

4

2 回答 2

1

仅供参考,您可以运行 php 脚本,例如php my/script.php.

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

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

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

while( true ){
    //check queue
    //if found queue item
       //shell_exec( 'php worker.php' );
}
于 2013-07-18T16:10:21.757 回答
1

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

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

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

在后台,您supervisord执行了一个“worker” php 脚本,该脚本执行您放置在公共位置(数据库表、文件系统等)的任务,这些任务通常是对某个类/方法的引用,并带有一些要发送给它的变量。

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

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

于 2016-02-10T11:56:04.827 回答