【发布时间】:2009-11-18 11:21:51
【问题描述】:
我通过 PHP 使用 SQLCMD 实用程序运行查询,我想知道是否有办法通过传递进程 ID 或其他内容来停止我通过另一个 SQL 命令执行的查询或脚本。
我也使用 SQL Server 的 PHP Driver 这样做会更容易吗?
或者这一切都不可能——一旦查询运行就无法停止?
谢谢大家
【问题讨论】:
标签: php sql-server sqlcmd sql-scripts
我通过 PHP 使用 SQLCMD 实用程序运行查询,我想知道是否有办法通过传递进程 ID 或其他内容来停止我通过另一个 SQL 命令执行的查询或脚本。
我也使用 SQL Server 的 PHP Driver 这样做会更容易吗?
或者这一切都不可能——一旦查询运行就无法停止?
谢谢大家
【问题讨论】:
标签: php sql-server sqlcmd sql-scripts
SQL Server 跟踪所有正在执行的进程。您可以使用存储过程SP_WHO 和SP_WHO2 查看该列表 - 每个进程都有一个唯一的SPID。
过去,我出于自己的目的复制和定制了这些过程背后的代码。
您可以使用DBCC INPUTBUFFER (@SPID) 检查上次在SPID 上执行的查询
您可以使用KILL @SPID 杀死大多数进程
请注意,通常认为杀死进程并不是一个好主意,因为您可能不确定它们到底在做什么。
【讨论】:
取决于您如何调用该 SQLCMD。您是否将其作为对 exec() 的调用来运行? PHP 命令没有给你太多的控制权。
如果您正在做一些耗时的事情,使用生产者-消费者架构可能会更好。让您的主程序发布(到数据库或文本文件)要运行的命令。让一个单独的进程(可能是另一个 PHP 脚本)运行该命令 - 但在它启动 SQLCMD 之前,让它向主程序提供其进程 ID(或其他一些句柄)。
然后,在您的主程序中,如果生成的进程耗时过长,您可以终止它。
PHP exec 函数上的一些 cmets 可能很有启发性:http://au2.php.net/manual/en/function.exec.php
【讨论】: