您好我是PHP的新手,并且不知道我要问的内容是否可能,或者它是否有意义但是这里有效。
我想执行一个PHP脚本就像我在WebServer上执行一个独立的应用程序一样,我想要实现的是当客户在网站上购买东西并且一旦他在网站上看到付款确认通知,应该允许他关闭浏览器窗口或注销,而不会影响一旦用户进入显示他所做的付款成功的页面就开始的大订单生成过程。
现在我正在使用AJAX调用我的付款后处理PHP脚本并保持该脚本忽略任何用户中止调用。
这是告诉用户付款已成功收到的页面。
thankyou.php
这是执行仅在成功收到付款后需要完成的处理的页面
FinishCheckoutProcess.inc.php
现在 thankyou.php 使用AJAX异步执行 FinishCheckoutProcess.inc.php , FinishCheckoutProcess.inc.php 有一个PHP。 ini在其中设置如下: ignore_user_abort(真);
现在AJAX和ignore_user_abort(true)的组合允许后付款流程在没有任何错误的情况下运行,即使用户关闭了他的浏览器窗口,但由于此脚本与用户或浏览器无关,我只是想知道是否可以在后台运行此脚本,就像独立于浏览器的独立应用程序一样。
我的WebServer也是Apache,OS是Linux(Ubuntu OS)。
我的工作已经完成,但我只想知道是否有更好/更安全的方法。
无论如何,提前感谢所有人,这个网站对我的帮助超过了任何一本书。所以那些把你的时间捐给像我这样的新手的专家你们都很棒。请保持良好的工作。
再次感谢。
根据收到的建议 如果我使用“exec”方法执行FinishCheckoutProcess.inc.php,它将执行与数据库相关的命令,并且能够运行更多的PHP脚本。
FinishCheckoutProcess.inc.php 依次执行一系列其他PHP脚本,然后执行其他PHP脚本,因此将使用“exec”命令运行FinishCheckoutProcess.inc.php创建任何困难。
FinishCheckoutProcess.inc.php 进程也与MySQL数据库进行交互,因此如果我使用“ exec执行此脚本,我将能够执行此操作“命令。我现在正在将必要的MySQLi连接对象传递给这个PHP脚本。所以我可以使用“ exec ”
以相同的方式传递给它此过程非常繁重,因为它使用 IMagick 和 ImageMagick 生成一组4个图像文件。
它为每个订购的产品生成一组4个图像文件,因此如果1个产品的数量为10,则生成的文件总数将为1x10x4 = 40
如果有两个产品,其中一个产品的数量为2,另一个产品的数量为4,则生成的总文件数为 1x2x4 = 8 + 1x4x4 = 16 = 24
因此,这个脚本可能需要运行很长时间,并且由于超时原因而不能被允许停止,它需要完成它的开始。
基本上 FinishCheckoutProcess.inc.php 逻辑和过程非常复杂,所以只想确认“ exec ”是否可以处理它。
另外我不确定,但是其中一些也使用$ _SESSION变量,但如果这个问题我可以修改它,$ _SESSION变量只能在一个地方使用,是的,之前在浏览器中设置了$ _SESSION get执行 FinishCheckoutProcess.inc.php 脚本。通过一些以前的PHP脚本。
我只想执行独立于父/调用脚本的 FinishCheckoutProcess.inc.php 脚本,即 thankyou.php ,这样如果用户关闭浏览器那么 FinishCheckoutProcess.inc.php 不会停止或中止父/调用脚本,即 thankyou.php 现在不再运行。
答案 0 :(得分:0)
仅供参考,你可以运行像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' );
}
答案 1 :(得分:0)
根据我的理解,您正在寻找像Laravel提供的illuminate/queue
包裹之类的东西:
队列允许您推迟处理耗时的任务,例如发送电子邮件,直到稍后会大幅加快对您的应用程序的Web请求。
这不仅仅是Laravel提供的东西,尽管它确实简化/简化了这种机制的实现。
在后台你有supervisord
执行"工人" php脚本执行你放在一个公共位置的任务(db tabel,filesystem,anything),这些任务通常是对某个类/方法的引用,并带有一些变量发送给它。
以下链接可能会让您更好地理解:
有许多方法可以实现队列系统,也可以不使用supervisord
。但我最近自己实现了这个方法,因为它确保我的任务正在被处理,即使在服务器重启后(如果配置正确)。