像不带浏览器的应用程序一样运行PHP脚本


Run PHP script like an application without Browser

嗨,我是PHP的新手,不知道我要问的问题是否可能,或者是否有意义,但到此为止。

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

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

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

谢谢.php

这是一个执行处理的页面,只有在成功收到付款后才需要进行处理

FinishCheckoutProcess.inc.php

现在谢谢.php使用AJAX异步执行FinishCheckoutProcess.inc.php,并且FinishCheckoutProcess.inc.php[/strong>中有一个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"命令运行FinishCheckout Process.inc.php会造成任何困难。

FinishCheckoutProcess.inc.php进程也与MySQL数据库进行交互,因此如果我使用"exec"命令执行此脚本,我将能够执行此操作。我现在正在将必要的MySQLi连接对象传递给这个PHP脚本。因此,我可以使用"exec"以相同的方式将其传递给它吗

此外,该过程相当繁重,因为它使用IMagickImageMagick

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

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

因此,这个脚本可能需要运行很长一段时间,并且由于超时原因不能被允许停止,它需要完成它开始的工作。

基本上,FinishCheckoutProcess.inc.php逻辑和流程相当复杂,因此只想确认"执行"是否可以处理它。

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

我只想独立于父脚本/调用脚本执行FinishCheckoutProcess.inc.php脚本,即谢谢.php,这样,如果用户关闭浏览器,则FinishCheckout Process.inc.hp将不会停止或中止,因为父脚本/调用脚本已停止运行。

FYI您可以运行类似php my/script.php的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' );
}

据我所知,您正在寻找Laravel提供的illuminate/queue包:

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

这并不是只有Laravel才能提供的,尽管它确实简化了这种机制的实现。

在后台,supervisord执行一个"worker"php脚本,该脚本执行您放在公共位置的任务(数据库选项卡、文件系统等),这些任务通常是对某个类/方法的引用,其中包含一些要发送给它的变量。

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

  • http://supervisord.org/index.html
  • https://laravel.com/docs/5.1/queues
  • https://laravel.com/docs/5.1/queues#supervisor-配置

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