系统程序执行

系统程序执行:

	string escapeshellarg ( string $arg )
		对 'shell命令' 的字符串进行转义

	string escapeshellarg ( string $arg )
		对 'shell命令的参数' 字符串进行转义

	警告:
		在下面4个调用系统命令的函数中,使用前,都应该调用这2个函数,对 '命令' 和 '参数' 分别进行转义

	string exec ( string $command [, array &$output [, int &$return_var ]] )

	string system ( string $command [, int &$return_var ] )

	void passthru ( string $command [, int &$return_var ] )

	string shell_exec ( string $cmd )

	执行运算符:
		1.PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。
		2.使用反引号运算符“`”的效果与函数 shell_exec() 相同。
		注意:
			1.反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。 ----- 反引号,效果同 'shell_exec()' 相同,猜想是不是直接调用的 'shell_exec()',所以,在禁用了 'shell_exec()' 它也不可用!
			2.与其它某些语言不同,反引号不能在双引号字符串中使用。
		示例:
			<?php
				$output = `ls -al`;		// 注意:是直接反引号
				echo "<pre>$output</pre>";
			?>

	警告:
		上面4个系统调用函数,都非常类似,都是系统调用!有细微的差别,可查看转载的另一篇文章:
			http://blog.youkuaiyun.com/beyond__devil/article/details/53868309
		也可直接看手册,很简单

	proc_*相关函数:
		resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
			1.执行一个命令,并且打开用来输入/输出的文件指针。
			2.类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。
			参数:
				$cmd - 要执行的命令
				$descriptorspec - 一个索引数组。 数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程。
					数组索引:
						0 - 标准输入(stdin)
						1 - 标准输出(stdout)
						2 - 标准错误输出(stderr)
						文件描述符的值不限于 0,1 和 2,你可以使用任何有效的文件描述符 并将其传送至子进程。 这使得你的脚本可以和其他脚本交互操作。 例如,可以通过指定文件描述符将密码以更加安全的方式 传送至诸如 PGP,GPG 和 openssl 程序, 同时也可以很方便的获取这些程序的状态信息。
					数组元素值:
						1.包含了要传送至进程的管道的描述信息。也是一个数组,第一个元素为描述类型符,第二个元素是真对该描述符的选项。
							1>类型为:pipe,第二个元素可以是:r 向进程传送该管道的读取端,w 向进程传送该管道的写入端
							2>类型为:file,第二个元素是:文件名
						2.表达一个真实文件描述符的流资源类型 (例如:已打开的文件,一个 socket 端口,STDIN)。
				$pipes - 将被置为索引数组, 其中的元素是被执行程序创建的管道对应到 PHP 这一端的文件指针。
				$cwd - 要执行命令的初始工作目录。 必须是 '绝对路径',设置此参数为 NULL 表示使用默认值(当前 PHP 进程的工作目录)
				$env - 要执行的命令所使用的环境变量。 设置此参数为 NULL 表示使用和当前 PHP 进程相同的环境变量。
				$other_options - 要执行的命令所使用的环境变量。 设置此参数为 NULL 表示使用和当前 PHP 进程相同的环境变量。
					suppress_errors (仅用于 Windows 平台): 设置为 TRUE 表示抑制本函数产生的错误。
					bypass_shell (仅用于 Windows 平台): 设置为 TRUE 表示绕过 cmd.exe shell。

		int proc_close ( resource $process )
			关闭由 proc_open() 打开的进程并且返回进程退出码
			警告:
				proc_close() 函数会等待进程终止, 并且返回进程的返回值。 如果有连接到进程的已经打开的管道, 那么需要在调用此函数之前调用 fclose() 函数来关闭管道, 否则会引发死锁 - 在管道处于打开状态时,子进程将不能退出。
			返回值:
				返回进程的终止状态码。 如果发生错误,将返回 -1。

		bool proc_nice ( int $increment )
			修改当前进程的优先级, 修改量由 increment 参数指定。 increment 为正数会降低当前进程优先级, 反之,为负数会提高优先级。
			警告:
				1.proc_nice() 和 proc_open() 函数以及和 proc_open() 相关的函数并无什么关系。
				2.发现没:这里并未传递 'resource $process',这里调整当前进程的优先级!而非我们通过 'proc_open()' 打开的进程!这就导致,我们可能针对的是 pcntl&posix 扩展使用!


		bool proc_terminate ( resource $process [, int $signal = 15 ] )
			1.向 process (由 proc_open() 函数创建) 发送信号通知其终止。 proc_terminate() 调用之后将会立即返回, 而不会等待进程终止。
			2.可以使用 proc_terminate() 终止进程 并且继续其他的任务。 可以使用 proc_get_status() 函数来检查进程是否已经终止。
			参数:
				$process - 由 proc_open() 打开的 resource。
				$signal - 可选参数,仅用于 POSIX 操作系统。 表示调用系统命令 kill(2) 来向进程发送的信号。 默认值为 SIGTERM。
			警告:
				该函数有一个严重的bug。会终止当前的进程,但是并不会中止当前进程的子进程!(可能就是所谓的僵尸进程)
				可查看手册上:http://php.net/manual/zh/function.proc-terminate.php。有其它人给的解决方案,这里就不摘抄了。

		array proc_get_status ( resource $process )
			获取由 proc_open() 函数打开的进程的信息。
			参数:
				$process - 要检查的由 proc_open() 打开的进程 resource。
			返回值:
				如果调用成功,则返回一个包含了进程信息的 array,如果发生错误,返回 FALSE。 返回的数组包含下列元素:
					元素			类型			描述
					command		string		传入 proc_open() 函数的命令行字符串。
					pid			int			进程 ID
					running		bool		TRUE 表示进程还在运行中, FALSE 表示进程已经终止
					signaled	bool		TRUE 表示子进程被未捕获的信号所终止。 在 Windows 平台永远为 FALSE。
					stopped		bool		TRUE 表示子进程被信号停止。 在 Windows 平台永远为 FALSE。
					exitcode	int			进程的退出码(仅在 running 为 FALSE 时有意义)。 仅在第一次调用此函数时会返回实际的值, 后续的调用将返回 -1。
					termsig		int			导致子进程终止执行的信号值 (仅在 signaled 为 TRUE 时有意义)。
					stopsig		int			导致子进程停止执行的信号值 (仅在 stopped 为 TRUE 时有意义)。

		示例:
			<?php
				$descriptorspec = array(
				   0 => array("pipe", "r"),  // 标准输入,子进程从此管道中读取数据
				   1 => array("pipe", "w"),  // 标准输出,子进程向此管道中写入数据
				   2 => array("file", "/tmp/error-output.txt", "a") // 标准错误,写入到一个文件
				);

				$cwd = '/tmp';
				$env = array('some_option' => 'aeiou');

				$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);		// 1.proc_open()

				if (is_resource($process)) {
				    // $pipes 现在看起来是这样的:
				    // 0 => 可以向子进程标准输入写入的句柄
				    // 1 => 可以从子进程标准输出读取的句柄
				    // 错误输出将被追加到文件 /tmp/error-output.txt

				    fwrite($pipes[0], '<?php print_r($_ENV); ?>');
				    fclose($pipes[0]);		// 2.在 proc_close() 前,关闭所有pipe管道

				    echo stream_get_contents($pipes[1]);
				    fclose($pipes[1]);		// 2.在 proc_close() 前,关闭所有pipe管道
				    

				    // 切记:在调用 proc_close 之前关闭所有的管道以避免死锁。
				    $return_value = proc_close($process);		// 3.proc_close()

				    echo "command returned $return_value\n";
				}
			?>
		输出:
			Array
			(
			    [some_option] => aeiou
			    [PWD] => /tmp
			    [SHLVL] => 1
			    [_] => /usr/local/bin/php
			)
			command returned 0

	与proc_open()类似的函数有:
		popen() - 打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。返回一个和 fopen() 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose() 来关闭。
		fopen() - 打开文件或者 URL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值