PHP触发脚本异步执行


在PHP中执行一些脚本的时,并不需要等待执行结果的返回,而且有些脚本可能执行时间较长,会导致PHP的请求变慢,这种情况我们要怎么处理呢?

我们先来了解一下可使用的函数

【shell_exec()】

    通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

    也就是说, PHP先运行一个shell环境, 然后让shell进程运行你的命令, 并且把所有输出已字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回null.


【exec()】

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

    与 shell_exec() 不一样, exec不会创建shell进程, 可以理解是php进程直接创建一个子进程, 运行指定的命令, 返回值只返回命令的最后一行, 所有的返回已参数形式返回, 上面的 $output, 进程的退出代码以另外一个参数变量返回, 上面的 $return_var


【passthru()】

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

    与 exec() 类似, 唯一不同的是, 命令的所有输出返回内容都不再导入到 PHP 环境, 而是直接作为输出内容, 返回到浏览器的输出上, 等效是把所有返回内容直接 echo 输出.


【system()】

    这个方法和 passthru() 类似, 但是 system() 方法会在程序的每行输出的时候执行一次缓存输出动作, 可以理解为, 只要外部程序输出一行, php 就会马上把内容推送到浏览器, 无论这个内容是否足够大. php通常为了输出效率, 都会有一个输出缓存, 会等到输出内容足够大之后, 再一次输出返回. system() 方法则强制输出内容立刻推送, 即使输出的内容只有一个字母. 如果客户端具有实时打印服务器的返回 http 内容流的能力, 就可以看到 system() 的实时推送效果.


通过这些函数,我们可以在服务器上执行一些脚本,但是这些函数都需要同步等待执行结果。现在回到问题上,我们只想触发这个脚本,并不想关注实际的执行结果要怎么实现呢?其实是很简单的,只需要在执行的脚本后面加个参数即可:

>/dev/null 2>&1

例如:我们需要执行/tmp/resume.sh这个脚本

/tmp/resume.sh >/dev/null 2>&1

或者:

/tmp/resume.sh >/dev/null 2>/dev/null &

还可以:

/tmp/resume.sh &>/dev/null &


上一篇 下一篇

评论

登录后可发表评论