gpt4 book ai didi

php - 如何使用 php exec() 来运行另一个脚本并在后台运行,而不是等待脚本完成

转载 作者:行者123 更新时间:2023-12-02 22:35:38 24 4
gpt4 key购买 nike

我想执行一个大型的、数据库密集型脚本,但不需要等待进程完成。我只想调用脚本,让它在后台运行,然后重定向到另一个页面。

编辑:我正在 Windows 7 上的本地 Zend 社区服务器上工作。我可以访问项目所在的远程 Linux 服务器,因此我可以在 Linux 或 Windows 上执行此操作。

我有这个

public function createInstanceAction()
{
//calls a seperate php process which creates the instance
exec('php -f /path/to/file/createInstance.php');


Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Instance creation process started. This may take up to a few minutes.'));
$this->_redirect('instances/adminhtml_instances/');
return;
}

这完美地工作,但 magento 应用程序挂起等待进程完成。它做我期望的一切,不时记录到文件,并且对它的运行方式感到满意。现在我想做的就是启动这个脚本, Controller Action 不会挂起,而是重定向,就是这样。根据我对 exec() 的了解,您可以通过将我上面调用 exec() 的方式更改为:

exec('php -f /path/to/file/createInstance.php > /dev/null 2>&1 &');

我从 here 中获取的

如果我在 exec 调用中添加“>/dev/null 2>&1 &”,它不会像预期的那样等待,但它不会再执行脚本。有人可以告诉我为什么吗?如果可以,请告诉我如何让它工作?

这可能是与权限相关的问题吗?

谢谢

编辑:我假设如果我使用 (/dev/null 2>&1 &) 调用 exec 函数,那么将任何输出记录到文件将是一个问题,因为那样会取消它。对吗?

最佳答案

在花时间完全理解我自己的问题和回答它的方式之后,我准备了我的解决方案。

感谢大家的建议,请原谅我问问题时的漫不经心和毫无准备。

上述问题的答案取决于许多因素,例如您所指的操作系统、您正在运行的 php 模块,甚至您正在运行的网络服务器。因此,如果我不得不重新开始这个问题,我要做的第一件事就是说明我的设置是什么。

我想在两个环境中实现这一目标:

1.) Windows 7 运行 Zend 服务器社区版。2.) Linux(我的操作系统是 Linux odysseus 2.6.32-5-xen-amd64 #1 SMP Fri Sep 9 22:23:19 UTC 2011 x86_64)

为了做到这一点,我希望它在部署到 windows 或 linux 时能够以任何一种方式工作,所以我使用 php 来确定操作系统是什么。

public function createInstanceAction()
{

//determines what operating system is Being used
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
{
//This is a windows server

//call a seperate php process to run independently from the broswer action

pclose(popen("start php /path/to/script/script.php","r"));

}
else
{
//assuming its linux, but in fact it simply means its not windows
// to check for linux specifically use (strtoupper(substr(PHP_OS, 0, 3)) === 'LIN')
exec('php -f /path/to/file/script.php >/dev/null 2>&1 &');
}
//the browser will not hang around for this process to complete, and you can contimue with whatever actions you want.

//myscript log any out put so i can capture info as it runs
}

简而言之,理解问题后提出问题。有很多方法可以实现上述目标,这只是适用于我的开发和生产环境的一种解决方案。

感谢大家的帮助。

关于php - 如何使用 php exec() 来运行另一个脚本并在后台运行,而不是等待脚本完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11492623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com