主要原因是因为我不想占用当前PHP进程。我希望用户能够在脚本执行期间进行导航。
有问题的脚本(importer.php
)更新了一个txt
文件的百分比,因为它完成了,javascript拦截这个txt
文件,并使用计时器每5秒输出一个百分比,以保持用户更新(所有以加载条的形式)。
我已经能够像这样启动脚本:
$cmd = '"C:'/path'/to'/v5.4'/php" importer.php';
pclose(popen($cmd, "r"));
exit;
这将运行脚本,但是挂起当前进程,直到importer.php
完成。是否有一种方法可以摆脱当前进程并使用另一个进程来启动这个进程?
我读到在cmd结束时使用&
告诉脚本不要等待,但我相信这是*nix
命令,因为我在Windows
盒子上运行,我不能使用它…除非有Windows
的替代方案
根据http://php.net/passthru上的文档,您应该能够使用它执行命令,只要您重定向输出。
$cmd = '"C:'/path'/to'/v5.4'/php" importer.php';
// Use passthrough here, and redirect the output to a temp textfile.
passthru($cmd . '>%TEMP%'importerOutput.txt');
exit;
我能够通过使用WshShell对象来解决这个问题;WScript.Shell
$WshShell = new COM("WScript.Shell");
$WshShell->Run('"C:'/path'/to'/v5.4'/php-win.exe" -f "C:'/path'/to'/code'/snippet'/importer.php" var1 var2 var3', 0, false);
注意:我的文件结构中有空格,所以我需要在文件的路径周围添加引号。我还能够传递变量var1
、var2
和var3
。我还使用了'/
来转义斜杠。
我将Run
数组分解一下:
- 第一个;是你想要运行的
command
(php的路径,脚本的路径和要传递的变量)。 - 第二个;
0
-隐藏窗口并激活另一个窗口(链接如下以获取更多选项)。 - 第三;
false
-布尔值,指示脚本是否应该等待程序完成执行,然后再继续执行脚本中的下一条语句。如果设置为true
,脚本将停止执行,直到程序完成。
有关WScript.Shell
的更多信息,请访问http://msdn.microsoft.com/en-us/library/d5fk67ky(v=vs.84).aspx。
希望这对其他人有帮助!