【发布时间】:2011-01-28 07:37:13
【问题描述】:
我们在 Windows 服务器上运行 PHP(确实是许多问题的根源,但目前还不能选择迁移)。在某些情况下,用户发起的操作需要启动一些需要一段时间的事情,用户不需要知道他们是成功还是失败,例如发送电子邮件或确保某些事情第三方帐户已更新。如果我可以用pcntl_fork() fork,这将非常简单,但是 PCNTL 函数在 Windows 中不可用。
似乎我能得到的最接近的就是做这种性质的事情:
exec( 'php-cgi.exe somescript.php' );
但是,这会复杂得多。我需要启动的操作依赖于运行过程中已经存在的大量上下文;要使用上面的示例,我需要找出基本数据并以某种方式将其提供给新脚本。如果我可以分叉,那只是让父进程早点返回,让子进程处理更多事情。
我发现一些人谈论他们自己在 Windows 上编译各种 PCNTL 函数的工作,但似乎没有任何可用的东西(断开的链接等)。
尽管this question 与我的名字几乎相同,但似乎问题在于执行超时而不是需要分叉。那么,我最好的选择是重构一点来处理调用 php-cgi,还是有其他选择?
编辑:似乎exec() 对此不起作用,至少在我没有弄清楚它的其他方面时不会,因为它会等到调用返回。我想我可以使用START,有点像exec( 'start php-cgi.exe somescript.php' );,但它仍然要等到其他脚本完成。
【问题讨论】:
-
您是否考虑过为此使用 cron 作业? (有一些可用的选项,google.com/search?q=cron+windows)
-
据我所见,它看起来和使用 psexec 一样好用,但我只是用 psexec 来工作,所以我可能会坚持下去。