PHP借用$cmd运行程序后,如何关闭? 本帖最后由 mumubangditu 于 2011-01-14 04:06:59 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议你使用 popen http://cn2.php.net/manual/en/function.popen.php 参考http://leeon.me/a/compare-php-system-executing-command-system-exec-passthru 4,5楼的,能不能给写个 popen 的代码?看不太懂教程…… <?php$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");pclose($handle);?> shineofgod,我运行了popen,但是notepad.exe运行3秒钟后,并没有被终止关闭啊…… popen — 打开进程文件指针说明resource popen ( string $command , string $mode )打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。 如果出错返回 FALSE。 Note: 如果需要双向支持,使用 proc_open()。 Example #1 popen() 例子<?php$handle = popen("/bin/ls", "r");?> Note: 如果未找到要执行的命令,会返回一个合法的资源。这看上去很怪,但有道理。它允许访问 shell 返回的任何错误信息: <?phperror_reporting(E_ALL);/* 加入重定向以得到标准错误输出 stderr。 */$handle = popen('/path/to/spooge 2>&1', 'r');echo "'$handle'; " . gettype($handle) . "\n";$read = fread($handle, 2096);echo $read;pclose($handle);?> <?php$handle = popen('C:\WINDOWS\system32\notepad.exe', 'r');pclose($handle);?>是这样写的吗?fread怎么加啊? 居然有个popen?长了见识,我也赞成用popen 建议你使用 popen http://cn2.php.net/manual/en/function.popen.php PHP code<?php$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");pclose($handle);?>这个没有设置打开3秒后自动关闭啊。哪里有参数设置? 老师一定教过你, 独立思考问题.[code]<?php$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");sleep(20);pclose($handle);?>[/code] <?php$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");sleep(10);pclose($handle);?> 老大,这个我自己也试过,没有作用啊。记事本可以被打开,但是等待时间都已经超过60秒了,程序还是没有执行关闭。测试环境PHP5.2+APACHE2+WINXP。 <?php$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");pclose($handle);?> popen返回的是notepad.exe在php环境下的进程指针,这个指针只能用于读取和输出数据给notepad,pclose关闭的只是这个指针而不是notepad本身.我也不清楚如何关闭notepad,但是我想应该从windows的编程基础中查找如何获取任务管理器中的进程,然后用system函数去调用windows的关闭程序 这个和我先前想的一样,但是问题是可以打开任务管理器,但怎样确定关闭任务管理器里的notepad.exe?哎~~实在不行的话,只能试试CRON了。//$cmd1 = 'C:\WINDOWS\system32\taskmgr_original.exe';//system($cmd1); popen是单向的,用proc_open吧试试看/** * windows only */$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"));$cwd = 'C:\WINDOWS\system32';$process = proc_open('notepad.exe', $descriptorspec, $pipes, $cwd);$s = proc_get_status( $process );//得到的信息都是父进程cmd.exe的状态,而非子进程notepad.exe的.所以不能直接kill掉这个process idsleep( 3 );exec('taskkill /PID '.$s['pid'] . ' /T'); //树型删除,删除所有父进程与对应的子进程.原来以为子进程id必定大于父进程,写了一通代码,后来发现不是,且找到了这个命令proc_close( $process ); @foolbirdflyfirst,太棒了,高手中的高手终于出现了。感谢大家的帮助。 怎么才能实现像淘宝哪样自由增添模块,上下移动模块,请给个思路 Undefined offset 1086怎么解决 谁能给我一个纯PHP编写的照片路径存储的实例! 提交编码乱码问题 【有没有用内存虚拟磁盘做web document root的?】 求php书籍、 求php牛人写个判断 请问,php在另一个页面,能控制当前页面html中的节点吗?比如<body><td>等 請教一個文本處理的問題 很急,求教,有谁知道pconnect? 二维数组重复值累加问题 mysql_real_escape_string 能防止SQL注入吗
http://leeon.me/a/compare-php-system-executing-command-system-exec-passthru
<?php
$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");
pclose($handle);
?>
resource popen ( string $command , string $mode )
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。此指针可以用于 fgets(),fgetss() 和 fwrite()。 如果出错返回 FALSE。 Note: 如果需要双向支持,使用 proc_open()。 Example #1 popen() 例子<?php
$handle = popen("/bin/ls", "r");
?> Note: 如果未找到要执行的命令,会返回一个合法的资源。这看上去很怪,但有道理。它允许访问 shell 返回的任何错误信息: <?php
error_reporting(E_ALL);/* 加入重定向以得到标准错误输出 stderr。 */
$handle = popen('/path/to/spooge 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>
$handle = popen('C:\WINDOWS\system32\notepad.exe', 'r');
pclose($handle);
?>
是这样写的吗?
fread怎么加啊?
$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");
pclose($handle);
?>这个没有设置打开3秒后自动关闭啊。哪里有参数设置?
[code]
<?php
$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");sleep(20);pclose($handle);
?>
[/code]
$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");
sleep(10);
pclose($handle);
?>
老大,这个我自己也试过,没有作用啊。记事本可以被打开,但是等待时间都已经超过60秒了,程序还是没有执行关闭。测试环境PHP5.2+APACHE2+WINXP。
$handle = popen('C:\WINDOWS\system32\notepad.exe', "r");
pclose($handle);
?>
哎~~实在不行的话,只能试试CRON了。
//$cmd1 = 'C:\WINDOWS\system32\taskmgr_original.exe';
//system($cmd1);
试试看
/**
* windows only
*/
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w")
);
$cwd = 'C:\WINDOWS\system32';
$process = proc_open('notepad.exe', $descriptorspec, $pipes, $cwd);
$s = proc_get_status( $process );//得到的信息都是父进程cmd.exe的状态,而非子进程notepad.exe的.所以不能直接kill掉这个process id
sleep( 3 );
exec('taskkill /PID '.$s['pid'] . ' /T'); //树型删除,删除所有父进程与对应的子进程.原来以为子进程id必定大于父进程,写了一通代码,后来发现不是,且找到了这个命令
proc_close( $process );
感谢大家的帮助。